Azure devops 如何创建利用密钥库的幂等、可重新部署的ARM模板?循环依赖性带来了一些问题

Azure devops 如何创建利用密钥库的幂等、可重新部署的ARM模板?循环依赖性带来了一些问题,azure-devops,azure-resource-manager,azure-keyvault,azure-managed-identity,infrastructure-as-code,Azure Devops,Azure Resource Manager,Azure Keyvault,Azure Managed Identity,Infrastructure As Code,我正试图在我的资源中加入一些额外的安全功能,例如使用客户管理的密钥进行加密。对于服务总线,这要求服务总线创建一个托管标识,并授予对密钥库的访问权限。但是,只有在服务总线存在之后,才知道托管标识 在我的ARM模板中,我需要在不加密的情况下初始化服务总线,以便获得托管标识,授予该标识对密钥库的访问权,然后使用加密更新服务总线。但是,此部署过程不可重复。在随后的重新部署中,它将失败,因为一旦获得授权,就无法从服务总线中删除加密。即使它确实有效,我也会执行不必要的步骤来删除加密并在每次部署中重新添加加密

我正试图在我的资源中加入一些额外的安全功能,例如使用客户管理的密钥进行加密。对于服务总线,这要求服务总线创建一个托管标识,并授予对密钥库的访问权限。但是,只有在服务总线存在之后,才知道托管标识

在我的ARM模板中,我需要在不加密的情况下初始化服务总线,以便获得托管标识,授予该标识对密钥库的访问权,然后使用加密更新服务总线。但是,此部署过程不可重复。在随后的重新部署中,它将失败,因为一旦获得授权,就无法从服务总线中删除加密。即使它确实有效,我也会执行不必要的步骤来删除加密并在每次部署中重新添加加密。似乎描述资源预期最终状态的IAC模板不能用于维护和引导新环境

API管理也存在同样的问题,我想添加自定义域,但它们需要密钥Vault访问。这意味着当初始化步骤重复时,如果不删除自定义域,我就无法重新部署ARM模板(或者为“初始化”和“实际部署”保留一组单独的模板)


有更好的解决方案吗?我研究了用户分配的标识,这似乎可以解决问题,但ARM模板中不支持这些标识。我通过检查资源是否已经存在来检查是否有办法使“init”步骤有条件,ARM模板也不支持这一点。

如果您想在单个ARM模板中,您可以使用来定义资源,然后再次引用它来更新它

在下面的示例中,我使用系统分配的托管标识、密钥保险库和RSA密钥创建服务总线。在同一ARM模板中的嵌套部署中(取决于生成的密钥),我随后更新服务总线以启用加密。所有服务总线都位于同一模板中的优点是
resourceId
reference
可与缩写语法一起使用(即仅资源名称)

{
“$schema”:”https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
“内容版本”:“1.0.0.0”,
“参数”:{
“姓名”:{
“类型”:“字符串”,
“defaultValue”:“[resourceGroup().name]”
},
“地点”:{
“类型”:“字符串”,
“defaultValue”:“[resourceGroup().location]”
},
“租户”:{
“类型”:“字符串”,
“defaultValue”:“[subscription().tenantId]”
}
},
“变量”:{
“kv_名称”:“[concat(参数('name'),'kv')]”,
“kv_版本”:“2019-09-01”,
“sb_名称”:“[concat(参数('name'),'sb')]”,
“sb_版本”:“2018-01-01-preview”,
“sb_key name”:“sbkey”
},
“资源”:[
{
“类型”:“Microsoft.ServiceBus/名称空间”,
“apiVersion”:“[变量('sb_version')]”,
“名称”:“[变量('sb_名称')]”,
“位置”:“[参数('位置')]”,
“sku”:{
“名称”:“高级”,
“层”:“高级”,
“容量”:1
},
“身份”:{
“类型”:“系统分配”
},
“财产”:{
“区域邓丹”:错误
}
},
{
“类型”:“Microsoft.KeyVault/Vault”,
“apiVersion”:“[变量('kv_版本')]”,
“名称”:“[变量('kv_名称')]”,
“位置”:“[参数('位置')]”,
“dependsOn”:[
“[变量('sb_name')]”
],
“财产”:{
“sku”:{
“家庭”:“A”,
“名称”:“标准”
},
“tenantId”:“[参数('tenantId')]”,
“访问策略”:[
{
“tenantId”:“[参考(变量('sb_名称')、变量('sb_版本')、'Full').identity.tenantId]”,
“objectId:“[reference(variables('sb_name')、variables('sb_version')、'Full').identity.principalId]”,
“权限”:{
“钥匙”:[
“得到”,
“wrapKey”,
“打开密钥”
]
}
}
],
//两者都必须启用,以便在静止时加密服务总线。
“enableSoftDelete”:真,
“enablePurgeProtection”:正确
}
},
{
“类型”:“Microsoft.KeyVault/Vault/keys”,
“apiVersion”:“[变量('kv_版本')]”,
“名称”:“[concat(variables('kv_name'),'/',variables('sb_keyname'))]”,
“位置”:“[参数('位置')]”,
“dependsOn”:[
“[变量('kv_名称')]”
],
“财产”:{
“kty”:“RSA”,
“密钥大小”:2048,
“钥匙操作”:[
“wrapKey”,
“打开密钥”
],
“属性”:{
“已启用”:真
}
}
},
{
“类型”:“Microsoft.Resources/deployments”,
“apiVersion”:“2020-10-01”,
“名称”:“sb_部署”,
“dependsOn”:[
[resourceId('Microsoft.KeyVault/Vault/keys',variables('kv_name'),variables('sb_keyname'))]
],
“财产”:{
“模式”:“增量”,
“模板”:{
“$schema”:”https://schem