ECS(Fargate)を使用していると、コンテナの中に入って操作をしたくなることがあると思いますが、昔はコンテナに入ること自体ができなかったそうです。
そこでECS Execという機能が登場し、コンテナにawsコマンドで接続できるようになりました(2021年3月に発表)
マネジメントコンソールではECS Execの有効化に対応しておらず、いくつか手順が必要なので流れをまとめてみました。
必要な手順は以下の通りです。
- タスク定義のオプション追加
- サービスのECS Exec有効化
- IAMロールにSSM Session Managerのポリシー追加
- タスク定義にタスクロールを追加
- Fargateのコンテナに接続する
前提
- タスク・サービス作成時に有効化するのが楽かもしれません
- 私はすでにタスクとサービスを作成済みなので、作成後のECS Exec有効化の手順をまとめます
タスク定義のオプション追加
ECS Execのドキュメントによると、
タスク定義パラメータ initProcessEnabled を true に設定すると、コンテナ内で init プロセスが開始されます。この結果、見つかったゾンビ SSM エージェントの子プロセスはすべて削除されます。
とのことで、無駄にプロセスを残さないための設定のようです。ECS Execを使うに当たり設定必須ではないですが、特に長時間動作するようなコンテナでは設定しておいた方がいいと思います。
私はすでにタスク定義がJSON形式で管理されていたので、そこに以下のオプションを追加しました。
コンソールマネジメントで追加する場合も「JSONを使用した新しいリビジョンを作成」から追加できると思います。
"containerDefinitions": [
{
"linuxParameters": {
"initProcessEnabled": true
}
}
]
サービスのECS Exec有効化
タスク定義のJSONがあれば、以下を追加します。
"enableExecuteCommand": true
あるいは、以下のコマンドでもいけます。
タスクの再起動まで必要なので、--force-new-deployment
します。
aws ecs update-service \
--cluster \
--service \
--enable-execute-command \
--force-new-deployment
有効化できていること自体はコンソールマネジメントから確認できますので、実行中のタスクの設定を見てみてください。
IAMロールにSSMのポリシー追加
ECS Execのドキュメントによると、
ECS Exec は、AWS Systems Manager (SSM) セッションマネージャーを使用して実行中のコンテナとの接続を確立し、
とのことで、ECSのロールにSSMのSession Managerの権限を付ける必要があります。
ポリシーの付与が必要なのは、実行中のタスクが使用するTask Role
です。
私は以下で設定しました。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ssmmessages:CreateControlChannel",
"ssmmessages:CreateDataChannel",
"ssmmessages:OpenControlChannel",
"ssmmessages:OpenDataChannel"
],
"Resource": "*"
}
]
}
- Session Managerを使うに当たって、プラグインのインストールが必要です
- CloudShellでは、必要となるコマンドを打つと自動的にインストールしてくれました
タスク定義でタスクロールを指定
作成したタスクロールをタスク定義で指定する必要があります。これはJSONでも、コンソールマネジメントでも設定できます。
「タスク実行ロール」ではなく、「タスクロール」なので要注意です。
{
"taskRoleArn": "arn:aws:iam::your-account:role/ecsTaskRole",
}
コンテナに接続
Dockerを使って開発をされている方ならおなじみのdocker exec -it /bin/bash
のように接続するイメージですね。
コマンドは、以下の通りです。
aws ecs execute-command --cluster \
--task \
--container \
--interactive \
--command "/bin/bash"
タスクARNは、タスク定義ではなく実行中タスクのARNです。
参考資料
Views: 0