CloudWatchメトリクス

もう何番煎じかわからないレベルですが、CloudWatchのメトリクスをInfrabbitのZabbixへ送信するLambdaFunctionを作成しました。
TerraformのModuleとして作成したので、TemplateConstructionに組み込んでいこうと思います。

もっとも対応しているRDSがまだAuroraだけなのですが。

ちょっと変わっているところといえば、ZabbixのLLDをベースにしており、RDSのClusterName一覧を取得して、動的にRDSクラスタをZabbixにホストとして登録し、Active Checkを投げさせて一緒にHostMetadataを送信させ、Zabbixの自動登録でクラスタをホストとして登録しています。
そして、そのCluster単位でアイテムをLLDで自動生成しているところでしょうか。
メトリクスを投げる、というのはあちこちで見かけるのですが、Zabbixの自動登録アクションを走らせるためにActiveCheckにHostMetadataをつける、というのはほとんど見かけない(というか用途が限定されすぎてて汎用性に欠けている気がする)ので、結局ZabbixのProtocolドキュメントを読み漁る羽目になりました。

まあとはいえZabbixのProtocolはとても素直なものなのですが。

ListMetricsでUnitまで取れればよかったんですが、Unitはget系を走らせないといけなかったのでDiscoveryでもMetrics送信でもget_metrics_statisticsが大量に走るという…。

get_metrics_dataとどっちが安くなるんでしょうね。
あまり取得頻度を上げるとAPIコールで破産するので、5分Periodですが、アラートはそもそもCloudWatchから投げさせるべきなので、どちらかというと状況把握のために可視化ツールに一元で表示したかった、というのが主目的ですから十分な粒度なのです。

ホストやRDSの自動登録はこんな感じで良さそうなので、あとは自動削除系を組まないといけないですね。
Zabbixをコンテナにしてしまっていて、これをいちいちアップデートしたくないので、boto3込みでExternalScriptを設置しないといけないなぁ、ということでちょっと先送りにしている感じです。

タスクをずらっと並べてみたのですが、どうもこまごまとしたタスクが多くてげんなりしているところですが、来月にはFargateも来ますし、ちょっと気合を入れないといけないですね。
とりあえずこれで、
・EC2のメンテナンス予定の発生を検知してSlack通知
・Googleカレンダーから向こう三年の休日祝日リストを作成してS3に配置
・自動スナップショットと世代管理
・RDSのメトリクス取得とクラスタ取得
・パブリック/プライベートドメインへのDNSレコードの自動登録
とLambdaFunctionが少々増えてきました。

なんだかんだでダウンしないジョブ実行エンジン、というのは本当に便利です。
異常はCloudWatchLogsから通知させておけばよいので、だいぶ気持ち的には楽です。

InfrabbitでのAWS構築案件ではInfrabbitの監視系である上記システムが同梱される予定です。
CloudWatchアラート回りがまだ不十分なので、来週はそちらに手を付けていきたいと思います。