img.webp

まとめ

  • Terraform で google_api_gateway_api_config に api_config_id は設定しない

以下詳細

  • 以下のように api_config_id を設定すると、再作成時にエラーが発生する
resource "google_api_gateway_api_config" "default" {
  project  = var.project_id
  provider = google-beta
  api      = google_api_gateway_api.default.api_id
  api_config_id = "${var.env}-${var.service}-api-config"
  openapi_documents {
    document {
      path = "openapi.yaml"
      contents = base64encode(templatefile("${path.module}/openapi.yaml", {
        title           = "${var.env} ${var.service} API"
        description     = "This is the API for ${var.env} ${var.service}"
        version         = "1.0.0"
        managed_service = google_api_gateway_api.default.managed_service
        func_url        = google_cloud_run_service.default.status[0].url
      }))
    }
  }
  lifecycle {
    create_before_destroy = true
  }
}
│ Error: Error creating ApiConfig: googleapi: Error 409: Resource 'projects/{project_id}/locations/global/apis/{api_id}/configs/{api_config_name}' already exists
│ Details:
│ [
│   {
│     "@type": "type.googleapis.com/google.rpc.ResourceInfo",
│     "resourceName": "projects/{project_id}/locations/global/apis/{api_id}/configs/{api_config_name}"
│   }
│ ]
  • 一見、create_before_destroy = true が指定されているので、新しいリソースを作成してから古いリソースを削除するように見えるが、 実際には api_config_id が変更されていないため、新しいリソースを作成することができない
  • 省略した場合はタイムスタンプベースでIDが振られている… terraform-YYYYMMDDHHMMSS000000000001-xxxxxxxxxxxxx