基本的にここのやり方に添えばできましたが、いつかFargateで環境構築する日のために備忘録として書いていこうと思います。
https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/userguide/ecs-exec.html
やりかた
ECS Execがどのようにコンテナとの接続を実現しているかは公式ドキュメントにこのようにありました。
ECS Exec は、AWS Systems Manager (SSM) セッションマネージャーを使用して実行中のコンテナとの接続を確立し、AWS Identity and Access Management (IAM) ポリシーを使用して実行中のコンテナで実行中のコマンドへのアクセスを制御します。これは、必要な SSM エージェントバイナリをコンテナにバインドマウントすることによって実現されます。Amazon ECS または AWS Fargate エージェントは、アプリケーションコードと一緒にコンテナ内で SSM コアエージェントをスタートする責任があります。
まずはセッションマネージャーの機能を使用するためには、SSMMassageのVPCエンドポイントを作成する必要があるので、これをつくります。https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/vpc-endpoints.html#ecs-vpc-endpoint-ecsexec
次に、タスクロールにAmazonSSMFullAccessの権限を付与したポリシーをアタッチしたロールを指定します。このままコマンドを実行すると、次のようなエラーで弾かれます。
$ aws ecs execute-command --cluster <クラスター名> --task <タスク名> --container <コンテナ名> --interactive --command "/bin/bash"
SessionManagerPlugin is not found. Please refer to SessionManager Documentation here: http://docs.aws.amazon.com/console/systems-manager/session-manager-plugin-not-found
これはセッションマネージャーが入っていないために起こるものです。ECS Execはセッションマネージャーを使用しているのでこれをインストールします。
https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager-working-with-install-plugin.html#install-plugin-macos
インストールができたか確認します。できてますね。
$ session-manager-plugin
The Session Manager plugin was installed successfully. Use the AWS CLI to start a session.
再度実行してみます。
$ aws ecs execute-command --cluster <クラスター名> --task <タスク名> --container <コンテナ名> --interactive --command "/bin/bash"
The Session Manager plugin was installed successfully. Use the AWS CLI to start a session.
An error occurred (InvalidParameterException) when calling the ExecuteCommand operation: The execute command failed because execute command was not enabled when the task was run or the execute command agent isn’t running. Wait and try again or run a new task with execute command enabled and try again.
これはだいぶハマりましたが、ここに書いてありました。
https://aws.amazon.com/jp/blogs/news/new-using-amazon-ecs-exec-access-your-containers-fargate-ec2/
--enable-execute-command
オプションを使用して、この新しい機能に明示的にオプトインする必要がある点に注意してください。
どうやらタスクに対して設定が必要なようです。
$ aws ecs describe-tasks --cluster <クラスター名> --tasks <タスクID>
{
"tasks": [
{
"attachments": [
{
"id": "************************",
"type": "ElasticNetworkInterface",
"status": "ATTACHED",
"details": [
# 略
"desiredStatus": "RUNNING",
"enableExecuteCommand": false, # falseになっている
# 略
}
タスク定義の詳細がだーっと出てきますが、重要なのはenableExecuteCommand
です。これがtrueになっている必要があります。
$ aws ecs update-service --cluster <クラスター名> --service <サービス名> --enable-execute-command
再度確認してみると、trueになっていると思います。
ハマりどころとして、ECS Execを有効にするにはタスクを作り直す必要があります。
既存のタスクに対して ECS Exec を有効にすることはできません。新しいタスクに対してのみ有効にできます。
これで再度コマンドを叩くと成功しました。
$ aws ecs execute-command --cluster <クラスター名> --task <タスク名> --container <コンテナ名> --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-00000000000000
root@ip-******:/usr/src/web#