この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
こんにちは、坂巻です。
CloudWatch Agentでちょっとハマった話です。
CloudWatch Agentは通常のEC2インスタンスのメトリクスに加えて、さらに多くのメトリクスを収集することができます。そんな、CloudWatch Agentをプライベートサブネットから利用した際に、メトリクスを送信することができず、少々ハマりました。。今回はそんな備忘エントリです。
やりたい事
プライベートサブネットからCloudWatch Agentでメトリクスを収集したい。
前提
CloudWatch Agentがインストールされていること。インストール方法については以下をご確認ください。
ハマって対応した事
メトリクスの収集対象であるEC2はプライベートサブネットに構築していますので、
CloudWatchのエンドポイントの対象として、com.amazonaws.ap-northeast-1.monitoring
を作成しました。
CloudWatchのエンドポイントは、インターフェイスエンドポイントになるため、ルートテーブル等は更新不要です。また、EC2にアタッチしてあるIAMロールにはCloudWatchAgentAdminPolicy
ポリシーを付与しており、CloudWatchへのメトリクスを送信する権限もある状態です。
この状態でメトリクスが収集できると思っていたのですが、時間をおいてもメトリクスが収集されることはありませんでした。
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
エンドポイントを追加しました。
エンドポイントを追加すると、CloudWatch Agentのメトリクスが収集できました。
なお、CloudWatch Agentを使用して、CloudWatch Logsへのログを送信する際は、com.amazonaws.ap-northeast-1.logs
エンドポイントも必要になるので注意してください。
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のログをみておけばより安心できると思います。