Wantedly ではデータサイエンティストや ML エンジニアの自己研鑽のために、希望する社員には個人で使える GCP プロジェクトが 1つ割り当てされます。予算は月額5万円を目安に、多い場合には最大月額10万円まで許容されます。
もともとは業務とは直接関係がない Kaggle や論文の検証・追実装を行うための環境が欲しいという要望から生まれた制度です。
この制度は Wantedly のエンジニアなら誰でも利用することができるため、任意のタイミングで Wantedly Organization に GCP プロジェクトが湧きます。
予算アラートを一括設定する Terraform
Wantedly の GCP プロジェクトの設定は Terraform で管理されており、インフラチームが監査ログ設定や管理者設定を Organization レベルの設定で行っているので新しい設定は必要ありません。しかし予算アラートの設定だけは個別に新しい GCP プロジェクトを指定する必要があります。これを毎回手動で設定するのは面倒、なんなら Terraform で書いて PR 出すことすらも面倒なので、存在する個人向け GCP プロジェクト全てに一括で予算アラートを設定する Terraform を、data source と for_each を使ってシュッと書きました。
やっていること
- 個人向け GCP プロジェクト名の命名規則を individual-* として、その命名規則に一致する GCP プロジェクト名を google_projects data source で取得する
- 取得した個人向け GCP プロジェクトに対して google_billing_budget resource と for_each 構文を使って予算アラートを設定する
// 請求アカウントを取得する
data "google_billing_account" "main" {
billing_account = "XXXXX-XXXXX-XXXXX"
}
// 命名規則に一致する GCP プロジェクトを取得する
data "google_projects" "individual_projects" {
filter = "name:individual-*"
}
// GCP プロジェクト ID と Number が必要なので、さらに data source で詳細を取得する
data "google_project" "individual_project_details" {
for_each = toset([for project in data.google_projects.individual_projects.projects : project.project_id])
project_id = each.value
}
// for_each で取得したすべての GCP プロジェクトの予算設定をする
resource "google_billing_budget" "individual_projects" {
for_each = { for project in data.google_project.individual_project_details : project.project_id => project.number }
billing_account = data.google_billing_account.main.id
display_name = each.key
budget_filter {
projects = ["projects/${each.value}"]
}
amount {
specified_amount {
// 請求アカウントで設定されている国の通貨じゃないと apply 失敗するので注意
// https://github.com/hashicorp/terraform-provider-google/issues/9375#issuecomment-866697970
currency_code = "JPY"
units = "50000"
}
}
threshold_rules {
threshold_percent = 2.0
spend_basis = "CURRENT_SPEND"
}
threshold_rules {
threshold_percent = 1.0
spend_basis = "CURRENT_SPEND"
}
threshold_rules {
threshold_percent = 0.8
spend_basis = "CURRENT_SPEND"
}
}
あとはこのコードを Github Actions 等の Cron workflow で定期的に実行するようにすると、面倒な予算アラートの設定から解放されます。自動で apply までするので、万が一 apply 起因でサービス影響が出ないように、通常のプロダクトリソースとは tfstate を分けて管理します。
ただこのコード、管理対象の状態によって実行計画が動的に変わることを利用しているので宣言的な管理という観点からすると難しい気持ちになります。でも便利です。