💽

BigQuery API の Quota を Terraform で設定する

2024/02/29に公開

やりたいこと

BigQuery API の Query usage per day を Terraform から設定したい

どうやるか

基本的には google_service_usage_consumer_quota_override を使って

https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/service_usage_consumer_quota_override.html

こんな感じで書けば良い

resource "google_service_usage_consumer_quota_override" "query_usage_per_day" {
  provider       = google-beta
  project        = var.project_id
  service        = "bigquery.googleapis.com"
  metric         = urlencode("bigquery.googleapis.com/quota/query/usage")
  limit          = urlencode("/d/project")
  override_value = "1048576" # 1 TiB(1MiB * 1024 * 1024) per day
  force          = true
}

ハマりポイント(謎のエラー)

今回、問題が置きたときに Console UI から一旦直接設定したあとに、Terraform で書いて Apply しようとしたところ以下のようなエラーになった。

Error: Error creating ConsumerQuotaOverride: googleapi: Error 409: Cannot create consumer override. The override specified in the request already exists. Please call UpdateConsumerOverride instead with resource name (以下略)

エラーの原因(推測)

https://github.com/hashicorp/terraform-provider-google/issues/15451

このへん見てたんだけど、要するに、1回設定してしまうと(デフォルトのunlimitedに戻したとしても)、resourceが設定されてしまうので、Override できねーよ、と言われてしまうらしい。

エラーの解決

結局、この記事を見ながら該当リソース(手で設定したやつ)を一回消しました。

https://dev.classmethod.jp/articles/service-usage-api-set-custom_quotas/

zshrc に gcurl の alias を設定する

alias gcurl='curl-H "Authorization: Bearer $(gcloud auth print-access-token)" -H "Content-Type: application/json" '

metric の状況を確認

$ METRIC_RESOURCE_NAME="projects/foo-project/services/bigquery.googleapis.com/consumerQuotaMetrics/bigquery.googleapis.com%2Fquota%2Fquery%2Fusage"
$ gcurl https://serviceusage.googleapis.com/v1beta1/${METRIC_RESOURCE_NAME}

レスポンスの以下のような感じ

{
  "name": "projects/123/services/bigquery.googleapis.com/consumerQuotaMetrics/bigquery.googleapis.com%2Fquota%2Fquery%2Fusage",
  "displayName": "Query usage",
  "consumerQuotaLimits": [
    {
      "name": "projects/123/services/bigquery.googleapis.com/consumerQuotaMetrics/bigquery.googleapis.com%2Fquota%2Fquery%2Fusage/limits/%2Fd%2Fproject",
      "unit": "1/d/{project}",
      "metric": "bigquery.googleapis.com/quota/query/usage",
      "quotaBuckets": [
        {
          "effectiveLimit": "157286400",
          "defaultLimit": "9223372036854775807",
          "consumerOverride": {
            "name": "projects/123/services/bigquery.googleapis.com/consumerQuotaMetrics/bigquery.googleapis.com%2Fquota%2Fquery%2Fusage/limits/%2Fd%2Fproject/consumerOverrides/Cg1RdW90YU92ZXJyaWRl",
            "overrideValue": "unlimited"
(以下略)

この部分を使います

      "name": "projects/123/services/bigquery.googleapis.com/consumerQuotaMetrics/bigquery.googleapis.com%2Fquota%2Fquery%2Fusage/limits/%2Fd%2Fproject",

OVERRIDE_RESOURCE_NAME に先程の内容を入れて、削除します

OVERRIDE_RESOURCE_NAME="projects/123/services/bigquery.googleapis.com/consumerQuotaMetrics/bigquery.googleapis.com%2Fquota%2Fquery%2Fusage/limits/%2Fd%2Fproject/consumerOverrides/Cg1RdW90YU92ZXJyaWRl"
gcurl https://serviceusage.googleapis.com/v1beta1/${OVERRIDE_RESOURCE_NAME} -X DELETE

おわりに

余計なリソースを消すと、terraform apply が通るようになりました。

Discussion