需要说明如何使用 Terraform 管理 Google Cloud 项目

Posted

技术标签:

【中文标题】需要说明如何使用 Terraform 管理 Google Cloud 项目【英文标题】:Need clarification on using Terraform to manage Google Cloud projects 【发布时间】:2019-12-21 04:21:26 【问题描述】:

我阅读了这篇关于将 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 项目上启用它们。

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

感谢收听!

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

有趣的是,我不知道服务帐户可以绑定到文件夹。感谢您的提示! 组织级别也是如此。您可以在每个级别定义用户、组和用户帐户的角色。对于需要一段时间查看所有项目的主管团队来说非常有趣。只添加一个群组,如果一个人离开团队/群组,授权将被自动移除。资源管理功能强大

以上是关于需要说明如何使用 Terraform 管理 Google Cloud 项目的主要内容,如果未能解决你的问题,请参考以下文章

Terraform 学习总结—— 如何解决存量云资源的管理难题

Terraform 学习总结—— 如何解决存量云资源的管理难题

如何使用一个 terraform 脚本和不同的变量值管理多个不同环境的部署

如何使用 Terraform 在管理组范围上定义和分配 Azure 策略?

如何使用Terraform将虚拟网络添加到api管理中?

如何自动切换角色策略(Terraform)