0

我阅读了这篇关于将 Terraform 与 GCP 结合使用的文章:

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}"                                                                                                                                                      
}

它说我的项目尚未启用容器服务,它引用了 terraform 管理项目 ID(不是使用 google_project 资源创建的项目!)。似乎我必须启用 terraform admin 项目上的服务,以便服务帐户访问由服务帐户创建的任何项目上的这些服务。

事实上,只要在 terraform admin 项目上启用了容器、servicenetworking 等服务,我就可以让它工作,而无需在 create 项目上启用它们。

项目之间是否存在某种父/子关系,其中一个项目中的服务由从父项目中的服务帐户创建的项目继承?这似乎是这种情况,但我在任何地方都找不到任何关于此的文档。

谢谢收听!

4

1 回答 1

0

在我的公司,我们在此文件夹中创建了一个文件夹和一个服务帐户。然后,我们为 terraform 创建了一个项目,每个 terraform 作业使用文件夹级服务帐户在此文件夹中创建项目和资源。

由于角色和权限是从文件夹继承到较低级别(文件夹或项目)的,因此创建资源没有问题。

如果它对您的特定问题有帮助,我不会,但对我们来说,它解决了很多问题并简化了服务帐户管理。

于 2019-08-14T18:49:19.860 回答