なになれ

IT系のことを記録していきます

execだけではないECS Execの機能を試した

ECSに対するdocker exec的な機能であるECS Execを試しました。
ECS Fargateでは、ECS Exec登場以前まではexecができずにトラブルシューティングがやりづらい状態だったかと思います。
ECS Execはこの問題が解消される有用な機能です。
また、ECS Execは、単にexecできるだけではなく、execで実行したコマンドのログを記録する機能が用意されています。
本内容では、ECS Execの使い方とログ記録機能の使い方を紹介します。

内容

ECS Execの前提となる以下のツールは事前にインストール済みとします。

ECS Execのセットアップ

Amazon ECS コンソールの初回実行ウィザードによるECSの環境を前提とします。

AWS Fargate を使用した Amazon ECS コンソールの開始方法 - Amazon Elastic Container Service

コンテナの定義はnginxにして、そのほかはデフォルトの設定値とします。

しばらくすると、ECSタスクが起動しますので、タスクのIDを控えておきます。

下記のAmazon ECS Exec Checkerのスクリプトを活用すると、ECSタスクに対してECS Execが使える設定になっているかを確認できます。
github.com

試しにAmazon ECS Exec Checkerのスクリプトを下記のように実行します。
第1引数にクラスタ名、第2引数にタスクのIDを指定します。

$  ./check-ecs-exec.sh example 50e70d8157634449a689de6b78360719
-------------------------------------------------------------
Prerequisites for check-ecs-exec.sh v0.6
-------------------------------------------------------------
  jq      | OK (/usr/local/bin/jq)
  AWS CLI | OK (/usr/local/bin/aws)

-------------------------------------------------------------
Prerequisites for the AWS CLI to use ECS Exec
-------------------------------------------------------------
  AWS CLI Version        | OK (aws-cli/2.2.5 Python/3.9.5 Darwin/20.5.0 source/x86_64 prompt/off)
  Session Manager Plugin | OK (1.1.54.0)

-------------------------------------------------------------
Checks on ECS task and other resources
-------------------------------------------------------------
Region : ap-northeast-1
Cluster: example
Task   : 50e70d8157634449a689de6b78360719
-------------------------------------------------------------
  Cluster Configuration  | Audit Logging Not Configured
  Can I ExecuteCommand?  | arn:aws:iam::123456789012:user/hi1280
     ecs:ExecuteCommand: allowed
     ssm:StartSession denied?: allowed
  Task Status            | RUNNING
  Launch Type            | Fargate
  Platform Version       | 1.4.0
  Exec Enabled for Task  | NO
  Container-Level Checks |
    ----------
      Managed Agent Status - SKIPPED
    ----------
    ----------
      Init Process Enabled (first-run-task-definition:1)
    ----------
         1. Disabled - "nginx"
    ----------
      Read-Only Root Filesystem (first-run-task-definition:1)
    ----------
         1. Disabled - "nginx"
  EC2 or Task Role       | Not Configured  
  VPC Endpoints          | SKIPPED (vpc-030e02a388c2af23e - No additional VPC endpoints required)

赤字の出力がECS Execを使うために必要な部分なので修正します。
Task Roleを修正するため、ECSタスク用のIAMロールを作成します。

https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/task-iam-roles.html#create_task_iam_policy_and_role

IAMポリシーは以下の内容です。

{
   "Version": "2012-10-17",
   "Statement": [
       {
       "Effect": "Allow",
       "Action": [
            "ssmmessages:CreateControlChannel",
            "ssmmessages:CreateDataChannel",
            "ssmmessages:OpenControlChannel",
            "ssmmessages:OpenDataChannel"
       ],
      "Resource": "*"
      }
   ]
}

初回実行ウィザードで作成済みのタスク定義において、上記のタスクロールを使用するように変更します。

https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/task-iam-roles.html#specify-task-iam-roles

Exec Enabled for Taskの修正はECSタスクをECS Execが利用できるように起動する必要があります。

今回はサービスで起動しているので、下記のように修正します。

$ aws ecs update-service --cluster example --task-definition first-run-task-definition --enable-execute-command --service nginx-service

--enable-execute-commandオプションでECS Execを有効にします。

update-serviceを実行すると、タスクが再作成されます。
再作成されたタスクに対して、Amazon ECS Exec Checkerのスクリプトを再度実行します。

$ ./check-ecs-exec.sh example 4068c32da85649658dac3faa0ea5ee7d
-------------------------------------------------------------
Prerequisites for check-ecs-exec.sh v0.6
-------------------------------------------------------------
  jq      | OK (/usr/local/bin/jq)
  AWS CLI | OK (/usr/local/bin/aws)

-------------------------------------------------------------
Prerequisites for the AWS CLI to use ECS Exec
-------------------------------------------------------------
  AWS CLI Version        | OK (aws-cli/2.2.5 Python/3.9.5 Darwin/20.5.0 source/x86_64 prompt/off)
  Session Manager Plugin | OK (1.1.54.0)

