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ロールを作成します。
IAMポリシーは以下の内容です。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ssmmessages:CreateControlChannel", "ssmmessages:CreateDataChannel", "ssmmessages:OpenControlChannel", "ssmmessages:OpenDataChannel" ], "Resource": "*" } ] }
初回実行ウィザードで作成済みのタスク定義において、上記のタスクロールを使用するように変更します。
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を本格的に運用する場合、複数人で運用することが想定されます。
その場合、ログ記録によって証跡を残すことも必要になると思います。