【问题标题】:Azure ARM Template - accessing a resource Id created by one ARM template in another ARM templateAzure ARM 模板 - 访问由另一个 ARM 模板中的一个 ARM 模板创建的资源 ID
【发布时间】:2016-12-03 16:41:44
【问题描述】:

在部署实际应用程序之前,我们在构建过程中使用 ARM 模板部署 Azure 资源。

到目前为止,我们所有的应用程序资源都包含在 resource group 中。例如需要 sql server 和存储帐户的 Web 应用程序被合并到一个资源组中。

但是,我们遇到了需要共享资源的场景/需求,例如。跨资源组的存储帐户。资源组 A 具有存储帐户,而资源组 B 的 Web 应用程序需要在其 appconfig.json/web.config 中与存储帐户相关的连接字符串/应用程序密钥。

问题

如何为资源组 B 中的应用构建连接字符串以连接到资源组 A 中的资源,因为我需要获取 B 中资源组 A 的 Id

如果它们在同一个资源组中,这是我如何构建连接字符串

  "variables"
{
  "storageAccounts_id": "[concat(**resourceGroupA**().id,'/providers/Microsoft.Storage/storageAccounts/', variables('storageAccntName'))]",
},
"resources": [
    {
      "apiVersion": "2015-08-01",
      "type": "config",
      "name": "connectionstrings",
      "dependsOn": [
        "[resourceId('Microsoft.Web/sites', variables('MyWebSiteName'))]"
      ],
      "properties": {
      "AzureWebJobsDashboard": {
        "value": "[concat('DefaultEndpointsProtocol=https;AccountName=',variables('storageAccntName'),';AccountKey=',concat(listKeys(variables('storageAccounts_id'),'2015-05-01-preview').key1))]",
        "type": "Custom"
      },
      }
    }
  ]

注意事项: 我确实浏览过这个关于链接模板的网站https://azure.microsoft.com/en-us/documentation/articles/resource-group-linked-templates/,但它不适合我们当前使用Octo 的构建过程(除非我可能缺少某些东西),然后先部署 ARM应用程序(网络)。

【问题讨论】:

  • 你有没有为此做过任何工作?

标签: json azure octopus-deploy azure-resource-manager


【解决方案1】:

对于存储帐户名称已知且不依赖于资源组(例如,uniqueString(resourceGroup().id))的这种情况,您可以简单地使用resourceId() 的加长形式。完整的表格如下:

resourceId([subscriptionId], [resourceGroupName], resourceType, resourceName1, [resourceName2]...)

所以我们可以选择提供 subscriptionId 和 resourceGroupName。

listKeys(resourceId(parameters('ResourceGroupAName'), 'Microsoft.Storage/storageAccounts', variables('ccPaymentStorageName'))

如果它在不同的订阅中,您也可以指定订阅。

listKeys(resourceId(parameters('SubscriptionId'), parameters('ResourceGroupAName'), 'Microsoft.Storage/storageAccounts', variables('ccPaymentStorageName'))

如果您的存储帐户名称取决于资源组,例如

"storageName": "[concat('mystorage', uniqueString(resourceGroup().id))]" // in Resource Group A

那么您要么需要始终运行创建此帐户的模板并输出 storageName 和 resourceGroup,要么找到一种方法来引用其他资源组以获取它的 ID,以便重新创建名称。

我已经能够使用类似的东西来“重新创建”资源组 ID,这样我就可以生成存储帐户的正确名称。

"otherResourceGroupId": "[concat(subscription().id, '/resourceGroups/', parameters('ResourceGroupName'))]"

然后我可以使用它来适当地生成名称:

"storageAccountName": "[concat('mystorage', uniqueString(variables('otherResourceGroupId')))]"

【讨论】:

    【解决方案2】:

    你可以试试下面(例如):-

    "subNetId": "[concat('/subscriptions/', subscription().subscriptionId, '/resourceGroups/', parameters('virtualNetworkNameRG'), '/providers/', 'Microsoft.Network/virtualNetworks/' ,parameters('virtualNetworkName'),'/subnets/',parameters('subnetName'))]",

    参考https://docs.microsoft.com/en-us/azure/azure-resource-manager/resource-group-template-functions

    【讨论】:

    • 请检查您的答案,第 2 项中似乎缺少某些内容。
    • 这不起作用。您不能只将资源组名称与 ().id 连接并希望有任何好处。此外,resourceId 需要类型和名称。订阅和组名参数是可选的。据我所知,无法仅指定资源组。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-10
    相关资源
    最近更新 更多