弊社で請け負うシステム開発ではECSを利用してアプリケーション構築するパターンが多いのですが、ECSタスクにログインして任意のコマンドを実行したい場合があります、例えばリリース前に初期データ投入プログラムを実行する場合などです。
本記事ではECS ExcecをCloud Shellから実行してECSタスクにログインする方法を書きたいと思います。
事前準備
まずは事前準備としていくつか設定する必要があります、むしろメインがこの「事前準備」です。
ECSタスクロールにIAM Policyを追加
ECSタスクの「タスクロール」には追加でSessionManager関連のPolicyが必要で下記を追加設定します。「タスク実行ロール」ではないことに注意してください。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ssmmessages:CreateControlChannel",
"ssmmessages:CreateDataChannel",
"ssmmessages:OpenControlChannel",
"ssmmessages:OpenDataChannel"
],
"Resource": "*"
}
]
}ECS ExecをONにする
ECS ExecがONになっているか確認するためにはawsコマンドで確かめる必要があります。
そこでCloudShellでawsコマンド実行するんですが、CloudShellはAWSコンソールの右上の下記アイコンをクリックします。

するとCLIが立ち上がるので、ここでawsコマンドを打っていきます。
変数に各種IDをセットしておく
まずオススメなのが変数にECSサービスIDやECSタスクIDなどの値を設定しておくことで、後続のawsコマンドをスッキリ簡単に実行することができます。下記はそのコマンド例で変数に各種IDを設定しておきます。
cluster=sample-app-cluster
service=sample-app-service
task=123ab456def789ghi123ab456def789ghi
container=apacheECSサービスがECS ExecがONなっていることを確認する
次にログイン対象のECSサービスのECS ExecがONになっているか確認します
aws ecs describe-services \
--cluster $cluster \
--services $service \
--query 'services[0].enableExecuteCommand'結果が false の場合はOFFになっています。
ECSサービスのECS ExecをONにする
下記コマンドでONできます
aws ecs update-service \
--cluster $cluster \
--service $service \
--enable-execute-commandECSタスクのECS ExecをONにする
ECSサービスのECS ExecをOFFからONにした場合、配下のECSタスクを新しく起動しなおす必要があります。そうすることで新しく起動したECSタスクもenableExecuteCommandがtrueとなります。
ECSタスクがONになったか確認するコマンドは下記です。
aws ecs describe-tasks \
--cluster $cluster \
--tasks $task \
--query 'tasks[0].enableExecuteCommand'ECSタスクにログインする
事前準備が終わればあとは簡単で、CloudShellで下記コマンドを打つだけです。
aws ecs execute-command --cluster $cluster --task $task --container $container --interactive --command "bash"エラーが出る場合
事前準備をしてもエラーになるケースがあります、その場合はAWS公式でも紹介されているECS Exec Checkerを使います。
使い方はローカルで下記の手順で実行します、すると何が原因でエラーになっているか調査することができます。
# ソースコードをClone
git clone git@github.com:aws-containers/amazon-ecs-exec-checker.git
cd amazon-ecs-exec-checker
# AWSにログイン
aws configure
# チェック
./check-ecs-exec.sh <YOUR_ECS_CLUSTER_NAME> <YOUR_ECS_TASK_ID>


