7
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AWS ECS Execを有効化して、Fargateに接続する手順

Posted at

ECS(Fargate)を使用していると、コンテナの中に入って操作をしたくなることがあると思いますが、昔はコンテナに入ること自体ができなかったそうです。

そこでECS Execという機能が登場し、コンテナにawsコマンドで接続できるようになりました(2021年3月に発表)

マネジメントコンソールではECS Execの有効化に対応しておらず、いくつか手順が必要なので流れをまとめてみました。

必要な手順は以下の通りです。

  1. タスク定義のオプション追加
  2. サービスのECS Exec有効化
  3. IAMロールにSSM Session Managerのポリシー追加
  4. タスク定義にタスクロールを追加
  5. Fargateのコンテナに接続する

前提

  • タスク・サービス作成時に有効化するのが楽かもしれません
  • 私はすでにタスクとサービスを作成済みなので、作成後のECS Exec有効化の手順をまとめます

タスク定義のオプション追加

ECS Execのドキュメントによると、

タスク定義パラメータ initProcessEnabled を true に設定すると、コンテナ内で init プロセスが開始されます。この結果、見つかったゾンビ SSM エージェントの子プロセスはすべて削除されます。

とのことで、無駄にプロセスを残さないための設定のようです。ECS Execを使うに当たり設定必須ではないですが、特に長時間動作するようなコンテナでは設定しておいた方がいいと思います。

私はすでにタスク定義がJSON形式で管理されていたので、そこに以下のオプションを追加しました。

コンソールマネジメントで追加する場合も「JSONを使用した新しいリビジョンを作成」から追加できると思います。

"containerDefinitions": [
    {
        "linuxParameters": {
            "initProcessEnabled": true
        }
    }
]

サービスのECS Exec有効化

タスク定義のJSONがあれば、以下を追加します。

"enableExecuteCommand": true

あるいは、以下のコマンドでもいけます。
タスクの再起動まで必要なので、--force-new-deploymentします。

aws ecs update-service \
    --cluster <クラスター名> \
    --service <サービス名> \
    --enable-execute-command \
    --force-new-deployment

有効化できていること自体はコンソールマネジメントから確認できますので、実行中のタスクの設定を見てみてください。
image.png

IAMロールにSSMのポリシー追加

ECS Execのドキュメントによると、

ECS Exec は、AWS Systems Manager (SSM) セッションマネージャーを使用して実行中のコンテナとの接続を確立し、

とのことで、ECSのロールにSSMのSession Managerの権限を付ける必要があります。
ポリシーの付与が必要なのは、実行中のタスクが使用するTask Roleです。

私は以下で設定しました。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ssmmessages:CreateControlChannel",
                "ssmmessages:CreateDataChannel",
                "ssmmessages:OpenControlChannel",
                "ssmmessages:OpenDataChannel"
            ],
            "Resource": "*"
        }
    ]
}
  • Session Managerを使うに当たって、プラグインのインストールが必要です
  • CloudShellでは、必要となるコマンドを打つと自動的にインストールしてくれました

タスク定義でタスクロールを指定

作成したタスクロールをタスク定義で指定する必要があります。これはJSONでも、コンソールマネジメントでも設定できます。

「タスク実行ロール」ではなく、「タスクロール」なので要注意です。

{
    "taskRoleArn": "arn:aws:iam::your-account:role/ecsTaskRole",
}

コンテナに接続

Dockerを使って開発をされている方ならおなじみのdocker exec -it <コンテナ名> /bin/bashのように接続するイメージですね。

コマンドは、以下の通りです。

aws ecs execute-command --cluster <クラスター名> \
    --task <タスクARN> \
    --container <コンテナ名> \
    --interactive \
    --command "/bin/bash"

タスクARNは、タスク定義ではなく実行中タスクのARNです。

参考資料

7
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?