「AWS無料相談会」をオンラインで開催中

AWS FargateでAmazon ECS Execを有効にする

  • 2021.04.26
  • AWS
AWS FargateでAmazon ECS Execを有効にする

最近キーボード沼にはまりつつあります。 やっさん でございます。
Keychronがお気に入りでして、K3を使っています。
K3のキーキャップをPBTに交換することで満足の行く打鍵感を手に入れることができました。


これが最後のキーボード沼だと信じて ....

本題から逸れてしまいました。本エントリーでは、
AWS FargateでAmazon ECS Execを有効化する方法をご紹介します。

Amazon ECS Execとは

Amazon ECS Exec(以下ECS Exec)はコンテナに対して対話型のシェル、あるいは一つのコマンドを実行できるようになる機能です。

Amazon ECS Execの良いところ

AWS Fargateでは管理するクラスターインスタンスが不要になるメリットがありましたが、コンテナへのアクセスが難しくなるというトレードオフがありました。ECS Execを利用することによりコンテナへのアクセスが容易になりデバッグを行いやすくなります。

AWS FargateでECS Execを有効化する

それでは、AWS FargateでECS Execを有効化してみます。
以下を前提条件とします。

  • AWS Fargateで稼働中のNginxコンテナに対話型シェルでアクセスすることを目的とします
  • 作業環境にAWS CLIがインストールされている(本記事ではAWS CLI V2を利用しています)
  • 作業環境にAWS CLI用のSession Manager pluginがインストールされている
  • 以下の環境変数が定義されている
    export AWS_REGION=【AWSリージョン名】
    export ECS_EXEC_BUCKET_NAME=【ECS Exec実行ログを保存するS3バケット】
  • その他の値は以下のように決め打ちとしています。
    • ECSクラスター名:pure-nginx
    • ECSサービス名:pure-nginx
    • ECSタスク名のコンテナ名:nginx

1. KMSのキーを作成する

ECS Execはコンテナとの通信内容をKMSで暗号化しますので、まず最初にKMSのキーを作成します。

  • KMSキーを作成
KMS_KEY=$(aws kms create-key --region $AWS_REGION)
  • 作成したKMSキーのARNを取得\
KMS_KEY_ARN=$(echo $KMS_KEY | jq --raw-output .KeyMetadata.Arn)
  • KMSキーのエイリアスを作成する
aws kms create-alias \
--alias-name alias/ecs-exec-demo-kms-key \
--target-key-id $KMS_KEY_ARN --region $AWS_REGION
  • KMSキーのARN情報が取得できているか確認
echo "The KMS Key ARN is: "$KMS_KEY_ARN

2. ECS Execの実行ログを保存するS3バケットを作成する

以下のコマンドを実行し、
ECS Execの実行ログを保存するS3バケットを作成しておきます

aws s3api create-bucket \
--bucket $ECS_EXEC_BUCKET_NAME \
--region $AWS_REGION \
--create-bucket-configuration LocationConstraint=$AWS_REGION

3. ECSクラスターを更新して、ECS Execを有効化する

以下のコマンドを実行して、ECSクラスターでECS Execを有効化します。

aws ecs update-cluster \
    --cluster pure-nginx \
    --region $AWS_REGION \
    --configuration executeCommandConfiguration="{logging=OVERRIDE,\
                                                kmsKeyId=$KMS_KEY_ARN,\
                                                logConfiguration={cloudWatchLogGroupName="/aws/ecs/pure-nginx",\
                                                                s3BucketName=$ECS_EXEC_BUCKET_NAME,\
                                                                s3KeyPrefix=exec-output}}"

4. ECSサービスを更新して、ECS Execを有効化する

以下のコマンドを実行し、ECSサービスでECS Execを有効化します。

aws ecs update-service \
--cluster pure-nginx \
--service pure-nginx \
--enable-execute-command \
--region $AWS_REGION

5. IAMロールにポリシーを付与する

IAMロールにIAMポリシーに付与します。
ECSタスクロールとECSタスク実行ロール両方が対象になります。
IAMポリシーには、以下のリソースへの権限を記述します。

  • KMS
  • CloudWatch Logs
  • SSM
  • S3

IAMポリシーの例

