docker-composeのawslogsロギングドライバー設定
docker-compose.ymlでawslogsドライバを設定する際に調べたのでメモ
Docker awslogsロギングドライバーとは
コンテナのログをcloudwatch logsへ送信してくれます。
そもそもDockerにはロギングドライバーというものがありますがその一つということになります。
その他にもsyslogやfluentdなどがありますが、このメモでは触れないので知りたい方は下記リンク先をご確認ください
docker-compose.ymlでの設定
さて、dockerでの使用方法は下記の方法があります。
・オプションで指定
・docker daemonの設定で指定
docker-composeでオプションとして使用するには、dockerでオプションとして指定していたものをdocker-compose.ymlに記載するだけです。
---
version: "3"
services:
web:
image: nginx:1.19.8
ports:
- "80:80"
restart: always
logging:
driver: awslogs
options:
awslogs-region: ap-northeast-1
awslogs-group: "/web"
awslogs-create-group: "true"
tag: 'web-{{ with split .ImageName ":" }}{{join . "_"}}{{end}}-{{.ID}}'
使用できるオプションは下記になります。
・awslogs-region:リージョン指定
・awslogs-endpoint:cloudwatch logs APIのエンドポイント(デフォルトはリージョンのもの)
・awslogs-group:cloudwatch logsのロググループ名を指定
・awslogs-stream:ログストリーム名を指定。デフォルトはコンテナID
・awslogs-create-group:ロググループが存在しない場合に作成するかどうか
・awslogs-datetime-format:cloudwatch logsに1つのイベントとしてまとめる場合の識別子としてのdatetimeフォーマットを指定
・tag:awslogs-streamの代わりに使用可能。dockerのtagテンプレート機能が使用できる。
・awslogs-multiline-pattern:複数行ログの開始パターンを指定する。
・Credentials:AWS認証情報を設定
Docker の tagテンプレート機能について
golangのtemplate機能が使用できるようになっています。
そのため、withやsplitなどが使用可能です。
例はこちらに掲載されていますが、自分でも先程の例をもとに解説してみます。
tag: 'web-{{ with split .ImageName ":" }}{{join . "_"}}{{end}}-{{.ID}}'
まず、.ImageNameにはイメージの名前が入ります。今回だとnginx:1.19.8 が展開されます。
次にwith splitとendに囲まれた部分ですが、nginx:1.19.8を : 区切りで nginx と 1.19.8 に分割し、_ でjoinしています。
joinの . はsplitされた結果を示しています。
要は:を_に変換しているのですが、これはCloudwatch logsがlog stream名に : を許可していないためです。
https://docs.aws.amazon.com/ja_jp/AmazonCloudWatchLogs/latest/APIReference/API_CreateLogStream.html
最後の.IDにはコンテナIDの最初の12文字が入ります
最終的には下記のログストリーム名になります。
web-nginx_1.19.8-xxxxxxxxxxxx
常に同じログストリーム名に書き込みたい場合は固定でも大丈夫ですが、再起動した場合やコンテナのバージョンによってログストリームを分けたい場合はこのように設定することで実現できます。