猫でもわかるWebプログラミングと副業

本業エンジニアリングマネージャー。副業Webエンジニア。Web開発のヒントや、副業、日常生活のことを書きます。

AWS CDK で ECS Exec を有効にしてコンテナのシェルに接続する

はじめに

ECS Exec を使うと、コンテナのシェルに接続できるので(docker exec ができる。SSH みたいな感じ)、AWS ECS を使っているときのデバッグに便利。

今回は、 AWS CDK の ApplicationLoadBalancedFargateService を使って ECS を構築していたのですが、その場合に ECS Exec を有効にする方法をまとめます。

ECS Exec が有効になっているかどうか確認する方法

AWS CLI の aws ecs describe-tasks コマンドを使うと、ECS Exec が有効になっているかどうかわかります。

# ECS task の状態が json 形式で出力される
# enableExecuteCommand の値が true の場合、 ECS Exec が有効になっている
# 実行例:
aws ecs describe-tasks --cluster=your-cluster-name --task=394cc1d3d2d74f8594b7570ad8fc7ffb

# 結果がでかいので grep すると良い
aws ecs describe-tasks --cluster=your-cluster-name --task=394cc1d3d2d74f8594b7570ad8fc7ffb | grep enableExecuteCommand

ECS Exec の有効化

AWS CDK の修正

ECS Exec はデフォルトで無効化されています。

ApplicationLoadBalancedFargateService のプロパティに、enableExecuteCommand というものがあるので、これを true にします。

    const ecsService = new ApplicationLoadBalancedFargateService(this, "sample-ecs-service", {

      ...

      enableExecuteCommand: true,
    });

タスクを再起動

enableExecuteCommand を true にすると、次に実行されたタスクから AWS Exec が有効になります。そこで、タスクを再起動させて上げる必要があります。

タスクを止めて問題なければ、 AWS コンソール上からタスクを停止させて、タスクが再起動してくるのを待ちます。止めたくない場合は、デプロイを実行すれば大丈夫です。

タスクを再起動後、改めて describe-tasks コマンドを実行し、 enableExecuteCommand が true になっていることを確認します。

AWS Exec 実行例

aws ecs execute-command --interactive --cluster=your-cluster-name --task=7482ef940c944042aea6fb7ae0d842f7 --container=接続したいコンテナ --command /bin/bash

参考

dev.classmethod.jp

www.utakata.work