🔎

既存で運用する AWS Fargate で ECS Exec 機能を有効にしてコンテナアクセスするまでの手順

2021/04/14に公開

前提

すでに Fargate 使って運用してるサービスがあることが前提です。

新規でサービスを作る場合は AWS 公式ブログにある Amazon ECS Exec による AWS Fargate, Amazon EC2 上のコンテナへのアクセス が非常に参考になります。

また、 AWS CLI を使う必要があります。以下 バージョン1 or 2 の最新版を使います。

AWS CLI のインストール、更新、アンインストール - AWS Command Line Interface

ECS Exec を動かすまでの準備

ECS タスクロールのポリシー設定

ECS タスクロールに以下 IAM ポリシーをアタッチします。

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

既存で IAM ロールを使っていれば、そのロールに↑を追加しましょう。
ロール使ってなければ以下を参考に定義してください。

タスク用の IAM ロール - Amazon Elastic Container Service

既存のサービスで ECS Exec の機能を有効にする

こちらは AWS CLI で 実行します。

$ aws ecs update-service \
    --cluster example-cluster \
    --service example-service \
    --enable-execute-command

既存のサービスに ECS Exec のオプションだけ追加したければ、↑の通り --enable-execute-command のオプションを付与します。

CLI の結果 "enableExecuteCommand": true となっていれば OK です。

{
    "service": {
        "serviceArn": "arn:aws:ecs:us-west-2:XXXXX:service/xxx",
        "serviceName": "xxx",

...skipping...
        "enableExecuteCommand": true
    }
}

上記変更を確認後、既存サービスの運用方法に従いタスクを起動します。
AWS ドキュメントであれば以下を参考に。

Amazon ECS タスクのスケジューリング - Amazon Elastic Container Service

ECS Exec を使って Fargate コンテナに入る

以下の execute-command を実行します。

$ aws ecs execute-command \
    --cluster example-clustr \
    --task XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX \
    --container xxx \
    --interactive \
    --command "/bin/sh"

ECS のタスクで複数コンテナを使用している場合は、どのコンテナに入るかを --container オプションでコンテナ名指定します。

以下のような表示が出てれば成功です。

The Session Manager plugin was installed successfully. Use the AWS CLI to start a session.

Starting session with SessionId: ecs-execute-command-XXXXXXXXXXXXXXXXX
/ #

後始末

コンテナ入る必要が無くなれば、以下のコマンドで ECS Exec 機能を無効にできます。

$ aws ecs update-service \
    --cluster example-cluster \
    --service example-service \
    --disable-execute-command
{
    "service": {
        "serviceArn": "arn:aws:ecs:us-west-2:XXXXX:service/xxx",
        "serviceName": "xxx",

...skipping...
        "enableExecuteCommand": false
    }
}

"enableExecuteCommand": false になっていれば ECS Exec 機能が無効になったとみなせます。

参考

Discussion