0

GCP での Terraform の使用に関するこの記事を読みました。

https://cloud.google.com/community/tutorials/managing-gcp-projects-with-terraform

ほとんど機能していますが、いくつかの問題に遭遇し、明確にしたいと思いました。

Terraform 管理プロジェクトを作成し、そのプロジェクトでロール/ビューアーとロール/storage.admin ロールを持つサービス アカウントを作成しました。次に、管理プロジェクトでバケットを作成し、それを Terraform バックエンド ストレージとして使用します。

terraform {                                                                                                                                                                                                        
  backend "gcs" {                                                                                                                                                                                                  
    bucket      = "test-terraform-admin-1"                                                                                                                                                                         
    prefix      = "terraform/state"                                                                                                                                                                                
    credentials = "service-account.json"                                                                                                                                                                           
  }                                                                                                                                                                                                                
}

次に、そのサービス アカウントを使用して別のプロジェクトを作成し、そのプロジェクトにリソースをプロビジョニングします。

provider "google" {                                                                                                                                                                                                
  alias       = "company_a"                                                                                                                                                                                    
  credentials = "./service-account.json"                                                                                                                                                                           
  region      = "us-east4"                                                                                                                                                                                         
  zone        = "us-east4-c"                                                                                                                                                                                       
  version = "~> 2.12"                                                                                                                                                                                              
}

resource "google_project" "project" {                                                                                                                                                                              
  name            = var.project_name                                                                                                                                                                               
  project_id      = "${random_id.id.hex}"                                                                                                                                                                          
  billing_account = "${var.billing_account}"                                                                                                                                                                       
  org_id          = "${var.org_id}"                                                                                                                                                                                
}

次のように、terraform で作成されたプロジェクトのサービスを有効にすれば十分だと考えました。

resource "google_project_service" "container_service" {                                                                                                                                                            
  project = "${google_project.project.project_id}"                                                                                                                                                                 
  service = "container.googleapis.com"                                                                                                                                                                             
}

ただし、terraform が gke クラスタを作成しようとしたときにエラーが発生しました。

resource "google_container_cluster" "primary" {                                                                                                                                                                    
  project = "${google_project.project.project_id}"                                                                                                                                                                 
  name    = "main-gke-cluster"                                                                                                                                                                                     

  node_pool {                                                                                                                                                                                                      
    ....
  }                                                                                                                                                                                                             
  network = "${google_compute_network.vpc_network.self_link}"                                                                                                                                                      
}

私のプロジェクトではコンテナ サービスがまだ有効化されておらず、(google_project リソースで作成されたプロジェクトではなく) Terraform 管理プロジェクト ID を参照しているとのことでした。サービス アカウントがサービス アカウントによって作成されたプロジェクトでこれらのサービスにアクセスできるようにするには、terraform 管理プロジェクトでサービスを有効にする必要があるようです。

実際、terraform 管理プロジェクトで有効になっている限り、作成プロジェクトでコンテナー、サービス ネットワーキングなどのサービスを有効にすることなく、それを機能させることができます。

1 つのプロジェクトのサービスが、親プロジェクトのサービス アカウントから作成されたプロジェクトに継承されるプロジェクト間に親子関係はありますか? これは事実のようですが、これに関するドキュメントはどこにも見つかりません。

聞いてくれてありがとう!

4

1 に答える 1