本エントリーでは、下記JSONをインラインポリシーとして、
ECSタスクロールとECSタスク実行ロールに付与しました。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ssmmessages:CreateControlChannel",
                "ssmmessages:CreateDataChannel",
                "ssmmessages:OpenControlChannel",
                "ssmmessages:OpenDataChannel"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "logs:DescribeLogGroups"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogStream",
                "logs:DescribeLogStreams",
                "logs:PutLogEvents"
            ],
            "Resource": "arn:aws:logs:ap-northeast-1:【AWSアカウントID】:log-group:/aws/ecs/pure-nginx:*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject"
            ],
            "Resource": "arn:aws:s3:::【ECS Exec実行ログを保存するS3バケット】/*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetEncryptionConfiguration"
            ],
            "Resource": "arn:aws:s3:::【ECS Exec実行ログを保存するS3バケット】"
        },
        {
            "Effect": "Allow",
            "Action": [
                "kms:Decrypt"
            ],
            "Resource": "【KMS KEYのARN】"
        }
    ]
}

6 ECS Execが有効か確認する。

ECS Execが有効になっているか確認します。
この時、既存のタスクが稼働中の場合は新しいタスクを起動する必要があります。
以下のコマンドを実行し、ECS Execが有効か確認します。

aws ecs describe-tasks \
    --cluster pure-nginx \
    --region $AWS_REGION \
    --tasks 【ECSのタスクID】

ECS Execが有効であれば、以下のパラメーターが返ってきます。

            "enableExecuteCommand": true,

7. ECS Execで対話型シェルを実行する

以上で設定は完了です。早速、ECS Execを実行し、
コンテナに対話型シェルでアクセスしてみます。

aws ecs execute-command  \
    --region $AWS_REGION \
    --cluster pure-nginx \
    --task 【ECSのタスクID】 \
    --container nginx \
    --command "/bin/sh" \
    --interactive

アクセスできました!!!!

ubuntu@ip-xxx-xx-xx-xxx:~$ aws ecs execute-command  \
>     --region $AWS_REGION \
>     --cluster pure-nginx \
>     --task 03edc749886f4f498f4c6b3a9e12dfd3 \
>     --container nginx \
>     --command "/bin/sh" \
>     --interactive
The Session Manager plugin was installed successfully. Use the AWS CLI to start a session.
Starting session with SessionId: ecs-execute-command-00bf245a56342007b
This session is encrypted using AWS KMS.
/ # 
/ # 
/ # ls -l
total 76
drwxr-xr-x    2 root     root          4096 Mar 31 16:51 bin
drwxr-xr-x    5 root     root           340 Apr 26 07:27 dev
drwxr-xr-x    1 root     root          4096 Apr 13 19:21 docker-entrypoint.d
-rwxrwxr-x    1 root     root          1202 Apr 13 19:21 docker-entrypoint.sh
drwxr-xr-x    1 root     root          4096 Apr 26 07:27 etc
drwxr-xr-x    2 root     root          4096 Mar 31 16:51 home
drwxr-xr-x    1 root     root          4096 Mar 31 16:51 lib
drwxr-xr-x    3 root     root          4096 Apr 26 07:27 managed-agents
drwxr-xr-x    5 root     root          4096 Mar 31 16:51 media
drwxr-xr-x    2 root     root          4096 Mar 31 16:51 mnt
drwxr-xr-x    2 root     root          4096 Mar 31 16:51 opt
dr-xr-xr-x  102 root     root             0 Apr 26 07:27 proc
drwx------    1 root     root          4096 Apr 26 07:33 root
drwxr-xr-x    1 root     root          4096 Apr 26 07:27 run
drwxr-xr-x    2 root     root          4096 Mar 31 16:51 sbin
drwxr-xr-x    2 root     root          4096 Mar 31 16:51 srv
dr-xr-xr-x   13 root     root             0 Apr 26 07:27 sys
drwxrwxrwt    1 root     root          4096 Apr 13 19:21 tmp
drwxr-xr-x    1 root     root          4096 Mar 31 16:51 usr
drwxr-xr-x    1 root     root          4096 Mar 31 16:51 var
/ # 

総括:AWS Fargateのトレードオフが解消され、ますます便利に!

ECS Execが発表されるまでは、AWS FargateへのコンテナアクセスはSSH公開鍵をパラメータストアに登録する方法や、Systems Managerへのアクティベーション登録の方法がありましたが、どちらも使いやすいとは言い難い点がありました。ECS ExecによりAWS公式でコンテナへのアクセスがサポートされ、AWS Fargateへのコンテナアクセスが容易になり今までトレードオフであった点が解消されました。

特にIaCにより開発環境のみECS Execを有効化し開発効率を向上できることに期待しております。

参照した情報のリンク先:

以上です!