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
三重出身の28歳。前職はメーカーで働いていて、プログラミングスクールに通って未経験からWeb業界に転職しました。Railsをメインで使っていて、AWSも少しできます。音楽を聞くこととYoutubeを見るのが好きです。最近はへきトラ劇場にハマってます

COMMENT

メールアドレスが公開されることはありません。