Terraformのマルチプロバイダ構成でリソースデプロイ先を切り替える!

GCP

Terraformのマルチプロバイダ構成

Terraformではモジュール内に複数のプロバイダを定義できる。 さらにailiasをキーとして同じプロバイダを複数の異なるパラメータでproviderリソースとして定義できる。

このマルチプロバイダ構成は以下のケースで活きてくる。

  • リージョン、プロジェクトをプロバイダのエイリアスで切り替えたい
  • サービスアカウントとして特定のリソースを作成する

エイリアスの指定方法

プロバイダはリソースブロックのproviderパラメータでプロバイダをaliasプロパティとともに指定する。

provider "google" {
  alias="tokyo"
 ... 

provider.rf

プロバイダにproject、zoneを書いておくことで.tfファイル内のリソース定義を簡略化するとともにリソース作成先プロジェクト/zoneを切り替えられる。

googleプロバイダ特有の事情

GCPプロバイダではlocationパラメータにリージョンを指定する。 しかし、providerリソースはlocationパラメータをとれないためGCPではプロバイダによるデプロイ先リージョンの切り替えができない。したがってデプロイ先の切り替えはゾーンリソースに限定される。

provider "google" {
  alias="tokyo"
  project = "************"
  region= "asia-northeast" #googleプロバイダではlocationパラメータでリージョンを指定するため使い道がない
  #location= "asia-northeast" #エラー
  zone  = "asia-northeast1-a"
}
provider "google" {
  alias="osaka"
  project = "*****************"
  region= "asia-northeast2"
  zone  = "asia-northeast2-a"
}

cloud_storage.tf

providerにlocationを指定することができないため google_storage_bucketでRequiredなパラメータであるlocationを指定している。

resource "google_storage_bucket" "storage_bucket_osaka" {
  provider = google.osaka
  name          = "storage-bucket-osaka-08987678"
  force_destroy = true
  uniform_bucket_level_access = true
  storage_class = "REGIONAL"
  location = "asia-northeast2"
}
resource "google_storage_bucket" "storage_bucket" {
  provider = google.tokyo
  name          = "storage-bucket-08987679"
  force_destroy = true
  uniform_bucket_level_access = true
  storage_class = "REGIONAL"
  location="asia-northeast1"
}

terraform apply

$ terraform apply

Terraform used the selected providers to generate the following execution plan.
Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  # google_storage_bucket.storage_bucket will be created
  + resource "google_storage_bucket" "storage_bucket" {
      + force_destroy               = true
      + id                          = (known after apply)
      + location                    = "ASIA-NORTHEAST1"
      + name                        = "storage-bucket-08987679"
      + project                     = (known after apply)
      + public_access_prevention    = (known after apply)
      + self_link                   = (known after apply)
      + storage_class               = "REGIONAL"
      + uniform_bucket_level_access = true
      + url                         = (known after apply)

      + versioning {
          + enabled = (known after apply)
        }

      + website {
          + main_page_suffix = (known after apply)
          + not_found_page   = (known after apply)
        }
    }

  # google_storage_bucket.storage_bucket_osaka will be created
  + resource "google_storage_bucket" "storage_bucket_osaka" {
      + force_destroy               = true
      + id                          = (known after apply)
      + location                    = "ASIA-NORTHEAST2"
      + name                        = "storage-bucket-osaka-08987678"
      + project                     = (known after apply)
      + public_access_prevention    = (known after apply)
      + self_link                   = (known after apply)
      + storage_class               = "REGIONAL"
      + uniform_bucket_level_access = true
      + url                         = (known after apply)

      + versioning {
          + enabled = (known after apply)
        }

      + website {
          + main_page_suffix = (known after apply)
          + not_found_page   = (known after apply)
        }
    }

Plan: 2 to add, 0 to change, 0 to destroy.

実際に作成されたプロジェクトを見てみると、 異なるプロジェクトにGSCバケットが作成されたことがわかる。

#一つ目のプロジェクト
$gcloud storage buckets list  --format="csv(name,projectNumber)" |grep storage-bucket
storage-bucket-08987679,,************
#二つ目のプロジェクト
$gcloud config set project ***************
Updated property [core/project].
$
$gcloud storage buckets list  --format="csv(name,projectNumber)" |grep storage-bucket
storage-bucket-osaka-08987678,************

あとがき

GCPではエイリアスによる.tfファイルの単純化とデプロイ先切り替えを目的としてマルチプロバイダを使うメリットがほとんどない。これは providerリソースにはlocationを指定できないことが原因。次回はエイリアスによるTerraform実行アカウントの切り替えを試す。

タイトルとURLをコピーしました