能否仅通过Azure Key Vault名称在Terraform中连接现有密钥保管库?
无需资源组名称连接Azure Key Vault的Terraform实现
Azure Key Vault名称确实具备全局唯一性,不过Terraform默认的azurerm_key_vault数据源确实要求同时指定名称和资源组名称。但可以通过以下两种方式,实现仅凭借Key Vault名称完成连接,无需提前知晓资源组名称:
方法1:通过external数据源调用Azure CLI获取资源组
利用external数据源执行Azure CLI命令,动态查询目标Key Vault所属的资源组,再将结果传入azurerm_key_vault数据源:
# 定义Key Vault名称变量 variable "kv_name" { type = string } # 调用Azure CLI获取Key Vault的资源组名称 data "external" "kv_resource_group" { program = ["az", "keyvault", "show", "--name", var.kv_name, "--query", "resourceGroup", "-o", "tsv"] } # 通过获取到的资源组名称加载Key Vault数据源 data "azurerm_key_vault" "target" { name = var.kv_name resource_group_name = data.external.kv_resource_group.result }
方法2:使用azurerm_resource数据源定位资源
Key Vault对应的Azure资源类型为Microsoft.KeyVault/vaults,结合全局唯一的名称,可以用azurerm_resource数据源直接定位资源,再提取其所属的资源组名称:
# 定义Key Vault名称变量 variable "kv_name" { type = string } # 通过资源类型和名称定位Key Vault资源 data "azurerm_resource" "kv" { name = var.kv_name type = "Microsoft.KeyVault/vaults" } # 利用提取到的资源组名称加载Key Vault数据源 data "azurerm_key_vault" "target" { name = var.kv_name resource_group_name = data.azurerm_resource.kv.resource_group_name }
补充说明
Terraform的AzureRM provider默认要求资源组名称,是因为其设计遵循了Azure资源的通用定位逻辑(多数资源名称仅在资源组内唯一),但针对Key Vault这种全局唯一名称的资源,通过上述动态查询的方式,就能避免手动指定资源组的步骤。
内容的提问来源于stack exchange,提问作者mark
相关产品推荐
相关产品推荐

