Terraform中如何为for_each映射的未定义对象属性设置默认值?
为for_each迭代的IAM角色对象设置默认属性值
方法1:模块调用时直接用lookup函数
lookup函数可从映射中获取指定键的值,若键不存在则返回预设的默认值。针对你的场景,修改模块参数如下:
module "iam_assumable_roles" { for_each = local.iam_roles source = "terraform-aws-modules/iam/aws//modules/iam-assumable-role" version = "v5.41.0" create_role = true role_requires_mfa = false role_name = each.key custom_role_policy_arns = each.value.custom_role_policy_arns # 为未定义的custom_role_trust_policy设默认空字符串(可根据模块要求调整) custom_role_trust_policy = lookup(each.value, "custom_role_trust_policy", "") # 为未定义的create_custom_role_trust_policy设默认false,同时统一转为布尔类型 create_custom_role_trust_policy = tobool(lookup(each.value, "create_custom_role_trust_policy", false)) trusted_role_arns = each.value.trusted_role_arns trusted_role_services = each.value.trusted_role_services }
注:你的developer_test角色中create_custom_role_trust_policy用了字符串"true",tobool可将其转为布尔类型,避免模块因类型不匹配报错。
方法2:在local中预处理角色映射(推荐)
若需给多个属性设置默认值,更清晰的方式是在local中创建包含默认值的新映射,通过合并原数据与默认值确保每个角色对象属性完整:
locals { # 统一定义所有角色属性的默认值 iam_role_defaults = { create_custom_role_trust_policy = false custom_role_trust_policy = "" # 其他需要默认值的属性可在此添加 } # 合并原角色数据与默认值,生成结构完整的新映射 iam_roles_with_defaults = { for role_name, role_attrs in local.iam_roles : role_name => merge(local.iam_role_defaults, role_attrs) } } # 模块调用时引用处理后的映射 module "iam_assumable_roles" { for_each = local.iam_roles_with_defaults source = "terraform-aws-modules/iam/aws//modules/iam-assumable-role" version = "v5.41.0" create_role = true role_requires_mfa = false role_name = each.key custom_role_policy_arns = each.value.custom_role_policy_arns custom_role_trust_policy = each.value.custom_role_trust_policy create_custom_role_trust_policy = tobool(each.value.create_custom_role_trust_policy) trusted_role_arns = each.value.trusted_role_arns trusted_role_services = each.value.trusted_role_services }
这种方式的优势:
- 默认值集中管理,后续修改或新增默认属性更高效
- 模块调用参数更简洁,无需重复编写
lookup逻辑 - 确保所有角色对象结构一致,减少属性缺失引发的潜在问题
建议将developer_test中的create_custom_role_trust_policy值从字符串"true"改为布尔值true,符合Terraform的类型规范,若暂时无法修改,tobool也能兼容字符串取值。
内容的提问来源于stack exchange,提问作者Gowthamakanthan Gopal
相关产品推荐
相关产品推荐

