継続は力なり

タイトル通り定期的な更新を心掛けるブログです。

redash のコンテナログを CloudWatch Logs に出力する

タダです.

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 の画面 f:id:sadayoshi_tada:20210730065524p:plain

まとめ

EC2 上に出ていた redash のコンテナログを CloudWatch Logs に出してみました.EC2 のサーバーログを出すより簡単にログを出すことができてログを確認する時は AWS コンソールか VSCode などから確認できるので手間が減るのでありがたい機能です.