のーずいだんぷ

主に自分用メモですが、もしかしたら誰かの役に立つかもしれません

CloudWatchLogsエージェント(awslogs)がS3に保存している設定ファイルをフェッチできない

何をしようとしたのか

タイトルの通り、EC2インスタンスのログをCloudWatchLogsに集めるためにCloudWatchLogsエージェントを使用しているのだが、 新しいAMIに導入したところ転送処理が行われなくなったのでそのときの対処したことを記録しておく。

詳しい状況(調査履歴、結論だけでも十分です)

同様の現象が別の要因によって起こることもありうるので、一応こんな感じでしたということを記載しておく。

プロセスはちゃんとrunning
$ systemctl status awslogs.service
● awslogs.service - LSB: Daemon for AWSLogs agent.
   Loaded: loaded (/etc/init.d/awslogs; generated)
   Active: active (exited) since Thu 2019-10-10 02:53:04 UTC; 52s ago
     Docs: man:systemd-sysv-generator(8)
  Process: 2802 ExecStop=/etc/init.d/awslogs stop (code=exited, status=0/SUCCESS)
  Process: 2833 ExecStart=/etc/init.d/awslogs start (code=exited, status=0/SUCCESS)

Oct 10 02:53:04 ip-172-31-31-162 systemd[1]: Starting LSB: Daemon for AWSLogs agent....
Oct 10 02:53:04 ip-172-31-31-162 awslogs[2833]: Starting system awslogs daemon
Oct 10 02:53:04 ip-172-31-31-162 awslogs[2833]: process already running.
Oct 10 02:53:04 ip-172-31-31-162 awslogs[2833]:  * /var/awslogs/bin/awslogs-agent-launcher.sh is running
Oct 10 02:53:04 ip-172-31-31-162 systemd[1]: Started LSB: Daemon for AWSLogs agent..
ログを確認

設定ファイルないと怒られている。

$ cat /var/log/awslogs.log 

File '/var/awslogs/etc/awslogs.conf' does not exist

File '/var/awslogs/etc/awslogs.conf' does not exist
設定ファイル確認

特に指定しなければデフォルトでは/var/awslogs/etc/awslogs.confにあるはず… →なかった。自動デプロイがうまく行ってなかったのかな?手動でエージェントを再実行してみよう!

手動でエージェントに設定をフェッチ
$ ./awslogs-agent-setup.py -n -r ap-northeast-1 -c s3://cloudwatch-configuration/cloudwatch-config

Step 1 of 5: Installing pip ...libyaml-dev does not exist in system DONE

Step 2 of 5: Downloading the latest CloudWatch Logs agent bits ... DONE

fatal error: Unable to locate credentials

Step 5 of 5: Setting up agent as a daemon ...DONE


------------------------------------------------------
- Configuration file successfully saved at: /var/awslogs/etc/awslogs.conf
- You can begin accessing new log events after a few moments at https://console.aws.amazon.com/cloudwatch/home?region=ap-northeast-1#logs:
- You can use 'sudo service awslogs start|stop|status|restart' to control the daemon.
- To see diagnostic information for the CloudWatch Logs Agent, see /var/log/awslogs.log
- You can rerun interactive setup using 'sudo python ./awslogs-agent-setup.py --region ap-northeast-1 --only-generate-config'
------------------------------------------------------

途中失敗しているけどConfiguration file successfully saved at: /var/awslogs/etc/awslogs.confってでているのでおそらくうまく行っているかな?。 →色々見に行った結果、また設定ファイルがないことを確認…

結論

今回はS3から設定ファイルをインストールするようにコマンドの引数で指示していたが、どうやらインスタンスにアタッチしていたロールではS3:GetObjectが許可されておらずダウンロードできていなかったようだ。 (なんでsuccessって出たんだ…そうしたら余計な不具合調査せずにわかったのに…) どうやら次のように表示が出ることもあるらしく、おそらくそれなら気づいていたと思う。

# ./awslogs-agent-setup.py -n -r ap-northeast-1 -c s3://cloudwatch-configuration/cloudwatch-config

Step 1 of 5: Installing pip ...libyaml-dev does not exist in system DONE

Step 2 of 5: Downloading the latest CloudWatch Logs agent bits ... DONE

fatal error: An error occurred (403) when calling the HeadObject operation: Forbidden

Step 5 of 5: Setting up agent as a daemon ...DONE

うまく行った場合のログ

$ ./awslogs-agent-setup.py -n -r ap-northeast-1 -c s3://cloudwatch-configuration/cloudwatch-config

Step 1 of 5: Installing pip ...libyaml-dev does not exist in system DONE

Step 2 of 5: Downloading the latest CloudWatch Logs agent bits ... DONE

download: s3://cloudwatch-configuration/cloudwatch-config to ../var/awslogs/etc/awslogs.conf

Step 5 of 5: Setting up agent as a daemon ...DONE

また一応設定ファイルも確認してみた。

$ ls /var/awslogs/etc/
aws.conf  awslogs.conf  config  proxy.conf

ちゃんとあるみたい、ログも転送されるようになっていた。 AWSではIAMでうまく行かないことが多いので、今度権限不足で少し詰まったやつをまとめようと思う。

AWSで挙動がおかしい時、頭の片隅にIAMの権限不足を入れとこう