ECS Execute コマンドをCloudWatch Logsに出力する

ECS Execute コマンドの実行結果をCloudWatch Logsに出力しようとして、結構ハマったので、確認すべきポイントを紹介します。
2023.12.24

ECS Execute コマンドの実行結果をCloudWatch Logsに出力しようとして、結構ハマったので、確認すべきポイントを紹介します。

※ECS Execute コマンドを実行するクライアント側の設定については、触れません。

確認したこと

executeCommandConfigurationがちゃんと設定されていること

  • 公式ドキュメント引用

logging プロパティにより、ECS Exec のログ機能の動作が決まります: NONE: ログ記録はオフ状態です DEFAULT: ログは構成済みの awslogs ドライバーに送信されます (ドライバーが構成されていない場合、ログは保存されません) OVERRIDE:ログは、提供された Amazon CloudWatch Logs LogGroup、Amazon S3 バケット、またはその両方に送信されます。

ほとんどの場合は、下記の様にTaskDefinitionのlog送信先をCloudWatch Logsに設定されていると思うので、ここが原因の可能性は低いです。

"logConfiguration": {
  "logDriver": "awslogs",
  "options": {
    "awslogs-group": "/aws/ecs/sample/php-fpm",
    "awslogs-region": "eu-central-1",
    "awslogs-stream-prefix": "ecs"
  }
}

コンテナに scriptcat がインストールされていること

起動しているコンテナイメージに、scriptcat がインストールされていることを確認してください。

下記の様に、aws ecs execute-command を実行後に、コンテナ内部でコマンドがインストールされていることを確認できます。

/var/www/html$ which script
/usr/bin/script
/var/www/html$ which cat
/bin/cat

もし、インストールされていない場合は、Dockerfileに追記して、イメージを再度 build&push して最新のイメージに置き換えてください。

Amazon ECSのタスクロールにアクセス許可が設定されていること

タスクロールの方にCloudWatch Logsへのアクセス許可が設定されていることを確認してください。

タスク実行ロールにはCloudWatch Logsへのアクセス許可が設定されていることが多いですが、タスクロールには設定されていないことが多いです。

自分の場合は、こちらが原因でした。

{
   "Version": "2012-10-17",
   "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "logs:DescribeLogGroups"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
               "logs:CreateLogStream",
               "logs:DescribeLogStreams",
               "logs:PutLogEvents"
            ],
            "Resource": "arn:aws:logs:region:account-id:log-group:/aws/ecs/cloudwatch-log-group-name:*"
        }
   ]
}

タスクを再起動してみる

色々設定してもうまくいかない場合は、タスクを再起動してみてください。

インストールしたコマンドや、タスクロールの設定が反映されていない可能性があります。

それでもうまくいかない方へ

下記のGitHubのREADMEのリンクから、CloudFormationのテンプレートをデプロイしてみてください。

ECS Exec コマンドの実行結果をCloudWatch Logsに出力するphp-fpmが起動するようになっています。

[GitHub] ecs-exec-cmd-logging-demo

まとめ

自分の場合は、別途デプロイしたリソースと比較して、タスクロールの権限が足りていないことが分かりました。

意外とハマると思うので、どなたかの参考になれば幸いです。