作った。
いい加減思っているのだけどタイトルが長くてつらい。
でも CloudProvider - Service - Items to export - prometheus - exporter
だとやむなし?
シリーズものです。Prometheus Exporter としては 4作目。
これは何
AWS ECR には Image Scan 機能があり、それを "Findings" として、脆弱性や Severity Level をみることができます。
クラメソさんいつもありがとう。
解決したい課題
ECR Image Scan は便利だが、まぁかなりの量が出る。
で、Severity も Critical から Information level まで様々だ。
これが Repository ✖️ Image Tag 分あるというわけで、かなりの量になる。GUI でポチポチみるより、より簡単な方法で可視化したい。
また、Severity level で Filter したり、Repository で Filter して優先度をつけたりというコントロールができるようにならないかと考えている。
工夫した点
工夫というほどではない(いつもの)
IMAGE_TAG 指定を必須にした
仕様の問題だが、IMAGE_TAG 指定を必須にしました。あと現状 Image Digest での Image 指定はサポートしていません。
ユースケースを考えても特定リポジトリに対応する特定の Tag だけ見れればいいはず&Image Tag を指定しての API Call はまとめてできないので、いっそ必須にしてしまった。
あとあとで触れるがパフォーマンスの問題があるので、Image Tag で絞り込まないと結構キツい。
Pagination Support
まぁ数が多いのでちゃんと追いかけるようにした。
NextToken があれば Set、なければ終わるとすればいいだけなので楽だった。
今後改善する点
Performance
地獄の For Loop をキメてしまっているので、API Call は並行で処理できるようにしてパフォーマンスを改善する
Error Handling
この部分を switch 使えだの errors.As を使えなどと linter が言ってくるんですが
正直どうすればいいかわかってない。型アサーションは errors.As でできそうだけど、そのあと Error Name? Code? ごとに例外をキャッチしていくのをどうすればいいのかわかってない。誰かペアプロしてください。
Attributes の取得
Attributes が Key と Value をそれぞれ持った struct の List なんだけど
ecr - Amazon Web Services - Go SDK
こんな風にぐるぐるまわして switch case で取らないといけないのマジ?ってなっている。でもそんなもん?
感想
RDS のやつよりは面倒でした。あとこれもまた metric 送って眺めて味ってみないと役に立つかどうかはまだわかりません。
次回作
aws-rds-max-connections-prometheus-exporter
RDS の max connections を metric として送る。
現状、Datadog Integration ではこれらは取れていない。
いまは Connection の Anomary Detection のAlert をつけているが、False Positive に飛んできたりする。
で、max connections は parameter group の中にあってそれは API で取得できるんだが
- MySQL: {DBInstanceClassMemory/12582880}
- PostgreSQL: LEAST({DBInstanceClassMemory/9531392}, 5000)
マジでこういう値が入っている。
これを Parse し、Instance Class とその Memory size を取得して計算するというロジックを実装しないといけない。だるそう。
とはいえこれができると、現状の connection 数が max_con に達しそうだよ〜ってアラートが作れるので、役に立つ可能性は高いのでやる。
おしまい。