ECS ExecでFargateにログインしてコマンドを実行する

2021年6月18日

Amazon ECS

2021年3月15日に Amazon ECS Exec という機能が公開されました。この機能を使うと、Fargate タスクのコンテナにログインしてコマンドを実行することができるようになります。docker exec コマンドのようなイメージです。踏み台サーバも SSH の鍵の管理も不要です。個人的には神アップデートでした。

目次

  1. 前提条件を確認する
  2. Session Manager プラグインをインストール
  3. ECS タスクロールを設定する
  4. ECS タスク定義のコンテナ定義で initProcessEnabled を設定
  5. AWS CLI の ecs execute-command を実行
  6. うまくいかないときは
  7. コンテナにアクセスできるアカウントを制限する

前提条件を確認する

デバッグに Amazon ECS Exec を使用する - Amazon ECS に詳しく書かれています。要点をまとめると

  • Fargate プラットフォームバージョン 1.4.0 前提
  • クライアントに AWS CLI の Session Manager プラグインが必要
  • IAM で SSM などの権限設定が必要
  • Service とタスクの作り直しが必要

となります。Fargate PV 1.4.0 の裏で System Manager が動いていそうですね。

Session Manager プラグインをインストール

AWS CLI 用の Session Manager プラグインをインストールする - AWS Systems Manager を参考に、作業用マシンに Session Manager プラグインをインストールします。

ECS タスクロールを設定する

ECS Exec に必要な IAM アクセス許可 を参考に ECS タスク定義のタスクロールを設定します。

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

ECS タスク定義のコンテナ定義で initProcessEnabled を設定

オプションのタスク定義の変更 を参考にタスク定義で containerDefinitions の中にある initProcessEnabled を true に設定します。2021年6月時点では、AWS のマネージドコンソールの GUI の画面からは設定ができず、タスク定義の画面の下のほうにある「JSON による設定」のボタンから設定をする必要があります。デフォルトは null だったので、明示的に指定をする必要があります。

{
    "family": "task-name",
    ...
    "containerDefinitions": [
        {
            ...
            "linuxParameters": {
                "initProcessEnabled": true
            }
        }
    ],
    ...
}

ECS サービス作成時に ECS Exec フラグを有効化

タスクとサービスに対する ECS Exec の有効化 を参考に ECS サービス作成時に --enable-execute-commandフラグを指定します。2021年6月時点では、AWS のマネージドコンソールの GUI の画面からは設定ができず、初期値も false だったので、AWS CLI、CloudFormation、Terraform などからサービスを作成する必要があります。

aws ecs create-service \
    --cluster cluster-name \
    --task-definition task-definition-name \
    --enable-execute-command \
    --service-name service-name
    --desired-count 1

Fargate プラットフォームのバージョンは 1.4.0 である必要があります。2021 年 6 月現在はプラットフォームバージョンの初期値 LATEST が 1.4.0 なので、特にバージョンを指定せずサービスを作成しても大丈夫です。

AWS CLI 用の IAM ポリシーを設定する

この後 AWS CLI の aws ecs execute-commandを実行してコンテナにログインします。AWS CLI 用のユーザに以下の IAM ポリシーを設定します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ecs:ExecuteCommand",
                "ssm:StartSession",
                "ecs:DescribeTasks"
            ],
            "Resource": "*"
        }
    ]
}

AWS CLI の ecs execute-command を実行

ECS Exec を使用するコマンドの実行 を参考に AWS CLI コマンドを実行してコンテナにログインします。

aws ecs execute-command --cluster cluster-name \
    --task task-id \
    --container container-name \
    --interactive \
    --command "/bin/sh"

うまくいかないときは

aws-containers/amazon-ecs-exec-checker を使って設定不備をチェックできます。

また Fargate タスク起動直後は、設定に問題がなくても接続ができないことがあるので、少し待ってから試してみてください。

コンテナにアクセスできるアカウントを制限する

IAM ポリシーを使用して ECS Exec へのアクセスを制限する を参考に AWS CLI を実行する IAM ユーザのポリシーを設定することで、コンテナへのアクセスを制限することができます。

以下の IAM ポリシーでは、ユーザーはcluster-name というクラスターで、タグのキーにenvironment 値に development が設定されているタスクのコンテナのみ、コマンドを実行できます。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "ecs:ExecuteCommand",
            "Resource": "arn:aws:ecs:region:aws-account-id:task/cluster-name/*",
            "Condition": {
                "StringEquals": {
                    "ecs:ResourceTag/environment": "development"
                }
            }
        }
    ]
}

-技術ブログ
-