今回は2021年3月にリリースされたECSの新機能であるECS Execに関して解説してみようと思います。

簡単に言うとECSは先日のアップデートにより「SSHを介さず、またFargate上に動くコンテナに対してDocker exec的なコマンドが実行できるようになった」のがECS Execの概要になります。

ECS Execが生まれた背景とその仕組み

今まで、ECS上で管理されたFargateで何かバグが発生した時、トラブルシュートとしては頑張ってロギングを仕込んだりEC2上にデプロイしてから docker exec したり、IntelliJ等JetBrains製品で動くクラウドデバッグ(https://docs.aws.amazon.com/toolkit-for-jetbrains/latest/userguide/ecs-debug.html)機能を利用するしかありませんでした。

今回のリリースにより、以下のケースにおいてFargate上のコンテナに対するアクセスが可能となりました。

  • AWS SDKによるコードベースでのアクセス
  • AWS CLIおよびAWS Copilotによるシェルからのアクセス

コンテナに対する認証は、AWS Systems Manager(SSM)を介して行われるため、コンテナに対するSSHキーを用意する必要もなく、IAMベースで認証を行うことが可能です。

この記事では認証の設定よりハンズオンに関して解説を行い、文末に認証に関する補足を行います。

aws-cliには「Administrator」権限を持ったIAMユーザーか、全てのリソースに対する「ecs:ExecuteCommand」権限を付与されたIAMユーザーで進めてください。

{
     "Version": "2012-10-17",
     "Statement": [
                       {
                         "Effect": "Allow",
                          "Action": "ecs:ExecuteCommand",
                          "Resource": "arn:aws:ecs:region:{AWSのアカウントID}:task/cluster-name/*"
                        }
                    ]
 }

ECS Execを試してみる

ECS上で動くfargate環境をお持ちの方はそのまま、ECSを触るのが初めての方は以前ご紹介した「ECRとECSを使ってNginxのページを表示させよう」の記事(https://www.sunnycloud.jp/column/20210310-01/)より簡単なFargate環境を立ち上げてみましょう。

ここでFargateとしてSSMを利用するために、プラットフォームは「1.4.0以上」または「LATEST」となっていることが必要です。
1.3.0、またはそれ以下のバージョンだとECS Execが利用できないのでご注意ください。

また、FargateがSSMをサポートしていてもECS Execに関してはオプトインの機能としての提供のため、現在はAWS CLIのコマンドでrun-taskまたはupdate-serviceで明示的に指定する必要があります(Web版のコンソールでタスクを立ち上げるための操作は執筆現在でサポートされていません)。

$ aws ecs run-task \
    --cluster nginx-ecs  \
    --task-definition nginx-fargate \
    --network-configuration awsvpcConfiguration="{subnets=[subnet-xxxxxx],securityGroups=[sg-xxxxxxxx],assignPublicIp=ENABLED}" \
    --enable-execute-command \
    --launch-type FARGATE \
    --tags key=environment,value=production \
    --platform-version '1.4.0' \
    --region ap-northeast-1

–enable-execute-commandを書いてタスクを立ち上げると、実行結果のjsonに「ExecuteCommandAgent」が含まれていればオプトインが正しく行われた事になります。

さて、ここから先は先程お伝えしたように数種類の接続方法が提供されていますが、一般的なのはAWS CLIを用いた接続になると思います。

AWS CLIを用いる……という事になるので、AWS CLIに設定されたIAM情報を用いてECS Execを行うことになるので、それに対応した権限を設定することが必要です。

ECS Execのリリースに対応して新しい「ecs:ExecuteCommand」というAction権限が提供されるようになりました。
この権限に対するスコープは動的にコンテナが入れ替わるため、ECSに付けられたタグで制限するのが良い、とオフィシャルの資料では説明されています。

また、SSMを利用するためにはAWS CLIを最新版にアップデートした後、Session Manager pluginをお使いのクライアントの環境に合わせてインストールする必要があります。https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager-working-with-install-plugin.html

ここで、以下のようにexecute-commandを実行します。

aws ecs execute-command  \
    --region ap-northeast-1 \
    --cluster nginx-ecs \
    --task xxxxxxxxxxxxxxxxxxxxxx \
    --container nginx-ecs \
    --command "/bin/bash" \
    --interactive
  • 「TargetNotConnectedException」が出る:時間が経つと治る、という話もありますが、タスク(サービス)を作り直して時間を置いて試してみると良いかもしれません。(正しくコンフィグしてるにも関わらずAWSへのお問い合わせが必要そうです。)
  • 「SessionManagerPlugin is not found」が出る:SSMプラグインがインストールされていないか、有効化されていません。taskに対してSSMが有効化されているかどうか確認する必要があります。

ECS Execコマンドが正常に実行されるとインタラクティブシェルに入ります。
後はDocker execと同じ使い勝手でデバッグが行えます。

いかがでしたでしょうか。続きは、明日お届けします!

▼「無料相談」受付中です。AWSに関することは、どんなことでもお気軽にご相談ください。
https://www.sunnycloud.jp/contact-us/