ECS exec 利用手順


本記事は、AWS ECS on Fargateへ ECS execを利用してシェルログインを行う手順を記載する。

ECS execについて

ECS execは、ECSクラスター上で起動している ECSインスタンス / Fargate に対してコンテナ内でコマンドを実行したり、シェルを取得する事が出来る機能。

前提条件

  • ECS Exec は対象が Linux コンテナでのみサポートされる。
  • AWS Management Console からの実行は不可能でAWS CLI から行う必要がある。 また、AWS CLI バージョン 1.19.28 以上 または バージョン 2.1.31 以上でないと、コマンドが実行できないため注意が必要。
  • Systems Manager の Session Managerを利用して、実行中のコンテナとの接続を確立するため、インターフェイス Amazon VPC エンドポイントを作成する必要がある。
  • EC2にて利用する場合、2021年 1月 20日以降にリリースされた Amazon ECS 最適化済みの AMI 、エージェントバージョン 1.50.2 以上で使用する必要がある。 Fargateにて利用する場合は、プラットフォームバージョン 1.4.0 以上を使用する必要がある。

手順

IAMロール

ECS Exec を使用するためには、ECSタスクロールに SSMエージェントとSSMサービス間の通信に必要な権限をコンテナに付与する必要がある。
ECS Exec で使用するコンテナのタスクロールに、以下の IAM ポリシーを追加する。

{
   "Version": "2012-10-17",
   "Statement": [
       {
       "Effect": "Allow",
       "Action": [
            "ssmmessages:CreateControlChannel",
            "ssmmessages:CreateDataChannel",
            "ssmmessages:OpenControlChannel",
            "ssmmessages:OpenDataChannel"
       ],
      "Resource": "*"
      }
   ]
}

ECS on Fargate

ECS クラスター / サービス / タスク定義は既に作成している前提

既に使用しているタスクに対して ECS Execを有効する事は出来ない。
そのため、サービスに設定されている "enableExecuteCommand" という ECS Execを有効にする設定の変更を行う必要がある。
enableExecuteCommandはデフォルトで falseとなっている。

aws ecs describe-services --cluster <cluster-name> --service <service-name>

サービスの更新を行い、 enableExecuteCommandを tureに変更する。

aws ecs update-service --cluster <cluster-name> --service <service-name> --enable-execute-command 

enableExecuteCommandが trueになっている状態から起動をしないとタスクは有効にならない。

aws ecs describe-tasks --cluster <cluster-name> --tasks <task-ID>

サービスが更新された状態でタスクを起動して、enableExecuteCommandが有効になっているか確認する。

この状態で ECS Execが使用可能となるため、ecs execute-commandを実行してシェルログインを行う。
ecs execute-commandでは --interactive / --commandオプションが必須であり、 --commandでは、コンテナで実行するコマンドを指定する。

aws ecs execute-command --cluster <cluster-name> --task <task-ID> --container <container-name> --command "<command>" --interactive

コンテナに対してシェルログインを行う場合は、 --command "/bin/bash" を指定して、実行すると、セッションがスタートし、ログインが可能となる。