[AWS]ECSを利用し、コンテナのログをCloudWatch Logsへ出力する

2017.08.10

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

コンニチハ、千葉です。

ECSでは様々なログドライバーがサポートされています。(2017/8現在)※最新情報はこちらで確認

  • json-file
  • syslog
  • journald
  • gelf
  • fluentd
  • awslogs
  • splunk

この中からCloudWatch Logsを試して見ました。また、ECSではIAMロールをサポートしているのでアクセスキーを払い出さなくんても様々なAWSサービスと連携が可能です。今回は、このCloudWatch LogsのログドライバーとIAMロールを利用してログを出力してみます。

やってみた

コンテナへのIAMロールアタッチは不要

ECSインスタンス用のEC2には「AmazonEC2ContainerServiceforEC2Role」をアタッチしているかと思います。このIAMロールにCloudWatchへのログ出力権限が付与されています。そのため、タスク定義を作成するときにコンテナ側へIAMロールをアタッチする必要はありません。

ロググループの作成

マネジメントコンソールのCloudWatch > ログからググループを作成します。ロググループ名を「ecs-test」として作成しました。ログ保持期間を指定できるので適宜設定します。

20170806-ecs-cwlogs-3

コンテナのログ出力設定

ログドライバーは、標準出力のログを受け取り送信します。そのため、コンテナに収集したいログを標準出力に出力するように設定をします。

例としてApacheの場合は、ログ出力先に「/dev/stdout」を指定することで対応できます。

ErrorLog /dev/stdout
AccessLog /dev/stdout

ECSタスク定義

ECSタスク定義のコンテナ編集画面から行います。

20170806-ecs-cwlogs-1

ログ出力のパラメータを指定します。cwlogsがCloudWatchへの出力になります。

20170806-ecs-cwlogs-2

awslogs-stream-prefixを指定した場合は、以下のようにCloudWatch Logsに出力されます。

prefix-name/container-name/ecs-task-id

20170806-ecs-cwlogs-4

prefix-nameにバージョンを入れておくと、どのタスク定義バージョンなのか分かりやすくなりそうです。

動作確認

httpdコンテナに実際にアクセスしてみて、CloudWatch Logsへアクセスログが出力されるか確認してみました。

20170806-ecs-cwlogs-5

ちゃんと出力されています。

さいごに

ECSのログをCloudWatch Logsへ出力する設定を行ってみました。簡単に設定することができますね。ログドライバーも複数サポートされていますので、柔軟な対応ができそうです。

参考

http://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/using_awslogs.html