在另一个区域中使用 keyvault 进行规模集

Scale set using keyvault in another region

我正在使用 ARM 模板,该模板为 Service Fabric 群集创建 VM 规模集,并将一些机密与密钥库中的 VM 相关联。今天早上我发现 VM 和 keyvault 似乎必须存在于同一区域,否则我会收到这样的错误:

New-AzureRmResourceGroupDeployment : 9:24:55 AM - Resource Microsoft.Compute/virtualMachineScaleSets 'StdNode' failed with message '{   "status": "Failed",   "error": {
    "code": "ResourceDeploymentFailure",
    "message": "The resource operation completed with terminal provisioning state 'Failed'.",
    "details": [
      {
        "code": "KeyVaultAndVMInDifferentRegions",
        "message": "The Key Vault https://obscured.vault.azure.net/secrets/secretname/1112222aa31c4dcca4363bb0013e9999 is located in location West US, which is different from the  location of the VM, northcentralus. "
      }
    ]   } }'

这感觉像是人为限制,对我来说是个大问题。我想要一个集中式密钥库,我可以在其中部署我的所有机密并在我的所有部署中使用它们。不得不在世界各地复制我的秘密似乎很荒谬而且很容易出错。在跨区域获取秘密时,这里应该没有重大的性能问题。那么这背后的原因是什么,会不会改变呢?

Azure Scale Sets 团队的任何人都想为此提供一些颜色吗?

我们强制执行区域边界的原因是为了防止用户创建具有跨区域依赖性的架构。

对于像这样设计的应用程序,japaneast 数据中心的中断将导致您在 JapanWest 的 VMSS 无法成功横向扩展。

区域隔离是基于云的应用程序的关键设计原则,我们希望尽可能防止用户做出错误的选择。

我们不允许交叉订阅引用的原因是作为防止恶意用户使用 CRP 作为特权升级机制来访问其他用户机密的重要最后一步。 在 ARM 中还有其他机制也可以防止这种情况,但基于配置。

要解决此问题,您可能只想应用一个简单的修复程序

Get-AzVM -ResourceGroupName "rg1" -Name "vm1" | Remove-AzVMSecret | Update-AzVM

这将删除之前的密钥并重新发布一个新密钥,以便您的虚拟机恢复到配置状态。

您可以使用您访问模板参数的中央密钥保管库的体系结构,并将这些机密存储在区域密钥保管库中。然后 link 到你的规模集的区域密钥保管库。如果机密是证书,您可以使用 ARM 函数来正确格式化证书(作为机密),以便作为 VM/VMSS.

上的 OSImage 属性 的一部分正确导入

可以在此处找到更深入的了解:https://devblogs.microsoft.com/premier-developer/centralized-vm-certificate-deployment-across-multiple-regions-with-arm-templates/