Terraform如何跨模块引用Key Vault模块输出的对象映射类型密钥
解决方案
核心问题:当前Key Vault模块的key-vault-secrets输出使用values() + splat运算符返回的是所有密钥值的无序列表,无法通过密钥名称精准定位到指定密钥,是无法正确引用的核心原因。你的整体实现思路没问题,仅需要调整输出结构即可。
步骤1:修改Key Vault模块的输出定义
将原输出调整为map(string)类型,通过遍历密钥实例生成以密钥名称为键、密钥值为值的映射结构,方便按名称查询:
output "key-vault-secrets" { type = map(string) description = "Key Vault密钥映射,键为自定义的密钥名称,值为对应的密钥明文" value = { for secret_name, secret_obj in azurerm_key_vault_secret.secret : secret_name => secret_obj.value } }
步骤2:跨模块引用指定密钥
调整输出后,直接以密钥名称为键即可提取对应值,例如使用secret-x作为PSQL管理员密码的写法如下:
module "psql" { source = "./modules/psql" psql_server_name = var.psql_server_name location = var.location prefix = var.prefix environment = var.environment resource_group_name = azurerm_resource_group.rg.name administrator_login = var.administrator_login administrator_login_password = module.keyvault.key-vault-secrets["secret-x"] # 其余参数省略 }
不推荐的兼容方案
如果坚持不修改原输出定义,只能通过列表下标取值:
administrator_login_password = module.keyvault.key-vault-secrets[0]
注意:该方式风险极高,Terraform中map的
values()返回顺序不固定,一旦修改var.secrets的键值对,下标对应的密钥会发生变化,大概率会导致密码被意外修改,引发服务故障。
内容的提问来源于stack exchange,提问作者Winston Smith
相关产品推荐
相关产品推荐

