Google CloudのAPI GatewayでAPI Keyを使用したAPIを作成する - Terraform編

# はじめに

どうも、@to-fmakです。前回はGoogle CloudのAPI GatewayでAPI Keyを使用したAPIを作成する方法をご紹介したのですが、今回はTerraformでの実現方法について簡単に共有したいと思います。

https://qiita.com/GleapPost/private/799c83e3b26eebb0f3d6

# サンプルコード

以下、サンプルコードです。実際に利用する際に、変数とproviderを修正し、OpenAPIやIAMなどの設計を適宜行ってから適用してください。

```hcl:providers.tf
terraform {
  required_version = "~> 1.9.0"

  required_providers {
    google = {
      source  = "hashicorp/google"
      version = "~> 6.10.0"
    }

    google-beta = {
      source  = "hashicorp/google-beta"
      version = "~> 6.12.0"
    }
  }
}

provider "google" {
  project = var.project_id
  region  = var.region
}

```

```hcl:main.tf
resource "google_api_gateway_api" "sample" {
  provider = google-beta
  api_id   = "sample-api"
}

resource "google_api_gateway_api_config" "sample" {
  provider      = google-beta
  api           = google_api_gateway_api.sample.api_id
  api_config_id = "sample-api-config"

  gateway_config {
    backend_config {
      google_service_account = google_service_account.sample.email
    }
  }

  openapi_documents {
    document {
      path = "spec.yaml"
      contents = filebase64("test-fixtures/openapi.yaml")
    }
  }
}

resource "google_api_gateway_gateway" "sample" {
  provider   = google-beta
  api_config = google_api_gateway_api_config.sample.id
  gateway_id = "sample-api-gateway"
}

```

```hcl:service_account.tf
resource "google_service_account" "sample" {
  account_id   = "api-gateway-sa"
  display_name = "API Gateway Service Account"
}

```

```hcl:api_key.tf
resource "google_project_service" "sample" {
  service = google_api_gateway_api.sample.managed_service
}

resource "google_apikeys_key" "sample" {
  name         = "sample-api-key"
  display_name = "sample-api-key"

  restrictions {
    api_targets {
      service = google_project_service.sample.service
    }
  }
}

```

```hcl:variables.tf
variable "project_id" {
  type = string
}

variable "region" {
  type = string
}

```

# ポイントの解説

過去記事にも記載しましたが、API Gatewayで作成したAPIの認証にAPIキーを使用する場合は、サービスでAPIキーのサポートを有効にする必要があります。

詳しくは公式ドキュメントをご確認ください。

https://cloud.google.com/api-gateway/docs/authenticate-api-keys?hl=ja

Terraformで該当処理を行いたい場合、まずgoogle_project_serviceリソースで作成済みのgoogle_api_gateway_apiリソースのmanaged_serviceに対してAPIの有効化を行います。

```hcl
resource "google_project_service" "sample" {
  service = google_api_gateway_api.sample.managed_service
}
```

次に、google_apikeys_keyリソースのrestrictionsのapi_targetsブロックで、該当APIキーを対象APIの使用に限定するよう権限設定を行います。

```hcl
resource "google_apikeys_key" "sample" {
  name         = "sample-api-key"
  display_name = "sample-api-key"

  restrictions {
    api_targets {
      service = google_project_service.sample.service
    }
  }
}
```

# 参考URL

- https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/api_gateway_api

- https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/api_gateway_api_config

- https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/api_gateway_gateway

- https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/google_project_service

- https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/apikeys_key

# エンジニア募集

Gakken LEAP では教育をアップデートしていきたいエンジニアを絶賛大募集しています！！
ぜひお気軽にカジュアル面談へお越しください！！

https://gakken-leap.co.jp/recruit/