GCPのインスタンスをAWSから監視する(stackdriver_exporter)


はじめに

先日からGCPを触っているが、その際にPrometheusからGCPの監視データを取得してくれるstackdriver_exporterを見つけた。
今回はこのstackdriver_exporterをAWS(EC2)上に構築してそこからGCPのデータを取得してみようと思う。
なお、大きく使う予定がないのでAWS-GCP間の連携にWorkload Identityは使用しない。

前提

GCP上のIAMで「閲覧者」のサービスアカウントとキーを作成しておくこと。
(github上では「roles/monitoring.viewer」でいいと書いてあるが動かなかったので)

GCP設定ファイル設置

作成したキーファイルを配置して参照用の環境変数ファイルを設置しておく。
暫定で今回は/root/.gcp.jsonに設置した前提とする。

/root/gcpenv
GOOGLE_APPLICATION_CREDENTIALS=/root/.gcp.json

バイナリ取得

バイナリ取得
wget https://github.com/prometheus-community/stackdriver_exporter/releases/download/v0.11.0/stackdriver_exporter-0.11.0.linux-amd64.tar.gz
tar -zxf stackdriver_exporter-0.11.0.linux-amd64.tar.gz
mv stackdriver_exporter-0.11.0.linux-amd64/stackdriver_exporter /usr/local

サービス化とコンフィグファイル作成

stackdriver_exporterはコマンド実行時に監視項目などOptionを指定する作りになっているのでこのままサービス化しても使いづらい。
他のPrometheus系のRPMのようにOptionを/etc/default/stackdriver_exporterから参照できるよう設定を少しいじっている。
※併せてGOOGLE_APPLICATION_CREDENTIALSも参照設定も入れている。

サービス用コンフィグ

/usr/lib/systemd/system/stackdriver_exporter.service
[Unit]
Description=stackdriver-exporter
After=network.target

[Service]
EnvironmentFile=-/etc/default/stackdriver_exporter
EnvironmentFile=/root/gcpenv
Type=simple
User=root
ExecStart=/usr/local/stackdriver_exporter $STACKDRIVER_EXPORTER_OPTS

[Install]
WantedBy=multi-user.target

stackdriver_exporterコンフィグ

ここにコマンドオプションを切り出しているので監視項目を変更する際はここを変更する。
この例ではGCPインスタンスcpu,memory,disk,network全てを取得する設定としている。

/etc/default/stackdriver_exporter
STACKDRIVER_EXPORTER_OPTS='--monitoring.metrics-type-prefixes "compute.googleapis.com/instance/cpu,compute.googleapis.com/instance/disk,compute.googleapis.com/instance/memory,compute.googleapis.com/instance/network"'

サービス登録&起動

サービス登録&起動
systemctl enable stackdriver_exporter
systemctl start stackdriver_exporter

Prometheus設定追加

prometheusに参照設定を入れてreloadする。

/etc/prometheus/prometheus.yml
  - job_name: stackdriver-exporter
    static_configs:
      - targets: ['localhost:9255']

以下のような感じでGCPのインスタンスの情報が取得できる。

あとがき

クラウドサービスはそれぞれで監視機能を持っているのでマルチクラウドなところだと各環境毎に監視サーバを持ってしまっているケースってよくみる。
それ自体は悪いことではないのだけどやっぱり本末転倒な気がするので、今回新たに専用のインスタンスを増やさずGCPを監視させる形を作れたのはよかった。
なんかできそうな感じがするので次回はこれまで作ってきたprometheusをGCPに複製してAWS-GCP間で冗長化する、という記事を書こうかと思っている。
※最終型がしょぼい感じになりそうなので再検討
なお、なんでもかんでもAWS・Prometheus前提になっているが私はそのあたりからの回し者ではない。全然別の記事も書きたい。