スマートキャンプ、エンジニアの入山です。
前回のブログにも書きましたが、弊社では昨年末から既存のEC2からECS/Fargateへのインフラ移行作業を実施しています。 EC2からECSへ移行する上では、特に運用面が大きく変わります。利便性やメンバーへの教育コストを考慮すると、今までEC2でやっていた運用をECSでどう上手く代替するかが力の入れ所だと思います。
一ヶ月前に弊社インターンの関口が書いた以下の記事も、既存運用の置き換えやデバッグ時の利便性向上を目的とした手段の1つで、この記事を執筆した時点ではECS/Fargate上のコンテナに対するAWS公式のログイン手段はありませんでした。
弊社のECS移行も稼働直前の佳境を迎えている最中ですが、この度Amazon ECS Execがリリースされ、待ち望んでいたECS/Fargate上のコンテナに対するAWS公式のログイン手段がついに実現したので、早速試してみたいと思います!
概要
Amazon ECS Execは、Amazon ECSで稼働するコンテナへのログインを実現する機能です。
これまでECS上で稼働するコンテナへログインする手段として以下の方法がありましたが、公式に直接コンテナへログインができるようになります。
- ECS on EC2
- EC2インスタンスにSSH or SSMでログインしてdockerコマンドで直接ログイン
- ECS on Fargate
- 手段なし
- (セッションマネージャーを用いることでログインできるが非公式)
ECS Execは、AWS Systems Managerのセッションマネージャーを利用して、SSMエージェント経由でクライアントからコンテナへのアクセスを実現しています。
コンテナの中にSSMエージェントが動作している必要はありますが、エージェント経由のためSSHのポート開放などは必要なく、シンプルかつ安全にコンテナへログインすることが可能です。
詳細については、以下の記事を参照してください。今回の記事の内容も以下の情報を元に実施しました。
NEW – Using Amazon ECS Exec to access your containers on AWS Fargate and Amazon EC2 | Containers
Using Amazon ECS Exec for debugging - Amazon Elastic Container Service
前提条件
Amazon ECS Execを利用するためには、対応したバージョンのECS基盤・AWS CLIを利用する必要があります。
- ECS on EC2
- コンテナエージェントバージョン: 1.50.2以降
- ECS on Fargte
- プラットフォームバージョン: 1.4.0以降
- AWS CLI
- AWS CLI v1: 1.19.28以降
- AWS CLI v2: 未対応(2021/3/16時点、今後数週間でリリース予定)
AWS CLIは現時点でv1にしか対応していないので、注意が必要です。(私も普段はv2を使っていますが、今回利用するために追加でv1をインストールしました。)
また、AWS CLIのSession Managerプラグインもインストールが必要です。以下の手順に従って、インストールしておきます。
(オプション) AWS CLI 用の Session Manager plugin をインストールする - AWS Systems Manager
Amazon ECS Execの利用手順
ECSタスクロールの作成
ECS ExecではSSMの機能を利用するため、ECSタスクロールにSSMに関連する権限を付与する必要があります。
ECSタスクロールを作成し、以下のIAMポリシーをアタッチします。既存のタスクロールへのアタッチでも大丈夫です。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ssmmessages:CreateControlChannel", "ssmmessages:CreateDataChannel", "ssmmessages:OpenControlChannel", "ssmmessages:OpenDataChannel" ], "Resource": "*" } ] }
作成したECSタスクロールを設定したECSタスク定義の作成
ECSタスク定義のタスクロール
に前項で作成したECSタスクロールを設定します。ECSタスク定義の作成手順については割愛します。
enableExecuteCommandオプションを有効化したタスクの起動
ECS Execの機能は、サービスやタスク単位での有効化が必要で、enableExecuteCommand
オプションで設定します。
2021/3/16時点では、AWSマネジメントコンソールから設定や確認を行う方法は提供されておらず、以下のAWS CLIコマンドでのみ利用可能なようです。
- create-service
- update-service
- start-task
- run-task
なお、enableExecuteCommand
オプションが有効化された状態で起動したタスクでのみ利用可能であり、既存のタスクには適用できないため注意が必要です。(update-serviceの場合は、タスクの再デプロイが必要)
今回は、run-task
コマンドによるFargateのタスク起動にenableExecuteCommand
オプションを追加して試してみます。
$ aws ecs run-task \ --cluster test-cluster \ --task-definition test-task \ --count 1 \ --enable-execute-command \ --launch-type FARGATE \ --network-configuration 'awsvpcConfiguration={subnets=["subnet-xxxxxxxxxxxx"],securityGroups=["sg-xxxxxxxxxxxx"],assignPublicIp="DISABLED"}'
タスク起動に成功すると以下のようなレスポンスが返ってきます。enableExecuteCommand
がtrue
となっていれば成功です。
{ "tasks": [ { "platformVersion": "1.4.0", "taskArn": "arn:aws:ecs:ap-northeast-1:xxxxxxxxxxxx:task/test-cluster/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "launchType": "FARGATE", : : "enableExecuteCommand": true, } ] }
ECS Execでコンテナへログイン
コンテナへのログインには、aws ecs execute-command
コマンドを利用します。
SSMセッションマネージャーはAWSマネジメントコンソールからブラウザ上での操作も可能ですが、現時点でECS Execは未対応でAWS CLIからのみの操作となります。
コマンド実行の対象とするタスクやコンテナの情報を指定した上で、--command
に実行したいコマンドを記述します。今回はコンテナにログインして操作することを目標としているため、/bin/sh
を指定します。
なお、--interactive
オプションは必須となっています。
$ aws ecs execute-command \ --cluster test-cluster \ --task xxxxxxxxxxxxxxxxxxxxxxx \ --container app \ --interactive \ --command "/bin/sh"
コマンドを実行するとセッションが開始され、コンテナにログインされた状態となります。exit
コマンドでシェルとセッションが終了されます。
The Session Manager plugin was installed successfully. Use the AWS CLI to start a session. Starting session with SessionId: ecs-execute-command-xxxxxxxxxxx # # whoami root # # exit Exiting session with sessionId: ecs-execute-command-xxxxxxxxxxx.
せっかくなのでログインユーザーも確認してみた所、root
ユーザーとなっていました。
冒頭で紹介した前回記事の方法だと、ssm-agent
ユーザーでのログインだったため権限に一手間かかっていたのですが、デフォルトがroot
となっているのでそういった手間も不要そうです。
おわりに
今回は、Amazon ECSのコンテナにログインが可能となるAmazon ECS Execをご紹介しました!
以前からECSコンテナにログインする手段をリリースする旨の発言はあったものの、いつ出るんだろう?と首を長くして待っていた方も多いと思います。
ECSやFargateへの移行におけるハードルや不安要素の1つとなっていたコンテナへのログインが正式にサポートされたことで、世の中のコンテナ化がまた一歩進みそうな気がします。リリース当初の現時点では制約や未対応の部分も多いですが、監査ログやアクセス制御などにも対応しており、今後のアップデートに期待大です!
なお、以前紹介したAWS CopilotもECS Execに対応しているようです。こちらもぜひ試してみてください!