docker-composeでオーケストレーションしているコンテナたちのログを、CloudWatch Logsに集約したいので、
loggingのawslogs driverを使ってみました。
経緯
- docker-composeでオーケストレーションしているコンテナたちのログを集約したい
- cloudwatch logsに投げつけたい おりゃ!(イラスト作りたかった)
環境
- amazon linux: cloudwatch logsのroleをつける
- docker: 17.03
- docker-compose: 1.9.0
docker-compose.yml
- driverに awslogsを指定する
- optionsにregion,group名,stream名を指定する
logging:
driver: "awslogs"
options:
awslogs-region: "ap-northeast-1"
awslogs-group: "${RAILS_ENV}"
awslogs-stream: "nginx"
Dockerfile
- 必要ならばログを出したいファイルにリンクを貼るとログが出力される
RUN ln -sf /dev/stdout /var/log/HOGOHOGE/app-access.log
RUN ln -sf /dev/stderr /var/log/HOGEHOGE/app-error.log
cloud watch
- 空のgreoupを作成しておかないと、以下のエラーが出てしまいます
ERROR: for redis Cannot start service redis: Failed to initialize logging driver: ResourceNotFoundException: The specified log group does not exist.
status code: 400, request id: xxxxxx-xxxxxxxxx-xxxxxxxx-xxxxx
ERROR: for db Cannot start service db: Failed to initialize logging driver: ResourceNotFoundException: The specified log group does not exist.
status code: 400, request id: xxxxxx-xxxxxxxxx-xxxxxxxx-xxxxx
動かしてみる
$ docker-compose up
ログ集約できた
- いちいちdocker execしなくてもよくなった
docker-compose.yml全体(dbとredisに意味はない)
docker-compose.yml
version: '2'
services:
web:
image: nginx
depends_on:
- db
- redis
ports:
- "80:80"
logging:
driver: "awslogs"
options:
awslogs-region: "ap-northeast-1"
awslogs-group: "develop"
awslogs-stream: "nginx"
redis:
image: redis
logging:
driver: "awslogs"
options:
awslogs-region: "ap-northeast-1"
awslogs-group: "develop"
awslogs-stream: "redis"
db:
image: postgres
logging:
driver: "awslogs"
options:
awslogs-region: "ap-northeast-1"
awslogs-group: "develop"
awslogs-stream: "posgre"
まとめ
- とてもかんたんですね!!
- これでログとしては十分かと!
あとの解析はまた、cloudwatchから何かに投げつければいいかなーと!!