如何解决Terraform for_each报错“无法预测将创建多少个实例”的问题
报错原因
该报错的核心逻辑是Terraform执行计划阶段要求for_each的索引值必须是已知确定值,无法使用仅在资源创建后才能生成的动态属性作为for_each的构造来源。
你开启了项目工厂模块的random_project_id = true配置,项目ID需要在项目实际创建后才会生成,你在服务账号模块的project_roles参数中拼接了动态的项目ID,导致服务账号模块内部用来构造for_each的local.project_roles_map_data变量在计划阶段无法解析出确定的键值,触发报错。
解决方案
你可以根据你的使用场景选择任意一种方案解决:
方案1:分阶段应用(新手推荐,无需修改现有配置)
先单独应用项目工厂模块,等项目创建完成、项目ID生成后再执行全量应用,执行命令如下:# 第一步:仅创建项目 terraform apply -target=module.project-factory # 待上一步执行成功后,执行全量应用 terraform apply方案2:拆分IAM绑定配置,规避模块内的动态for_each
去掉服务账号模块中的project_roles参数,单独显式声明IAM绑定资源。由于单独声明的IAM资源数量固定,不存在动态for_each的索引依赖问题,无需分阶段应用即可直接执行:module "service_accounts" { source = "terraform-google-modules/service-accounts/google" version = "4.0.3" project_id = module.project-factory.project_id generate_keys = "true" names = ["backend-runner"] } resource "google_project_iam_member" "cloudsql_client" { project = module.project-factory.project_id role = "roles/cloudsql.client" member = module.service_accounts.email[0] } resource "google_project_iam_member" "pubsub_publisher" { project = module.project-factory.project_id role = "roles/pubsub.publisher" member = module.service_accounts.email[0] }方案3:使用固定项目ID
关闭项目工厂的随机项目ID开关,自行指定全局唯一的固定项目ID,这样项目ID在计划阶段就是已知值,拼接的project_roles参数也可以被正常解析:module "project-factory" { source = "terraform-google-modules/project-factory/google" version = "11.2.3" name = "你的固定全局唯一项目ID" random_project_id = "false" # 其余原有配置保持不变 }
内容的提问来源于stack exchange,提问作者kidoman
相关产品推荐
相关产品推荐

