おお!ECSのAPIでSSHログインせずに入れるようになったのか!試してみよう👀https://t.co/GU7zlVpVc8
— adachin👾SRE (@adachin0817) March 16, 2021
今までECS/Fargateの場合、「コンテナにSSHする」という概念がそもそもNGと言われていましたが、私の経験上デバッグするのに結局SSHでログインしないと原因不明といったことがありました。なのでわざわざDockerfileにopenssh-serverをインストールして、鍵の設定をしてなどと…(以下ブログより)
さらにセッションマネージャーを用いることでログインすることはできますが、非公式ということもあり、結局SSHを開けてデバッグをするという流れになりました。
というわけで待望のECS Execがリリースしまして、AWS Systems Managerのセッションマネージャーを使い、SSMエージェント経由でコンテナへのアクセスが可能になりました。これでSSHのポートも開ける必要がなくなったのでセキュアにもなります。というわけで試してみました!
ECS Execとは
ECS Exec では、ホストインスタンスとやり取りしたり、インバウンドポートを開いたり、SSH キーを管理したりすることなく、実行中のコンテナと直接やり取りができるため、コンテナインスタンスのセキュリティ体制が向上します。この機能を ECS タスクやサービスなどのきめ細かいレベルで有効にして、より厳密なセキュリティを維持するのに役立てることができます。AWS Identity and Access Management (IAM) ポリシーを使用すると、きめ細かいポリシーを作成して、クラスター、タスク、コンテナに対してコマンドを実行できるユーザーを制御することができます。アクセスが提供されると、AWS CloudTrail を使用してコンテナにアクセスしたユーザーを監査し、Amazon Simple Storage Service (Amazon S3) または Amazon CloudWatch Logs に出力して各コマンドをログに記録することができます。これにより、ECS ユーザーは、開発中に発生したバグやシステムの問題を安全にトラブルシューティングでき、コンテナ化されたアプリケーションの本番環境でのブレークグラス手順のデバッグツールを利用できます。
AppコンテナにECS Execログインするまで
- Fargateのバージョンは1.4.0必須
- 事前にログインするIAMユーザーのecs-execute-commandポリシーを作成と手動でアタッチ
- ecs-exec用のIAMポリシーを作成し、ecsTaskExecutionRoleに追加
iam.tf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
## ECS resource "aws_iam_role" adachin-ecstaskexecution-role" { name = "ecsTaskExecutionRole" assume_role_policy = file("files/assume_role_policy/ecs-task.json") } resource "aws_iam_policy" "adachin-ecs-exec" { name = "adachin-ecs-exec" description = "adachin-ecs-exec" policy = file("files/assume_role_policy/adachin-ecs-exec.json") } resource "aws_iam_policy" "adachin-ecs-execute-command" { name = "adachin-ecs-execute-command" description = "adachin-ecs-execute-command" policy = file("files/assume_role_policy/adachin-ecs-execute-command.json") } resource "aws_iam_role_policy_attachment" "adachin-ecstaskexecutionrole-attach" { role = aws_iam_role.adachin-ecstaskexecution-role.name policy_arn = "arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy" } resource "aws_iam_role_policy_attachment" "adachin-ecstaskexecutionrole-ecs-exec-attach" { role = aws_iam_role.adachin-ecstaskexecution-role.name policy_arn = aws_iam_policy.adachin-ecs-exec.arn } |
adachin-ecs-exec.json
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ssmmessages:CreateControlChannel", "ssmmessages:CreateDataChannel", "ssmmessages:OpenControlChannel", "ssmmessages:OpenDataChannel" ], "Resource": "*" } ] } |
adachin-ecs-execute-command.json
ログインするIAMユーザーにアタッチすること。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ecs:ExecuteCommand", "ssm:StartSession", "ecs:DescribeTasks" ], "Resource": "*" } ] } |
今回Terraform化していますが、実際に既存で動作しているAppコンテナのRoleに対して、ecs-exec用のIAMポリシーを新たに追加しました。
- AWS CLI v2とsession-manager-pluginのインストール
1 2 3 4 5 6 7 8 9 |
$ curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" $ unzip awscliv2.zip $ sudo ./aws/install $ exit $ aws --version aws-cli/2.1.33 Python/3.8.8 Linux/4.14.198-152.320.amzn2.x86_64 exe/x86_64.amzn.2 prompt/off $ curl "https://s3.amazonaws.com/session-manager-downloads/plugin/latest/linux_64bit/session-manager-plugin.rpm" -o "session-manager-plugin.rpm" $ sudo yum install -y session-manager-plugin.rpm |
今回はAmazon Linux 2で上記インストールしてみました。MacやWindowsでもSession Manager pluginはインストールできます。
- 対象のAppコンテナへECS Execを有効化
1 2 3 4 |
aws --profile=adachin ecs update-service \ --cluster adachin \ --service adachin-app \ --enable-execute-command |
対象のAppコンテナへECS Execを有効化しないとログインできないので注意!
- Terraformの
aws_ecs_service
resourceに以下を追加
1 |
enable_execute_command = true |
差分が出るので追加しましょう。
- Appコンテナをデプロイする
ECS Execを有効化しただけではログインできません。必ずコンテナをデプロイ/タスク定義の更新をしてローリングアップデートしましょう。私はここでくそハマりました… 以下助けてくれてありがとう!!
ECS Exec試してるけどもエラー出てツラミ
— adachin👾SRE (@adachin0817) March 31, 2021
- ログインしてみる
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
$ aws --profile=adachin ecs execute-command \ --region ap-northeast-1 \ --cluster adachin \ --task xxxxxxxxxxxxxxxxxxxxxx \ --container adachin-app \ --interactive \ --command "/bin/bash" The Session Manager plugin was installed successfully. Use the AWS CLI to start a session. Starting session with SessionId: ecs-execute-command-xxxxxxxxxxxx bash-5.0# bash-5.0# cd bash-5.0# pwd /root bash-5.0# exit |
シェルスクリプトで簡単ログイン
- ecs-exec.sh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
#!/bin/bash PROFILE=$1 help() { echo " 下記のようにログインしたいApp名を指定してください ecs-exec adachin ecs-exec wikiadachin " } if [ $# -ne 1 ];then help exit fi COUNT_TASK=$(aws --profile=${PROFILE} ecs list-tasks --cluster ${PROFILE} --service-name ${PROFILE}-app --output text | sed -e 's/\s/ /g' | cut -d ' ' -f2 | cut -c 46-) echo "現在のAppコンテナ数" echo "${COUNT_TASK}" TASK=$(aws --profile=${PROFILE} ecs list-tasks --cluster ${PROFILE} --service-name ${PROFILE}-app --output text | sed -e 's/\s/ /g' | cut -d ' ' -f2 | cut -c 46- |sed -e '2,$d') echo -e "" echo "・login" echo "${TASK}" aws --profile=${PROFILE} ecs execute-command \ --region ap-northeast-1 \ --cluster ${PROFILE} \ --task "${TASK}" \ --container ${PROFILE}-app \ --interactive \ --command "/bin/bash" |
- login
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
$ sudo cp ecs-exec.sh /usr/local/bin/ecs-exec $ ecs-exec 下記のようにログインしたいApp名を指定してください ecs-exec adachin ecs-exec wikiadachin $ ecs-exec adachin ・現在のAppコンテナ数 adachin/xxxxxxxxxxxxxx ・login adachin/xxxxxxxxxxxxxxx The Session Manager plugin was installed successfully. Use the AWS CLI to start a session. Starting session with SessionId: ecs-execute-command-xxxxxxxxxxxxxxx bash-5.0# exit exit Exiting session with sessionId: ecs-execute-command-xxxxxxxxxxxxxxx |
タスクIDを抽出してsedで削るという非常にシェル芸ですが、もっと簡単にログインできる方法あれば教えて下さい!!
※追記
ecspresso初めて使ったんだけど便利すぎるぞ!
カヤックの藤原さん神だ…. 個人ブログで使い方ブログしようかな。— adachin👾SRE (@adachin0817) June 25, 2021
https://github.com/kayac/ecspresso
カヤックの藤原さんが作られた ecspresso
で、結構前にv1.5.0でexecコマンドが対応したのでこれを使うのがベストです!pecoと連携もできるし、シェル芸する労力ないのと各yamlファイルでコンテナの管理ができるので最高です!
- クレデンシャルの環境変数追加
1 |
$ export AWS_PROFILE=adachin |
- app.yaml作成
1 2 3 4 5 |
region: ap-northeast-1 cluster: adachin service: adachin-app timeout: 5m filter_command: peco |
- コンテナログイン
1 |
$ ecspresso --config /etc/ecspresso/adachin/app.yaml exec --command bash |
※ちなみに上記だと毎回環境変数とecspressoを実行するのが手間なので、pecoを組み合わせると便利になります。
- .zshrc
1 |
alias ecs-adachin='export AWS_PROFILE=adachin && ecspresso --config /etc/ecspresso/adachin/$(cat /etc/ecspresso/adachin/hosts |peco).yaml exec --command bash' |
- /etc/ecspresso/adachin/hosts
1 2 |
app admin |
- ログイン
1 |
$ ecs-adachin |
まとめ
ECS Exec最高か!?SSHコンテナとかわざわざ作ってたけど必要ないじゃん!コスト削減になるぞ!!
— adachin👾SRE (@adachin0817) March 31, 2021
素晴らしい!!これでSSH開けることなくコンテナにログインすることができるようになりました!それにログ等はCloudTrailやCloudWatch Logsに管理されるので、踏み台サーバーも今後は必要なさそうな…懸念点としてはオートスケール時に、コンテナデバッグ中で古いコンテナから消えるのでセッションが切れたらログインし直すことになるのだろうけど、基本ログインしないからいいか…
0件のコメント