概要
AWS ECS は何かと難しい。特に厄介なのはコンテナの中に入るのが難しいので、デバッグがしにくいという点だ。ECS Exec という機能を使えばコンテナの中に入ることができることが確認できたので、備忘録的に書き残しておく(いつもググって他の人の記事にばかりお世話になっているのでたまには少し恩返し……)。
とはいえ、良い記事を書いている人たちがすでに大勢いるので、まずはすごく参考になった記事を紹介する。
とりあえず上の記事を読めば ECS Exec はできるようになるとは思う。ただ、私は私の経験に基づいて少し書いてみる。
感想を言えば、「ECS Exec は1回目は少し大変だが、2回目以降は楽になりそう」という感想。1回目だけ準備しなければならないものがあるからだ。
初回のみ必要なもの:
- ECS Exec の仕組みに対する理解
- AWS CLI のインストール
- Session Manager plugin for the AWS CLI のインストール
- ECS Exec 利用に必要な権限をまとめた IAM Policy の作成
ECSサービスを作るたび必要なもの
- ECS タスク定義で上記 IAM Policy をアタッチしたタスクロール(タスク定義ロールではない)を設定
- ECS サービスで ECS Exec を有効化
こんな感じだ。
初回のみ必要なもの
ECS Exec の仕組み, AWS CLI, Session Manager Plugin for the AWS CLI のインストールはググって調べてほしい。
ECS Exec 利用に必要な権限をまとめた IAM Policy の作成
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ssmmessages:CreateControlChannel",
"ssmmessages:CreateDataChannel",
"ssmmessages:OpenControlChannel",
"ssmmessages:OpenDataChannel"
],
"Resource": "*"
}
]
}
こんな感じの Policy を作って、適当な名前で保存しておく。
ECSサービスを作るたび必要なもの
ECS タスク定義で上記 IAM Policy をアタッチしたタスクロール(タスク定義ロールではない)を設定
タスクロール用のロールを作る。そして上記 IAM Policy をアタッチ。ECS タスク定義でそのロールをタスクロールとして登録しておく。
ECS サービスで ECS Exec を有効化
aws ecs update-service --cluster (クラスター名) --service (サービス名) --enable-execute-command
ECSサービスは更新して「デプロイオプション-新しいデプロイの強制」でデプロイしなおす(=タスクを再起動する)。
確認しておくのが重要。
aws ecs describe-services --cluster (クラスター名) --services (サービス名) | grep enableExecuteCommand
aws ecs describe-services --cluster (クラスター名) --tasks (タスクID) | grep enableExecuteCommand
などとして、
enableExecuteCommand: true
となっていればOK。タスクIDのところは単に16進数の長い文字列(例 53fb...
)でもよいし、ARN(arn:aws:ecs:...
) でも良いようだ。
接続
aws ecs execute-command --cluster (クラスター名) --task (タスクID) --container (コンテナ名) --interactive --command "/bin/bash"
これでコンテナの中に入れる。
その他のtips
ECSがうまく動いていないときはそもそもヘルスチェックに失敗していることがある。デバッグして原因を調べたいのにヘルスチェックに失敗してECSがコンテナを停止し続けるとやりにくいので、ヘルスチェックを一時的に止めるのも良いかもしれない。
そういうとき、私はタスク定義の「HealthCheckオプション - コマンド」で CMD-SHELL, true
として必ずヘルスチェックに成功するようにしている。