汗ばむほど暖かくなったと思ったら急に寒い日が続くので冬物と春物をミックスした奇妙ないでたちで出社しております。
株式会社クレアヴォイアンスでは主にインフラ回りを担当しております。
ECS Fargateにコンテナをデプロイするテストをしている時、コンテナ内でデバッグや追加の作業を行いたい場面がありました。
環境
- ECS Fagate。EC2でもいいらしいですが試してないです
- AWS CLIはインストール済み
- クラスターのサービスを作成/起動したときと同じユーザでの操作(なので足りない権限等でてくるかも)
- Windows の WSL 上の Ubuntuで作業してます
接続の条件
- ECS Execが有効
- タスクロールにIAM 権限がある
- エンドポイントが存在する
準備開始
Session Manager プラグインをインストール
以下wsl上での作業です
$ curl "https://s3.amazonaws.com/session-manager-downloads/plugin/latest/ubuntu_64bit/session-manager-plugin.deb" -o "session-manager-plugin.deb"
$ sudo apt install ./session-manager-plugin.deb
$ session-manager-plugin
#成功していれば下記応答
The Session Manager plugin was installed successfully. Use the AWS CLI to start a session.
ECS Exec を有効にする
タスクのECS Execが有効になっているか確認します。デフォルトでfalseだそうなので
なにもしてなければ多分false(無効)です。
$ aws ecs describe-services --cluster <cluster-name> --service <service-name>
# こんな感じの応答があって
"propagateTags": "NONE",
"enableExecuteCommand": false, // こいつをtrueにする
"availabilityZoneRebalancing": "ENABLED"
有効にします。
$ aws ecs update-service --cluster <cluster-name> --service <service-name> --enable-execute-command
有効にしたあとサービスを更新しなきゃだめです。
aws ecs update-service \
--cluster <cluster-name> \
--service <service-name> \
--force-new-deployment
タスクが起動するのをまって、ECS Execが有効になっているか確認しましょう。
IAM権限の確認
コンテナのタスクロールに必要な権限はこれです。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ssmmessages:CreateControlChannel",
"ssmmessages:CreateDataChannel",
"ssmmessages:OpenControlChannel",
"ssmmessages:OpenDataChannel"
],
"Resource": "*"
}
]
}
私は面倒だったので「AmazonSSMManagedInstanceCore」ポリシーをアタッチしました(テスト環境だだし)。
エンドポイントの設定
VPC>エンドポイントからタスクが実行されているVPCにエンドポイントを追加します。
↓の二つがあればOK。ECS構築に作成した他のエンドポイントと同様にセキュリティグループ、サブネットを選択すれば問題ないはず。
com.amazonaws.ap-northeast-1.ssm
com.amazonaws.ap-northeast-1.ssmmessages
#タスクに入る
起動中のタスクからタスクIDを取得します
$ aws ecs list-tasks --cluster <cluster-name>
こんな感じでかえってくる
{
"taskArns": [
"arn:aws:ecs:ap-northeast-1:<account-id>:task/<cluster-name>/<task-id>"
]
}
そしたら接続します。
aws ecs execute-command \
--cluster <cluster-name> \
--task <task-id> \
--container <container-name> \
--command "/bin/sh" \
--interactive
抜けるときはexit
です。
以上!