Docker-composeのログをCloudwatch Logsに転送する場合、Amazon EC2であればIAM Roleをインスタンスプロファイルとして設定すれば自動的にAPIクレデンシャルを取得してログを出力してくれる。
ところが、Azure VMなどAmazon EC2でないサーバからDocker-composeでログ出力しようとすると、~/.aws/credentialsにAPIキーを設定しても以下のようなエラーメッセージが出て上手く行かないことがある。
ERROR: for jitakurack_web_1 Cannot start service web: failed to initialize logging driver: failed to create Cloudwatch log stream: NoCredentialProviders: no valid providers in chain. Deprecated.
Starting jitakurack_streaming_1 … error
このエラーは、DockerサービスがAPIキーを上手く取得出来ていない。手元の環境だとsystemd環境だと起こるような気がする。なので、systemd経由でAPIキーをDockerサービスに引き渡してあげると動くようになる。
で、 https://wdullaer.com/blog/2016/02/28/pass-credentials-to-the-awslogs-docker-logging-driver-on-ubuntu/ の情報に従って、Dockerサービスの環境変数を追加する。
$ sudo mkdir -p /etc/systemd/system/docker.service.d/
$ sudo touch /etc/systemd/system/docker.service.d/aws-credentials.conf
[Service]
Environment=”AWS_REGION=<aws_region>”
Environment=”AWS_ACCESS_KEY_ID=<aws_access_key_id>”
Environment=”AWS_SECRET_ACCESS_KEY=<aws_secret_access_key>”
$ sudo systemctl restart docker.service
$ docker-compose logs
Attaching to jitakurack_streaming_1, jitakurack_web_1, jitakurack_sidekiq_1
sidekiq_1 | WARNING: no logs are available with the ‘awslogs’ log driver
streaming_1 | WARNING: no logs are available with the ‘awslogs’ log driver
web_1 | WARNING: no logs are available with the ‘awslogs’ log driver
あとはCloudwatch Logsのコンソールを確認すればログが出ている。