-------------------------------------------------------------
Checks on ECS task and other resources
-------------------------------------------------------------
Region : ap-northeast-1
Cluster: example
Task   : 4068c32da85649658dac3faa0ea5ee7d
-------------------------------------------------------------
  Cluster Configuration  | Audit Logging Not Configured
  Can I ExecuteCommand?  | arn:aws:iam::123456789012:user/hi1280
     ecs:ExecuteCommand: allowed
     ssm:StartSession denied?: allowed
  Task Status            | RUNNING
  Launch Type            | Fargate
  Platform Version       | 1.4.0
  Exec Enabled for Task  | OK
  Container-Level Checks |
    ----------
      Managed Agent Status
    ----------
         1. RUNNING for "nginx"
    ----------
      Init Process Enabled (first-run-task-definition:2)
    ----------
         1. Disabled - "nginx"
    ----------
      Read-Only Root Filesystem (first-run-task-definition:2)
    ----------
         1. Disabled - "nginx"
  Task Role Permissions  | arn:aws:iam::123456789012:role/ecs-exec-task-role
     ssmmessages:CreateControlChannel: allowed
     ssmmessages:CreateDataChannel: allowed
     ssmmessages:OpenControlChannel: allowed
     ssmmessages:OpenDataChannel: allowed
  VPC Endpoints          | SKIPPED (vpc-07b899d4fb276ef4f - No additional VPC endpoints required)

赤字の出力がなくなったのでECS Execを実行できます。

ECS Execを実行する

ECS Execを使用するコマンドを実行します。

$ aws ecs execute-command --cluster example --task 4068c32da85649658dac3faa0ea5ee7d --container nginx --interactive --command "/bin/sh"

The Session Manager plugin was installed successfully. Use the AWS CLI to start a session.


Starting session with SessionId: ecs-execute-command-0aba4e26d91e3c0db
# ls
bin   docker-entrypoint.d   home   managed-agents  opt   run   sys  var
boot  docker-entrypoint.sh  lib    media       proc  sbin  tmp
dev   etc           lib64  mnt         root  srv   usr

ECS内のコンテナに対してコマンドを実行することができます。

ECS Execのログを記録する

ECS Exec内で実行したコマンドのログをCloudWatch LogsとS3に記録することができます。
https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/ecs-exec.html#ecs-exec-logging

Amazon ECS Exec Checkerでは、Cluster Configuration | Audit Logging Not Configuredと表示されている部分の設定になります。

今回はCloudWatch Logsに記録します。

タスクロールのポリシーに以下を追加します。CloudWatch Logsの権限を与えます。

{
   "Version": "2012-10-17",
   "Statement": [
        {
            "Effect": "Allow",
            "Action": [
               "logs:CreateLogStream",
               "logs:DescribeLogStreams",
               "logs:PutLogEvents",
               "logs:DescribeLogGroups"
            ],
            "Resource": "*"
        }
   ]
}

ECSクラスターに対して、ログ記録の設定を行います。

$ aws ecs update-cluster --cluster example --configuration executeCommandConfiguration="{ logging=OVERRIDE, logConfiguration={ cloudWatchLogGroupName=/ecs/first-run-task-definition} }"

loggingにOVERRIDEを指定すると、明示的にログ記録の設定を行います。
ここでは、CloudWatch Logsを使うための設定を行います。

Amazon ECS Exec Checkerの出力としては以下のようになります。

...
  Cluster Configuration  |
     KMS Key       : Not Configured
     Audit Logging : OVERRIDE
     S3 Bucket Name: Not Configured
     CW Log Group  : /ecs/first-run-task-definition, Encryption Enabled: false
...

ECS Execのコマンドを実行します。

$ aws ecs execute-command --cluster example --task 4068c32da85649658dac3faa0ea5ee7d --container nginx --interactive --command "/bin/sh"

コマンド実行後の操作はCloudWatch Logsで以下のように出力内容を確認できます。

Script started on 2021-06-26 13:27:31+00:00 [<not executed on terminal>]
# ls
bin   docker-entrypoint.d   home   managed-agents  opt   run   sys  var
boot  docker-entrypoint.sh  lib    media       proc  sbin  tmp
dev   etc           lib64  mnt         root  srv   usr
# exit

Script done on 2021-06-26 13:27:31+00:00 [COMMAND_EXIT_CODE="0"]

ログ記録の設定では、DEFAULTという指定も可能です。
DEFAULTでは、ログ記録にawslogsドライバーを使用します。

$ aws ecs update-cluster --cluster example --configuration executeCommandConfiguration="{ logging=DEFAULT }"

ECSのデフォルトのタスク定義で使用するawslogsドライバーの設定では、CloudWatch Logsを使用して、/ecs/[タスク定義名]にログを出力します。
そのため、DEFAULTの設定でも同様にCloudWatch Logsにログを残すことが可能です。

まとめ

ECS Execの使い方とログ記録の使い方を紹介しました。
単にexecをしたい場合はログ記録は不要です。
ただECSを本格的に運用する場合、複数人で運用することが想定されます。
その場合、ログ記録によって証跡を残すことも必要になると思います。

参考