CloudWatch Agentでちょっとハマった話

CloudWatch Agentでちょっとハマった話です。CloudWatch Agentは通常のEC2インスタンスのメトリクスに加えて、さらに多くのメトリクスを収集することができます。そんな、CloudWatch Agentをプライベートサブネットから利用した際に、メトリクスを送信することができず、少々ハマりました。。今回はそんな備忘エントリです。
2018.11.23

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、坂巻です。

CloudWatch Agentでちょっとハマった話です。

CloudWatch Agentは通常のEC2インスタンスのメトリクスに加えて、さらに多くのメトリクスを収集することができます。そんな、CloudWatch Agentをプライベートサブネットから利用した際に、メトリクスを送信することができず、少々ハマりました。。今回はそんな備忘エントリです。

やりたい事

プライベートサブネットからCloudWatch Agentでメトリクスを収集したい。

前提

CloudWatch Agentがインストールされていること。インストール方法については以下をご確認ください。

ハマって対応した事

メトリクスの収集対象であるEC2はプライベートサブネットに構築していますので、 CloudWatchのエンドポイントの対象として、com.amazonaws.ap-northeast-1.monitoringを作成しました。

1

CloudWatchのエンドポイントは、インターフェイスエンドポイントになるため、ルートテーブル等は更新不要です。また、EC2にアタッチしてあるIAMロールにはCloudWatchAgentAdminPolicyポリシーを付与しており、CloudWatchへのメトリクスを送信する権限もある状態です。

5

この状態でメトリクスが収集できると思っていたのですが、時間をおいてもメトリクスが収集されることはありませんでした。

2

CloudWatch Agentの状態を確認しました。プロセスは起動しているようです。

$ sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -m ec2 -a status
{
  "status": "running",
  "starttime": "2018-11-20T07:21:00+0000",
  "version": "1.205751.0"
}

エンドポイントの名前解決でも、想定どおりプライベートIPが返却されました。

$ dig monitoring.ap-northeast-1.amazonaws.com

; <<>> DiG 9.9.4-RedHat-9.9.4-61.amzn2.1.1 <<>> monitoring.ap-northeast-1.amazonaws.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 2486
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;monitoring.ap-northeast-1.amazonaws.com. IN A

;; ANSWER SECTION:
monitoring.ap-northeast-1.amazonaws.com. 60 IN A 192.168.3.31
monitoring.ap-northeast-1.amazonaws.com. 60 IN A 192.168.4.199

;; Query time: 2 msec
;; SERVER: 192.168.0.2#53(192.168.0.2)
;; WHEN: Tue Nov 20 07:26:56 UTC 2018
;; MSG SIZE  rcvd: 100

CloudWatch Agentを停止/起動してみました。

$ sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -m ec2 -a stop
Redirecting to /bin/systemctl stop amazon-cloudwatch-agent.service
$ sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -m ec2 -a start
Redirecting to /bin/systemctl restart amazon-cloudwatch-agent.service

/opt/aws/amazon-cloudwatch-agent/logs/amazon-cloudwatch-agent.logログを確認しました。

2018-11-20T07:28:43Z I! cloudwatch: get unique roll up list []
2018-11-20T07:28:43Z I! Starting AmazonCloudWatchAgent (version 1.205751.0)
2018-11-20T07:28:43Z I! Loaded outputs: cloudwatch cloudwatchlogs
2018-11-20T07:28:43Z I! Loaded inputs: disk diskio mem netstat swap tail cpu
2018-11-20T07:28:43Z I! Tags enabled: host=ip-192-168-4-127.ap-northeast-1.compute.internal
2018-11-20T07:28:43Z I! Agent Config: Interval:1m0s, Quiet:false, Hostname:"ip-192-168-4-127.ap-northeast-1.compute.internal", Flush Interval:1s
2018-11-20T07:28:43Z I! The state file /opt/aws/amazon-cloudwatch-agent/logs/state/_var_log_messages for /var/log/messages does not exist: stat /opt/aws/amazon-cloudwatch-agent/logs/state/_var_log_messages: no such file or directory
2018-11-20T07:28:43Z I! cloudwatch: publish with ForceFlushInterval: 1m0s, Publish Jitter: 37s

正常に起動しているようにみえました。。。が、数分すると、以下のメッセージが出力されました。

2018-11-20T07:30:43Z E! ec2tagger: Unable to initialize EC2 Instance Tags : +RequestError: send request failed
caused by: Post https://ec2.ap-northeast-1.amazonaws.com/: dial tcp 54.239.96.159:443: i/o timeout
2018-11-20T07:30:44Z I! cloudwatch: get unique roll up list []
2018-11-20T07:30:44Z I! Starting AmazonCloudWatchAgent (version 1.205751.0)
2018-11-20T07:30:44Z I! Loaded outputs: cloudwatch cloudwatchlogs
2018-11-20T07:30:44Z I! Loaded inputs: disk diskio mem netstat swap tail cpu
2018-11-20T07:30:44Z I! Tags enabled: host=ip-192-168-4-127.ap-northeast-1.compute.internal
2018-11-20T07:30:44Z I! Agent Config: Interval:1m0s, Quiet:false, Hostname:"ip-192-168-4-127.ap-northeast-1.compute.internal", Flush Interval:1s
2018-11-20T07:30:44Z I! The state file /opt/aws/amazon-cloudwatch-agent/logs/state/_var_log_messages for /var/log/messages does not exist: stat /opt/aws/amazon-cloudwatch-agent/logs/state/_var_log_messages: no such file or directory
2018-11-20T07:30:44Z I! cloudwatch: publish with ForceFlushInterval: 1m0s, Publish Jitter: 37s

初期化の際にhttps://ec2.ap-northeast-1.amazonaws.comへのアクセスがあり、そこでタイムアウトが発生しているようです。 com.amazonaws.ap-northeast-1.ec2エンドポイントを追加しました。

4

エンドポイントを追加すると、CloudWatch Agentのメトリクスが収集できました。

6

なお、CloudWatch Agentを使用して、CloudWatch Logsへのログを送信する際は、com.amazonaws.ap-northeast-1.logsエンドポイントも必要になるので注意してください。

7

com.amazonaws.ap-northeast-1.logsエンドポイントがない状態で、CloudWatch Logsへ送信すると、Agentログには以下のようなメッセージが出力されます。

2018-11-21T00:07:29Z E! CreateLogStream / CreateLogGroup with log group name /var/log/messages stream name i-0ae1466b42d3c0786 has errors. Will retry the request: RequestError: send request failed
caused by: Post https://logs.ap-northeast-1.amazonaws.com/: dial tcp 54.239.96.219:443: i/o timeout
2018-11-21T00:07:29Z W! It is the 3 time, going to sleep 1.6s before retrying.

さいごに

プライベートサブネットからCloudWatch Agentを利用する場合は、以下のエンドポイントが必要でした。

  • com.amazonaws.ap-northeast-1.monitoring
  • com.amazonaws.ap-northeast-1.ec2
  • com.amazonaws.ap-northeast-1.logs(CWLへのログを送信する場合)

構築後は意図した通り、メトリクス・ログが収集できているか、必ず確認するようにしましょう。CloudWatch Agentのログをみておけばより安心できると思います。

参考