ツナワタリマイライフ

日常ネタから技術ネタ、音楽ネタまで何でも書きます。

AWS ECR の Image Scan 結果を Prometheus 形式で Export する OSS 作った

作った。

github.com

いい加減思っているのだけどタイトルが長くてつらい。

でも CloudProvider - Service - Items to export - prometheus - exporter

だとやむなし?

シリーズものです。Prometheus Exporter としては 4作目。

blog.chaspy.me

blog.chaspy.me

blog.chaspy.me

これは何

AWS ECR には Image Scan 機能があり、それを "Findings" として、脆弱性や Severity Level をみることができます。

dev.classmethod.jp

クラメソさんいつもありがとう。

解決したい課題

ECR Image Scan は便利だが、まぁかなりの量が出る。

で、Severity も Critical から Information level まで様々だ。

これが Repository ✖️ Image Tag 分あるというわけで、かなりの量になる。GUI でポチポチみるより、より簡単な方法で可視化したい。

また、Severity level で Filter したり、Repository で Filter して優先度をつけたりというコントロールができるようにならないかと考えている。

f:id:take_she12:20210131184547p:plain

工夫した点

工夫というほどではない(いつもの)

IMAGE_TAG 指定を必須にした

仕様の問題だが、IMAGE_TAG 指定を必須にしました。あと現状 Image Digest での Image 指定はサポートしていません。

ユースケースを考えても特定リポジトリに対応する特定の Tag だけ見れればいいはず&Image Tag を指定しての API Call はまとめてできないので、いっそ必須にしてしまった。

あとあとで触れるがパフォーマンスの問題があるので、Image Tag で絞り込まないと結構キツい。

Pagination Support

まぁ数が多いのでちゃんと追いかけるようにした。

NextToken があれば Set、なければ終わるとすればいいだけなので楽だった。

github.com

今後改善する点

Performance

地獄の For Loop をキメてしまっているので、API Call は並行で処理できるようにしてパフォーマンスを改善する

Error Handling

この部分を switch 使えだの errors.As を使えなどと linter が言ってくるんですが

github.com

正直どうすればいいかわかってない。型アサーションは errors.As でできそうだけど、そのあと Error Name? Code? ごとに例外をキャッチしていくのをどうすればいいのかわかってない。誰かペアプロしてください。

Attributes の取得

Attributes が Key と Value をそれぞれ持った struct の List なんだけど

ecr - Amazon Web Services - Go SDK

こんな風にぐるぐるまわして switch case で取らないといけないのマジ?ってなっている。でもそんなもん?

github.com

感想

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 で取得できるんだが

docs.aws.amazon.com

  • MySQL: {DBInstanceClassMemory/12582880}
  • PostgreSQL: LEAST({DBInstanceClassMemory/9531392}, 5000)

マジでこういう値が入っている。

これを Parse し、Instance Class とその Memory size を取得して計算するというロジックを実装しないといけない。だるそう。

とはいえこれができると、現状の connection 数が max_con に達しそうだよ〜ってアラートが作れるので、役に立つ可能性は高いのでやる。

おしまい。