等待 GCP 基础设施更改传播的 Terraform 问题
Terraform issues with waiting for GCP infrastructure changes to propagate
我正在使用 Terraform 并试图将项目部署到一个应用了 GCP 组织策略的文件夹中,其中无法在该文件夹中的 folder/projects 中创建服务帐户。我有代码可以在部署项目时将该组织策略设置为 false。此外,我在同一个 main.tf 中部署了一些服务帐户,这取决于将组织策略设置为 false。
我已尝试对服务帐户模块使用 depends_on
语句,以等待组织策略在配置服务帐户之前设置为 false。我还使用了 time_sleep
资源块来允许项目工厂和组织策略在配置服务帐户之前进行 provision/make 更改。我偶尔可以让整个部署工作,而其他时候我会遇到应用步骤因组织政策而失败的问题。
如果我检查 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]
}
将睡眠定时器更改为 120 秒是帮助解决此问题的主要因素。我所做的是创建项目工厂,让组织策略依赖于等待项目工厂,让计时器等待组织策略,然后让所有其他模块等待计时器完成。
基本上流程是项目 > 组织政策 > 120 秒的计时器 > 120 秒后配置所有其他模块。
我正在使用 Terraform 并试图将项目部署到一个应用了 GCP 组织策略的文件夹中,其中无法在该文件夹中的 folder/projects 中创建服务帐户。我有代码可以在部署项目时将该组织策略设置为 false。此外,我在同一个 main.tf 中部署了一些服务帐户,这取决于将组织策略设置为 false。
我已尝试对服务帐户模块使用 depends_on
语句,以等待组织策略在配置服务帐户之前设置为 false。我还使用了 time_sleep
资源块来允许项目工厂和组织策略在配置服务帐户之前进行 provision/make 更改。我偶尔可以让整个部署工作,而其他时候我会遇到应用步骤因组织政策而失败的问题。
如果我检查 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]
}
将睡眠定时器更改为 120 秒是帮助解决此问题的主要因素。我所做的是创建项目工厂,让组织策略依赖于等待项目工厂,让计时器等待组织策略,然后让所有其他模块等待计时器完成。
基本上流程是项目 > 组织政策 > 120 秒的计时器 > 120 秒后配置所有其他模块。