ECS Execとは
今までFargateで動いているコンテナの中に入りたい場合、AWS System managerを使ってアクティベートコードを取得して、Dockerfileに書いてなどをする必要があった。ちょっとめんどくさい。
https://qiita.com/pocari/items/3f3d77c80893f9f1e132
それを簡単に出来るようになったのがECS Execということみたい。
docker execコマンドみたいな感じ。つまりコンテナの中に入れる。
https://aws.amazon.com/jp/blogs/news/new-using-amazon-ecs-exec-access-your-containers-fargate-ec2/
ECS Execを使うには
こちらが参考になりました!ありがとうございます。
ざっくりまとめると、
- ECSタスクロールの作成
- enableExecuteCommandを有効化(タスク起動時)
- AWS CLIを実行するアカウントにexecute-commandを実行できるIAMポリシーを付ける
- AWS CLI 用の Session Manager プラグインをインストールする
- AWS CLIの2.1.31以降のバージョンを使う
- ssmmessagesのVPCエンドポイント(プライベートリンク)を作る ←ここでハマった
ハマったポイント
ECSタスクロールを作ったり、AWS CLIにSession Manager プラグインを入れるのは問題なかったのですが、
aws ecs execute-command --cluster [クラスター名] \
--task [タスクID] \
--container [コンテナ名] \
--interactive \
--command "/bin/sh"
としても一向に入れない。。
An error occurred (TargetNotConnectedException) when calling the ExecuteCommand operation: The execute command failed due to an internal error. Try again later.
TargetNotConnectedException
と怒られる。。色々設定変えたり試行錯誤するも変わらず。。
aws ecs describe-tasks \
--cluster [クラスター名] \
--tasks [タスクID]
と打って状態を確認すると、
...
"managedAgents": [
{
"lastStartedAt": "2021-08-02T10:24:54.476000+09:00",
"name": "ExecuteCommandAgent",
"lastStatus": "RUNNING"
}
],
...
"enableExecuteCommand": true,
...
どうやらエージェントはしっかり動いている様子。じゃあなぜ入れないのだ。。
詰まったらこれ使おう Amazon ECS Exec Checker
公式の英語ドキュメント で見つけたのですが、Amazon ECS Exec Checkerというものがあるらしい。
# git cloneする
git clone https://github.com/aws-containers/amazon-ecs-exec-checker.git
# jqコマンド入れる(入ってる人は不要)
brew install jq
./check-ecs-exec.sh [クラスター名] [タスクID]
これで設定が間違っているところないかチェックしてくれます。便利。
そうするとヒントが見えてきました。
SSM PrivateLink "com.amazonaws.ap-northeast-1.ssmmessages" not found. You must ensure your task has proper outbound internet connectivity.
ssmmessagesのVPCエンドポイント(プライベートリンク)が見つからないと言っている。
おや?これか?
ssmのVPCエンドポイント(プライベートリンク)は作ってあったので、完全に盲点でした。
試しにssmmessagesのVPCエンドポイント(プライベートリンク)を作る。
再度実行すると、コンテナに入れました!
ssmmessagesのVPCエンドポイント(プライベートリンク)も必須なんですね。
Fargateは難しいと思いつつ、また一つ勉強になりました。