ねぎ嫌い

思いついたことをてきとうに。

Cloud Run x Cloud SQLでGrafanaをTerraformで立てる

背景

  • プロダクトの監視に安くダッシュボードを作りたい
  • 運用コストをあんまり上げたくない

=> (フル)マネージドな環境でGrafanaを立てればええやん

TL;DR

github.com

前提

  • GCPのプロジェクトがセットアップされている

構築手順

  1. Terraformを記述する
  2. Deployする

以上

Terraformの環境セットアップ

terraform --helpコマンドが使えない人向け。

公式に従ってインストールするのも良いけれど、バージョン管理が面倒だと思うので、tfenvを入れる。
GitHubに記載の手順に従ってインストールする。

Macなので brew install tfenv を実行すれば良い。

その後、tfenv install latest && tfenv use latest を実行すると terraform --help が使えるようになる。

.tfファイルを実装する

必要になるのは大きく分けて2つ。

  • GCPの定義を書いた.tfファイル
  • Grafanaの定義を書いた.tfファイル

またそれらのProviderを管理するためのファイルの3つで管理すると見通しが良い。

GCPの定義

作成する必要があるのは、

  • Cloud SQL
  • Cloud Run
  • Cloud RunとCloud SQLを接続出来るようにするためのVPC

3つ目はCloud SQLをPublicなネットワークに公開する覚悟がある人は不要だと思う。
私は自信がないのでVPCを貼ってその上で接続するようにしている(というか参考にしたものがそうだったのでそれに乗っかっただけ)。

詳細は 参考先のソース を見てもらったほうが早い。

複数人で運用する想定なら、tfstatをGCSにあげて管理するのも考えて良いかも。 その場合は以下追記する。

terraform {
  backend "gcs" {
    bucket  = "事前に手作業で用意したバケット名"
    prefix = "バケット内のパス(必要があれば)"
  }
}

terraform"を"管理するためのリソースはterraform外で管理されるべき、というどこかで聞き覚えたものに従ってるので手作業が必要。
(元ネタ誰か分かったら教えてほしいです、、、)

Deployする

Service Accountでの適用が望ましいため、GCP上でService Accountおよびキーの払い出しを行い、 GOOGLE_APPLICATION_CREDENTIALSに取得した鍵ファイル(.json)のパスを指定してあげる。

その上で、terraform apply を実施する。

defaultが未定義な変数に関しては対話式で聞かれるので回答してあげればOK。
初回はDB構築等も含まれるので5分以上かかるかも。

以上。

ハマりポイント

  • Service Accountの権限

必要な権限のみを割り当てるべき、という大原則は認識しているものの、洗い出しが面倒だったのでオーナー権限付けた。
特にネットワークの構成あたりで死んでたのはこれで解決した。編集者じゃ足りない模様。

  • Cloud SQLの削除に失敗して terraform destroyterraform init も通らんくなる

コンソールから残ってしまったリソースを削除した上で、tfstatファイルも削除する。
と、terraform applyが通るようになる。

ボツにした構成

  • GKEに立てる
  • GCEにインスタンスを立てて、その上でDocker Composeで拡張性を考慮した構成にする

GKEに立てて上げるほどのものでもなかったので、 && キャッチアップコストが高すぎたので却下
GKEに慣れている人は多分サクッと構築出来るんだと思う。

GCEにインスタンス立ててやるのはSSL証明書の準備やロードバランサの構成等を考えるのが面倒だったので却下。
またContainer Optimized OSの癖が強すぎるのもあったw