Terraform模块实现可选传入服务账户或自动创建的报错处理
问题原因
- 当Terraform资源配置了
count参数后,该资源会以实例列表的形式返回,而非单个资源对象,必须指定明确的索引才能访问其属性 count.index仅允许在配置了count的resource/module块内部使用,在locals块、输出变量等场景下无法被识别,因此修改为google_service_account.scheduler[count.index].email仍会报错
正确实现方案
步骤1:修正locals块逻辑
利用Terraform条件判断的短路特性,当需要自动创建服务账户时,直接取索引为0的实例属性即可,不会触发空索引报错:
locals { service_account_count = var.service_account_email == null ? 1 : 0 service_account_email = var.service_account_email == null ? google_service_account.scheduler[0].email : var.service_account_email }
如果使用Terraform 0.14及以上版本,可以用one()函数简化写法,可读性更强:
locals { service_account_count = var.service_account_email == null ? 1 : 0 service_account_email = var.service_account_email != null ? var.service_account_email : one(google_service_account.scheduler[*].email) }
步骤2:保持服务账户资源配置不变
你现有调整后的带count的服务账户配置无需修改:
resource "google_service_account" "scheduler" { count = local.service_account_count account_id = "${var.prefix}-scheduler" project = var.project }
步骤3:统一引用local值
后续所有需要使用服务账户邮箱的位置,直接引用local.service_account_email即可,会自动适配「自动创建」和「传入已有」两种场景。
内容的提问来源于stack exchange,提问作者Kyle
相关产品推荐
相关产品推荐

