等待 GCP 基础架构更改传播的 Terraform 问题

Posted

技术标签:

【中文标题】等待 GCP 基础架构更改传播的 Terraform 问题【英文标题】:Terraform issues with waiting for GCP infrastructure changes to propagate 【发布时间】:2021-05-31 15:21:23 【问题描述】:

我正在使用 Terraform 并尝试将项目部署到应用了 GCP 组织策略的文件夹中,其中无法在该文件夹中的该文件夹/项目中创建服务帐户。我有代码将在部署项目时将该组织策略设置为 false。此外,我在同一个 main.tf 中部署了一些服务帐户,这将取决于设置为 false 的组织策略。

我已尝试对服务帐户模块使用 depends_on 语句,以等待组织策略设置为 false,然后再配置服务帐户。我还使用了time_sleep 资源块,以允许项目工厂和组织策略在配置服务帐户之前配置/进行更改。我偶尔可以让整个部署正常工作,而其他时候我会遇到由于组织政策而导致应用步骤失败的问题。

如果我在 GCP 中检查项目,则表明组织政策已设置为 false,这是应该发生的。如果我在 Terraform 中重新运行 apply 步骤,那么剩下的所有内容都会提供。有没有更好的方法来解决这个问题?有时供应在一个应用与两个应用中工作的事实有点奇怪,这让我相信存在某种状态缓存,但这只是我根据我所看到的猜测更多。

代码如下:

  source  = "terraform-google-modules/project-factory/google"
  version = "~> 10.1"

  name                        = var.project_name
  random_project_id           = var.random_project_id
  org_id                      = var.org_id
  folder_id                   = var.folder_id
  billing_account             = var.billing_account_id
  create_project_sa           = false
  default_service_account     = var.default_service_account
  disable_dependent_services  = var.disable_dependent_services
  disable_services_on_destroy = var.disable_services_on_destroy
  labels                      = var.project_labels

module "remove_disable_sa_creation" 
  source      = "terraform-google-modules/org-policy/google"
  version     = "~> 3.0.2"
  constraint  = "constraints/iam.disableServiceAccountCreation"
  policy_type = "boolean"
  policy_for  = "project"
  project_id  = module.project-factory.project_id
  enforce     = false
  depends_on  = [module.project-factory.project_id]

resource "time_sleep" "wait_60_seconds" 
  depends_on      = [module.remove_disable_sa_creation]
  create_duration = "60s"

module "globus_service_account" 
  source             = "../../../modules/service_account"
  project_id         = module.project-factory.project_id
  prefix             = var.globus_sa_prefix
  names              = var.globus_sa_names
  project_roles      = var.globus_sa_project_roles
  grant_billing_role = var.globus_grant_billing_role
  billing_account_id = var.billing_account_id
  grant_xpn_roles    = var.globus_grant_xpn_roles
  org_id             = var.org_id
  generate_keys      = var.globus_generate_keys
  display_name       = var.globus_sa_display_name
  description        = var.globus_sa_description
  depends_on         = [time_sleep.wait_60_seconds]

【问题讨论】:

我不知道答案。 Google Cloud 是全球性的,在某些情况下同步权限、策略等需要几分钟的时间。 60 秒太短了。 鉴于您的组织政策已被禁用,您可能需要考虑另一种方法。在组织外部创建项目,然后将其移动到组织中。这样政策就永远不会被禁用。 @JohnHanley 感谢您的回复。忘记用答案更新帖子。将睡眠计时器更改为 120 秒是帮助解决此问题的主要因素。我所做的是创建项目工厂,依赖组织策略等待项目工厂,让计时器等待组织策略,然后让所有其他模块等待计时器完成。 【参考方案1】:

将睡眠定时器更改为 120 秒是帮助解决此问题的主要因素。我所做的是创建项目工厂,让组织策略依赖于项目工厂,让计时器等待组织策略,然后让所有其他模块等待计时器完成。

基本上流程是项目 > 组织策略 > 120 秒计时器 > 120 秒后配置所有其他模块。

【讨论】:

以上是关于等待 GCP 基础架构更改传播的 Terraform 问题的主要内容,如果未能解决你的问题,请参考以下文章

通过 Terraform 在 AWS 上进行路由传播

Terraform GCP - 等待设置使用导出存储桶时出错。:“gcp-bucket”需要“读取”权限

40了解云计算平台的高可用架构,如 AWS 的多可用区GCP 的负载均衡器

如何安装多个或两个版本的 Terraform?

GCP Flex 模板错误:未在 envsetup 文件中设置 py 选项...错误等待容器:意外 EOF

GCP:如何更改VPC子网区域?