AWS

【ECS Exec】Fargate内のコンテナの中に入る方法

基本的にここのやり方に添えばできましたが、いつか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.

これはだいぶハマりましたが、ここに書いてありました。

--enable-execute-command オプションを使用して、この新しい機能に明示的にオプトインする必要がある点に注意してください。

https://aws.amazon.com/jp/blogs/news/new-using-amazon-ecs-exec-access-your-containers-fargate-ec2/

どうやらタスクに対して設定が必要なようです。

$ 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#

ABOUT ME
sakai
東京在住の30歳。元々は車部品メーカーで働いていてましたが、プログラミングに興味を持ちスクールに通ってエンジニアになりました。 そこからベンチャー → メガベンチャー → 個人事業主になりました。 最近は生成 AI 関連の業務を中心にやっています。 ヒカルチャンネル(Youtube)とワンピースが大好きです!