はじめに
トラブルシューティングなどで、ECS Fargate のコンテナーに入ってコマンドを実行する手順です
コンテナーの実行環境が EC2 であれば、普通に SSH でログインして、docker exec
すればよいのですが、Fargate の場合はこれが使えません
ECS Exec + AWS Systems Manager(SSM)を使うと、Fargate 内のコンテナーでも exec できるようになります
事前準備
macOS で作業しています
ECS タスクロールの作成
ロールを作成したら、ロールの信頼関係を以下に設定
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "ecs-tasks.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
ロールに以下のポリシーをアタッチ
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ssmmessages:CreateControlChannel", "ssmmessages:CreateDataChannel", "ssmmessages:OpenControlChannel", "ssmmessages:OpenDataChannel" ], "Resource": "*" } ] }
ECS のサービスを更新
aws ecs update-service --service <value> --cluster <value> --enable-execute-command
もし、サービスを新規作成する場合は、aws ecs create-service
コマンドに--enable-execute-command
オプションを付与して実行する
実行中の ECS タスクを停止し、新しいタスクを起動させる(enableExecuteCommand が有効になる)
以下のコマンドで enableExecuteCommand オプションが有効になっているか確認できる
aws ecs describe-tasks --cluster <value> --task <value> | grep enableExecuteCommand
Session Manager plugin をインストール
brew install --cask session-manager-plugin
コンテナーに exec する
aws ecs execute-command --cluster <value> --task <value> --container <value> --interactive --command "/bin/sh"
さいごに
作業が終わったら、ECS Exec は無効にしておきましょう
aws ecs update-service --service <value> --cluster <value> --disable-execute-command