如果模板中未引用现有密钥,ARM 模板会重新生成密钥

ARM templates regenerate keys if an existing key is not referenced in the template

我发现这有点违反直觉,最近偶然发现了这一点。

如果您在 ARM 模板中定义您的基础设施并将共享访问密钥添加到模板中,它将使用所需的密钥创建您的所有基础设施。但是稍后该模板的某些部分会更新,并且该模板再次针对您的基础设施 运行。现在,定义的共享访问密钥部分将重新生成您的密钥,因为它不直接引用模板中的现有密钥。

本质上这意味着我们的 Create 模板与我们的 Update 模板不同,感觉有点恶心。

目前执行此操作的唯一方法是使用保管库或类似工具中的自我管理密钥。不幸的是,我正在使用的资源仅在某些地区可用:https://docs.microsoft.com/en-us/azure/iot-hub/iot-hub-customer-managed-keys

我希望能够将密钥标记为 immutable,这样它将被创建但不会在后续更新时重新生成。这意味着我们不必为同一个基础设施维护 2 个模板。

我是否遗漏了一些基本知识,或者是否有更好的方法来处理我没有看到的问题?

编辑:
为清楚起见,这里是模板示例:

{
  "type": "Microsoft.Devices/IotHubs",
  "apiVersion": "2018-04-01",
  "name": "[variables('iotHubName')]",
  "location": "[parameters('location')]",
  "dependsOn": [
    "[variables('telemetryEventHubName')]"
  ],
  "properties": {
    "authorizationPolicies": [
      {
        "keyName": "[variables('mobileDeviceAccessPolicyName')]",
        "rights": "deviceconnect, serviceconnect, registryread, registrywrite"
      }
    ]
  },
  "sku": {
    "name": "[parameters('iotHubSkuName')]",
    "capacity": "[parameters('iotHubCapacityUnits')]"
  }
}

此行为是设计使然。如果 ARM 模板没有明确指定“PrimaryKey”:“……”或者“SecondaryKey”:“..”然后我们将重新生成密钥。我们了解您不需要重新生成密钥并将其锁定。我们已经在我们的工作待办事项列表中添加了这个新问题,并将研究设计这个问题。