如何通过Terraform创建名称包含下划线的Azure Key Vault密钥?
咱们先理清楚问题根源:Azure Key Vault的秘密名称确实有字符约束(部分旧版Terraform Azurerm Provider也会做严格校验),不允许使用下划线,但你需要让这个秘密能被.NET应用正确映射到VccbSettingsV2:EndpointUrl这个配置项对吧?
这里有两个实用的解决方案,你可以根据自己的情况选择:
方案一:用点分隔的秘密名称,靠.NET默认规则自动映射
Azure Key Vault允许用点(.)作为秘密名称的分隔符,而.NET的Azure Key Vault配置提供程序默认会把秘密名称里的点转换成配置层级的冒号(:)。你只需要把Terraform代码改成这样:
resource "azurerm_key_vault_secret" "secret001" { name = "VccbSettingsV2.EndpointUrl" value = "https://some-url.com" key_vault_id = azurerm_key_vault.kv.id }
这样你的.NET应用读取这个秘密时,会自动把VccbSettingsV2.EndpointUrl解析成VccbSettingsV2:EndpointUrl,完美匹配你需要的配置键,而且不需要额外修改应用代码,非常省心。
方案二:用双破折号替换下划线,配合.NET自定义映射
如果你更习惯类似下划线的分隔方式,也可以把下划线换成双破折号(--),然后在.NET应用里加一点配置代码来做映射转换:
首先修改Terraform代码:
resource "azurerm_key_vault_secret" "secret001" { name = "VccbSettingsV2--EndpointUrl" value = "https://some-url.com" key_vault_id = azurerm_key_vault.kv.id }
然后在你的.NET应用的配置代码里(比如Program.cs),自定义Key Vault的秘密名称映射规则:
builder.Configuration.AddAzureKeyVault( new Uri("你的密钥保管库URI"), new DefaultAzureCredential(), new CustomKeyVaultSecretManager()); // 自定义的秘密管理器类 public class CustomKeyVaultSecretManager : IKeyVaultSecretManager { public bool Load(SecretProperties properties) { return true; // 加载所有密钥保管库中的秘密 } public string GetKey(KeyVaultSecret secret) { // 把双破折号替换成双下划线,.NET会自动把双下划线转成冒号 return secret.Name.Replace("--", "__"); } }
这样秘密名称VccbSettingsV2--EndpointUrl会被转换成VccbSettingsV2__EndpointUrl,.NET配置系统会自动把双下划线转成冒号,最终得到你需要的VccbSettingsV2:EndpointUrl配置键。
个人更推荐方案一,因为不需要额外编写应用代码,完全利用默认规则就能解决问题,更简洁高效。
备注:内容来源于stack exchange,提问作者Harkirat singh

