タダです.
redash を EC2 上のコンテナで動かしているのですが,ログを外出ししていなかったので何かあったらいちいちサーバーの中に入る必要がありました.そこで,CloudWatch Logs に出して見えた方がいいと思い,検証したのでこの記事でまとめていきます.なお,redash のバージョンは8.0.0.b32245
の環境で確認しています.
事前準備
事前準備として EC2 の IAM ロールの権限に CloudWatch Logs へのアクセス権限をつけていきます.ドキュメント に沿って次のポリシーをつけました.
{ "Version": "2012-10-17", "Statement": [ { "Action": [ "logs:CreateLogStream", "logs:PutLogEvents" ], "Effect": "Allow", "Resource": "*" } ] }
次に,ログを保管する CloudWatch Logs のロググループを作っておきます.今回は /var/lib/docker/redash/logs
というのを作りました.以上で事前準備が完了です.
redash の設定
続いてコンテナ側の CloudWatch Logs 設定を定義していきます.コンテナのログは/var/lib/docker/containars/[コンテナ ID]/
配下にでており,EC2 のログとは異なりコンテナのログは awslogs
ロギングドライバを使って出力されているログを格納するので CloudWatch Agent の導入は不要です.redash のコンテナはdocker-compose.yml
で管理されているので,ドキュメントに沿って定義を追加します.今回は4つのコンテナのログを CloudWatch Logs に出力します.
- redash_server_1
- redash_scheduled_worker_1
- redash_scheduler_1
- redash_adhoc_worker_1
services
セクション以下で,logging
セクションを追加し,CloudWatch Logs 設定を記載します.awslogs-region
でリージョン,awslogs-group
でロググループ名,tag
でログストリーム名を指定しています.tag
での注意点として CloudWatch Logs APIがストリーム名に:
をサポートしていないため,Docker イメージがalpine:latest
な場合 {{ .ImageName }}
をtag
で指定するとエラーになります.今回のtag
ではredash/redash_8.0.0.b32245-コンテナ名-コンテナ ID
というログストリーム名になるよう指定しています.
version: "2" x-redash-service: &redash-service image: redash/redash:8.0.0.b32245 depends_on: - postgres - redis env_file: /opt/redash/env restart: always services: server: <<: *redash-service command: server ports: - "5000:5000" environment: REDASH_WEB_WORKERS: 4 GUNICORN_CMD_ARGS: "--timeout 90" logging: driver: awslogs options: awslogs-region: ap-northeast-1 awslogs-group: /var/lib/docker/redash/logs tag: '{{ with split .ImageName ":" }}{{join . "_"}}{{end}}-{{.Name}}-{{.ID}}' scheduler: <<: *redash-service command: scheduler environment: QUEUES: "celery" WORKERS_COUNT: 1 logging: driver: awslogs options: awslogs-region: ap-northeast-1 awslogs-group: /var/lib/docker/redash/logs tag: '{{ with split .ImageName ":" }}{{join . "_"}}{{end}}-{{.Name}}-{{.ID}}' scheduled_worker: <<: *redash-service command: worker environment: QUEUES: "scheduled_queries,schemas" WORKERS_COUNT: 1 logging: driver: awslogs options: awslogs-region: ap-northeast-1 awslogs-group: /var/lib/docker/redash/logs tag: '{{ with split .ImageName ":" }}{{join . "_"}}{{end}}-{{.Name}}-{{.ID}}' adhoc_worker: <<: *redash-service command: worker environment: QUEUES: "queries" WORKERS_COUNT: 2 logging: driver: awslogs options: awslogs-region: ap-northeast-1 awslogs-group: /var/lib/docker/redash/logs tag: '{{ with split .ImageName ":" }}{{join . "_"}}{{end}}-{{.Name}}-{{.ID}}' redis: image: redis:5.0-alpine restart: always postgres: image: postgres:9.6-alpine env_file: /opt/redash/env volumes: - /opt/redash/postgres-data:/var/lib/postgresql/data restart: always nginx: image: redash/nginx:latest ports: - "80:80" depends_on: - server links: - server:redash restart: always
docker-compose up -d
で再起動します.CloudWatch Logs の画面を確認すると4つのログストリームができているので意図通りです.
# docker-compose up -d redash_postgres_1 is up-to-date redash_redis_1 is up-to-date Recreating redash_server_1 ... done Recreating redash_scheduled_worker_1 ... done Recreating redash_adhoc_worker_1 ... done Recreating redash_scheduler_1 ... done Recreating redash_nginx_1 ... done
CloudWatch Logs の画面
まとめ
EC2 上に出ていた redash のコンテナログを CloudWatch Logs に出してみました.EC2 のサーバーログを出すより簡単にログを出すことができてログを確認する時は AWS コンソールか VSCode などから確認できるので手間が減るのでありがたい機能です.