TL;DR
- Docker Composeで起動したコンテナのログを、Amazon CloudWatch Logsに送るようにしたい
- 要するに、AWS環境で起動したコンテナのログを集約したい
- AWS上のコンテナサービスの話は、ここでは置いておく
- Dockerのlogging driverでAmazon CloudWatch Logs用のドライバがあるので、それを使用するように
docker-compose.yml
に設定する
Dockerのlogging driver
Dockerコンテナには、ログをどこに出力するかを設定できる、logging driverの仕組みがあります。
デフォルトは、json-file
logging driverで、これはホスト側の/var/lib/docker/containers/[コンテナID]/[コンテナID]-json.log
に出力されます。
Dockerコンテナのログを、Amazon CloudWatch Logsに出力する
Dockerコンテナが使うlogging driverを、Amazon CloudWatch Logs logging driverに変更することで、DockerコンテナのログをAmazon CloudWatch Logsに送信することができます。
※なお、Amazon CloudWatch Logsにログ出力できるように、EC2へのIAMロールの付与は必要になります
Amazon CloudWatch Logs logging driver
あとは、これをdocker-compose.yml
に設定すればOKです。
Compose file reference / logging
以下のように、services
内の各コンテナに対してlogging
設定を書いていきます。指定するdriver
は、awslogs
です。
services:
xxx:
...
logging:
driver: awslogs
options:
awslogs-region: ap-northeast-1
awslogs-group: my-log-group
少なくとも、リージョン(awslogs-region
)とロググループ(awslogs-group
)は指定する必要があります。
また、あらかじめロググループは作成しておく必要があります。
ログストリームは、デフォルトではコンテナのID(先頭12桁)が利用されます。
これを変更する場合は、awslogs-stream
やtag
で指定して変更するとよいでしょう。
以下では、tag
を使用して「イメージ名.コンテナ名.コンテナID(フル)」がログストリームとなるようにしています。
logging:
driver: awslogs
options:
awslogs-region: ap-northeast-1
awslogs-group: my-log-group
tag: "{{.ImageName}}.{{.Name}}.{{.FullID}}"