見出し画像

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を : 区切りで nginx1.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

常に同じログストリーム名に書き込みたい場合は固定でも大丈夫ですが、再起動した場合やコンテナのバージョンによってログストリームを分けたい場合はこのように設定することで実現できます。



この記事が気に入ったらサポートをしてみませんか?