azure - 使用 ARM 订阅级部署部署多个资源时出现问题

标签 azure arm azure-resource-manager azure-rm-template

我正在重写 ARM 模板,因为我们不再使用链接模板。链接模板给我们带来了版本控制的麻烦。我正在使用订阅级别部署来部署资源组,其中包含嵌套的删除锁、存储帐户、keyvault、2 个函数应用、用户分配的托管标识和 keyvault 访问策略。

我使用的ARM模板:

{
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "deplocation": {
            "type": "string",
            "allowedValues": [
                "West Europe",
                "North Europe"
            ],
            "defaultValue": "West Europe",
            "metadata": {
                "description": "Location for all resources."
            }
        },
        "tags": {
            "type": "object"
        },
        "rgName": {
            "type": "string"
        },
        "saName": {
            "type": "string",
            "metadata": {
                "description": "The name of the resource."
            }
        },
        "saType": {
            "type": "string",
            "allowedValues": [
                "Standard_LRS",
                "Standard_GRS",
                "Standard_ZRS",
                "Premium_LRS"
            ],
            "defaultValue": "Standard_LRS",
            "metadata": {
                "description": "Gets or sets the SKU name. Required for account creation; optional for update. Note that in older versions, SKU name was called accountType. - Standard_LRS, Standard_GRS, Standard_RAGRS, Standard_ZRS, Premium_LRS, Premium_ZRS, Standard_GZRS, Standard_RAGZRS"
            }
        },
        "saKind": {
            "type": "string",
            "allowedValues": [
                "StorageV2",
                "BlobStorage",
                "FileStorage",
                "BlockBlobStorage"
            ],
            "defaultValue": "StorageV2",
            "metadata": {
                "description": "Indicates the type of storage account. - Storage, StorageV2, BlobStorage, FileStorage, BlockBlobStorage"
            }
        },
        "saAccessTier": {
            "type": "string"
        },
        "saSupportsHttpsTrafficOnly": {
            "type": "bool"
        },
        "kvName": {
            "type": "string"
        },
        "kvSkuName": {
            "type": "string"
        },
        "kvSkuFamily": {
            "type": "string"
        },
        "kvSecretsPermissions": {
            "type": "array"
        },
        "uamiName": {
            "type": "string"
        },
        "fa1Name": {
            "type": "string"
        },
        "fa2Name": {
            "type": "string"
        },
        "aspName": {
            "type": "string"
        },
        "aspRg": {
            "type": "string"
        },
        "appInsightsName": {
            "type": "string"
        },
        "appInsightsRg": {
            "type": "string"
        }
    },
    "variables": {
        "tenantId": "[subscription().tenantId]",
        "subscriptionId": "[subscription().subscriptionId]"
    },
    "resources": [
        {
            "type": "Microsoft.Resources/resourceGroups",
            "apiVersion": "2018-05-01",
            "location": "[parameters('depLocation')]",
            "name": "[parameters('rgName')]",
            "tags": "[parameters('tags')]",
            "properties": {
            }
        },
        {
            "type": "Microsoft.Resources/deployments",
            "apiVersion": "2018-05-01",
            "name": "resourceDeployment",
            "resourceGroup": "[parameters('rgName')]",
            "dependsOn": [
                "[resourceId('Microsoft.Resources/resourceGroups/', parameters('rgName'))]"
            ],
            "properties": {
                "mode": "Incremental",
                "template": {
                    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
                    "contentVersion": "1.0.0.0",
                    "resources": [
                        {
                            "name": "DeletionLock",
                            "type": "Microsoft.Authorization/locks",
                            "apiVersion": "2017-04-01",
                            "properties": {
                                "level": "CanNotDelete",
                                "notes": "[parameters('rgName')]"
                            }
                        },
                        {
                            "name": "[parameters('saName')]",
                            "type": "Microsoft.Storage/storageAccounts",
                            "apiVersion": "2019-04-01",
                            "sku": {
                                "name": "[parameters('saType')]"
                            },
                            "kind": "[parameters('saKind')]",
                            "location": "[parameters('deplocation')]",
                            "tags": "[parameters('tags')]",
                            "properties": {
                                "accessTier": "[parameters('saAccessTier')]",
                                "supportsHttpsTrafficOnly": "[parameters('saSupportsHttpsTrafficOnly')]"
                            }
                        },
                        {
                            "name": "[concat(parameters('saName'), '/default')]",
                            "type": "Microsoft.Storage/storageAccounts/blobServices",
                            "apiVersion": "2019-04-01",
                            "dependsOn": [
                                "[resourceId('Microsoft.Storage/storageAccounts', parameters('saName'))]"
                            ],
                            "properties": {
                                "cors": {
                                    "corsRules": [
                                    ]
                                },
                                "deleteRetentionPolicy": {
                                    "enabled": false
                                }
                            }
                        },
                        {
                            "name": "[parameters('kvName')]",
                            "type": "Microsoft.KeyVault/vaults",
                            "apiVersion": "2018-02-14",
                            "location": "[parameters('deplocation')]",
                            "tags": "[parameters('tags')]",
                            "properties": {
                                "tenantId": "[variables('tenantId')]",
                                "accessPolicies": [
                                ],
                                "sku": {
                                    "name": "[parameters('kvSkuName')]",
                                    "family": "[parameters('kvSkuFamily')]"
                                }
                            }
                        },
                        {
                            "name": "[parameters('uamiName')]",
                            "type": "Microsoft.ManagedIdentity/userAssignedIdentities",
                            "apiVersion": "2018-11-30",
                            "location": "[parameters('deplocation')]",
                            "tags": "[parameters('tags')]",
                            "properties": {
                            }
                        },
                        {
                            "name": "[parameters('fa1Name')]",
                            "type": "Microsoft.Web/sites",
                            "apiVersion": "2019-08-01",
                            "kind": "functionapp",
                            "location": "[parameters('deplocation')]",
                            "tags": "[parameters('tags')]",
                            "dependsOn": [
                                "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities/', parameters('uamiName'))]",
                                "[resourceId('Microsoft.Storage/storageAccounts/', parameters('saName'))]"
                            ],
                            "identity": {
                                "type": "SystemAssigned, UserAssigned",
                                "userAssignedIdentities": {
                                    "[concat('/subscriptions/', variables('subscriptionId'), '/resourceGroups/', parameters('rgName'), '/providers/Microsoft.ManagedIdentity/userAssignedIdentities/', parameters('uamiName'))]": {
                                    }
                                }
                            },
                            "properties": {
                                "siteConfig": {
                                    "appSettings": [
                                        {
                                            "name": "FUNCTIONS_WORKER_RUNTIME",
                                            "value": "dotnet"
                                        },
                                        {
                                            "name": "WEBSITE_TIME_ZONE",
                                            "value": "W. Europe Standard Time"
                                        },
                                        {
                                            "name": "AzureWebJobsStorage",
                                            "value": "[concat('DefaultEndpointsProtocol=https;AccountName=',parameters('saName'),';AccountKey=',listKeys(concat('/subscriptions/',variables('subscriptionId'),'/resourceGroups/',parameters('rgName'),'/providers/Microsoft.Storage/storageAccounts/',parameters('saName')),providers('Microsoft.Storage', 'storageAccounts').apiVersions[0]).keys[0].value,';')]"
                                        },
                                        {
                                            "name": "FUNCTIONS_EXTENSION_VERSION",
                                            "value": "~2"
                                        },
                                        {
                                            "name": "WEBSITE_RUN_FROM_PACKAGE",
                                            "value": "1"
                                        },
                                        {
                                            "name": "APPINSIGHTS_INSTRUMENTATIONKEY",
                                            "value": "[reference(concat('/subscriptions/',variables('subscriptionId'),'/resourceGroups/',parameters('appInsightsRg'),'/providers/microsoft.insights/components/',parameters('appInsightsName')),providers('microsoft.insights', 'components').apiVersions[0]).InstrumentationKey]"
                                        }
                                    ],
                                    "alwaysOn": true
                                },
                                "serverFarmId": "[concat('/subscriptions/',variables('subscriptionId'),'/resourceGroups/',parameters('aspRg'),'/providers/Microsoft.Web/serverfarms/',parameters('aspName'))]",
                                "httpsOnly": true
                            }
                        },
                        {
                            "name": "[parameters('fa2Name')]",
                            "type": "Microsoft.Web/sites",
                            "apiVersion": "2019-08-01",
                            "kind": "functionapp",
                            "location": "[parameters('deplocation')]",
                            "tags": "[parameters('tags')]",
                            "dependsOn": [
                                "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities/',parameters('uamiName'))]",
                                "[resourceId('Microsoft.Storage/storageAccounts/', parameters('saName'))]"
                            ],
                            "identity": {
                                "type": "SystemAssigned, UserAssigned",
                                "userAssignedIdentities": {
                                    "[concat('/subscriptions/',variables('subscriptionId'),'/resourceGroups/',parameters('rgName'),'/providers/Microsoft.ManagedIdentity/userAssignedIdentities/',parameters('uamiName'))]": {
                                    }
                                }
                            },
                            "properties": {
                                "siteConfig": {
                                    "appSettings": [
                                        {
                                            "name": "FUNCTIONS_WORKER_RUNTIME",
                                            "value": "dotnet"
                                        },
                                        {
                                            "name": "WEBSITE_TIME_ZONE",
                                            "value": "W. Europe Standard Time"
                                        },
                                        {
                                            "name": "AzureWebJobsStorage",
                                            "value": "[concat('DefaultEndpointsProtocol=https;AccountName=',parameters('saName'),';AccountKey=',listKeys(concat('/subscriptions/',variables('subscriptionId'),'/resourceGroups/',parameters('rgName'),'/providers/Microsoft.Storage/storageAccounts/',parameters('saName')),providers('Microsoft.Storage', 'storageAccounts').apiVersions[0]).keys[0].value,';')]"
                                        },
                                        {
                                            "name": "FUNCTIONS_EXTENSION_VERSION",
                                            "value": "~2"
                                        },
                                        {
                                            "name": "WEBSITE_RUN_FROM_PACKAGE",
                                            "value": "1"
                                        },
                                        {
                                            "name": "APPINSIGHTS_INSTRUMENTATIONKEY",
                                            "value": "[reference(concat('/subscriptions/',variables('subscriptionId'),'/resourceGroups/',parameters('appInsightsRg'),'/providers/microsoft.insights/components/',parameters('appInsightsName')),providers('microsoft.insights', 'components').apiVersions[0]).InstrumentationKey]"
                                        }
                                    ],
                                    "alwaysOn": true
                                },
                                "serverFarmId": "[concat('/subscriptions/',variables('subscriptionId'),'/resourceGroups/',parameters('aspRg'),'/providers/Microsoft.Web/serverfarms/',parameters('aspName'))]",
                                "httpsOnly": true
                            }
                        },
                        {
                            "name": "[concat(parameters('kvName'), '/add')]",
                            "type": "Microsoft.KeyVault/vaults/accessPolicies",
                            "apiVersion": "2018-02-14",
                            "dependsOn": [
                                "[resourceId('Microsoft.KeyVault/vaults', parameters('kvName'))]",
                                "[resourceId('Microsoft.Web/sites', parameters('fa1Name'))]",
                                "[resourceId('Microsoft.Web/sites', parameters('fa2Name'))]"
                            ],
                            "properties": {
                                "accessPolicies": [
                                    {
                                        "tenantId": "[variables('tenantId')]",
                                        "objectId": "[reference(concat('/subscriptions/',variables('subscriptionId'),'/resourceGroups/',parameters('rgName'),'/providers/Microsoft.Web/sites/', parameters('fa1Name'), '/providers/Microsoft.ManagedIdentity/Identities/default'),providers('Microsoft.ManagedIdentity', 'Identities').apiVersions[0]).principalId]",
                                        "permissions": {
                                            "secrets": "[parameters('kvSecretsPermissions')]"
                                        }
                                    }
                                    ,
                                    {
                                        "tenantId": "[variables('tenantId')]",
                                        "objectId": "[reference(concat('/subscriptions/',variables('subscriptionId'),'/resourceGroups/',parameters('rgName'),'/providers/Microsoft.Web/sites/', parameters('fa2Name'), '/providers/Microsoft.ManagedIdentity/Identities/default'),providers('Microsoft.ManagedIdentity', 'Identities').apiVersions[0]).principalId]",
                                        "permissions": {
                                            "secrets": "[parameters('kvSecretsPermissions')]"
                                        }
                                    }
                                ]
                            }
                        }
                    ]
                }
            }
        }
    ],
    "outputs": {
        // "uamiPrincipalId": {            
        //     "value": "[reference(concat('/subscriptions/',variables('subscriptionId'),'/resourceGroups/',parameters('rgName'),'/providers/Microsoft.ManagedIdentity/userAssignedIdentities/', parameters('uamiName')), providers('Microsoft.ManagedIdentity', 'userAssignedIdentities').apiVersions[0]).principalId]",
        //     "type": "string"
        // }
    }
}

用于部署模板的 Powershell 代码。

#region variableDeclaration
$ErrorActionPreference = "Stop"
$subscriptionId = "subscription id here"
$location = "West Europe"
#endregion variableDeclaration

Set-location -path $PSScriptRoot

#region connectToSubscription
Connect-AzAccount -ErrorAction Stop
Set-AzContext -Subscription $subscriptionId
#endregion connectToSubscription

#region createAzureResources
$workloadInputResources = @{
    depLocation                = $location
    tags                       = @{
        dienst         = "-"
        kostenplaats   = "-"
        omgeving       = "-"
        contactpersoon = "-"
        eigenaar       = "-"
        referentie     = "-"
        omschrijving   = "-"
    }    
    rgName                     = "resources-dev-rg"
    saName                     = "resourcesdevsa"
    saType                     = "Standard_LRS"
    saKind                     = "StorageV2"
    saAccessTier               = "Hot"
    saSupportsHttpsTrafficOnly = $true
    kvName                     = "resourcesdevkv"
    kvSkuName                  = "Standard"
    kvSkuFamily                = "A"
    kvSecretsPermissions       = @("get", "list" )
    uamiName                   = "resources-dev-uami"
    fa1Name                    = "resources-dev-fa1"
    fa2Name                    = "resources-dev-fa2"
    aspName                    = "resources-dev-asp"
    aspRg                      = "resources-asp-dev-rg"
    appInsightsName            = "resources-dev-appins"
    appInsightsRg              = "resources-appins-dev-rg"
}


New-AzDeployment -Name "deployResources" -Location $location -TemplateFile .\deploy.json  @workloadInputResources

#endregion createAzureResources

问题:

  1. 按原样部署arm模板时出现以下错误:
Resource Microsoft.Storage/storageAccounts 'resourcesdevsa' failed with message '{
  "error": {
    "code": "ResourceGroupNotFound",
    "message": "Resource group 'resources-dev-rg' could not be found."
  }
}'

但是资源组创建成功。

  • 重新运行脚本时出现以下错误:
  • Resource Microsoft.Storage/storageAccounts 'resourcesdevsa' failed with message '{
      "error": {
        "code": "ResourceNotFound",
        "message": "The Resource 'Microsoft.Storage/storageAccounts/saName' under resource group 'resources-dev-rg' was not found."
      }
    }'
    
  • 当我注释掉部署 fa1、fa2 和访问策略时,第二个问题就消失了
  • 我的印象是使用dependsOn可以解决依赖问题,但显然我要么错了,使用不正确,要么在某处缺少dependsOn。

    我已经盯着这个问题几个小时了,但似乎找不到问题所在。 如有任何帮助,我们将不胜感激。

    最佳答案

    小更新,因为部分内容已解决。但仍然存在一些问题。

    我重写了ARM模板文件,如下所示

    {
        "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
        "contentVersion": "1.0.0.0",
        "parameters": {
            "deplocation": {
                "type": "string",
                "allowedValues": [
                    "West Europe",
                    "North Europe"
                ],
                "defaultValue": "West Europe",
                "metadata": {
                    "description": "Location for all resources."
                }
            },
            "tags": {
                "type": "object"
            },
            "rgName": {
                "type": "string"
            },
            "saName": {
                "type": "string",
                "metadata": {
                    "description": "The name of the resource."
                }
            },
            "saType": {
                "type": "string",
                "allowedValues": [
                    "Standard_LRS",
                    "Standard_GRS",
                    "Standard_ZRS",
                    "Premium_LRS"
                ],
                "defaultValue": "Standard_LRS",
                "metadata": {
                    "description": "Gets or sets the SKU name. Required for account creation; optional for update. Note that in older versions, SKU name was called accountType. - Standard_LRS, Standard_GRS, Standard_RAGRS, Standard_ZRS, Premium_LRS, Premium_ZRS, Standard_GZRS, Standard_RAGZRS"
                }
            },
            "saKind": {
                "type": "string",
                "allowedValues": [
                    "StorageV2",
                    "BlobStorage",
                    "FileStorage",
                    "BlockBlobStorage"
                ],
                "defaultValue": "StorageV2",
                "metadata": {
                    "description": "Indicates the type of storage account. - Storage, StorageV2, BlobStorage, FileStorage, BlockBlobStorage"
                }
            },
            "saAccessTier": {
                "type": "string"
            },
            "saSupportsHttpsTrafficOnly": {
                "type": "bool"
            },
            "kvName": {
                "type": "string"
            },
            "kvSkuName": {
                "type": "string"
            },
            "kvSkuFamily": {
                "type": "string"
            },
            "kvSecretsPermissions": {
                "type": "array"
            },
            "uamiName": {
                "type": "string"
            },
            "fa1Name": {
                "type": "string"
            },
            "fa2Name": {
                "type": "string"
            },
            "aspName": {
                "type": "string"
            },
            "aspRg": {
                "type": "string"
            },
            "appInsightsName": {
                "type": "string"
            },
            "appInsightsRg": {
                "type": "string"
            }
        },
        "variables": {
            "tenantId": "[subscription().tenantId]",
            "subscriptionId": "[subscription().subscriptionId]"
        },
        "resources": [
            {
                "type": "Microsoft.Resources/resourceGroups",
                "apiVersion": "2018-05-01",
                "location": "[parameters('depLocation')]",
                "name": "[parameters('rgName')]",
                "tags": "[parameters('tags')]",
                "properties": {
                }
            },
            {
                "type": "Microsoft.Resources/deployments",
                "apiVersion": "2018-05-01",
                "name": "resourceDeployment",
                "resourceGroup": "[parameters('rgName')]",
                "dependsOn": [
                    "[resourceId('Microsoft.Resources/resourceGroups/', parameters('rgName'))]"
                ],
                "properties": {
                    "mode": "Incremental",
                    "template": {
                        "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
                        "contentVersion": "1.0.0.0",
                        "resources": [
                            {
                                "name": "DeletionLock",
                                "type": "Microsoft.Authorization/locks",
                                "apiVersion": "2017-04-01",
                                "properties": {
                                    "level": "CanNotDelete",
                                    "notes": "[parameters('rgName')]"
                                }
                            },
                            {
                                "name": "[parameters('saName')]",
                                "type": "Microsoft.Storage/storageAccounts",
                                "apiVersion": "2019-04-01",
                                "sku": {
                                    "name": "[parameters('saType')]"
                                },
                                "kind": "[parameters('saKind')]",
                                "location": "[parameters('deplocation')]",
                                "tags": "[parameters('tags')]",
                                "properties": {
                                    "accessTier": "[parameters('saAccessTier')]",
                                    "supportsHttpsTrafficOnly": "[parameters('saSupportsHttpsTrafficOnly')]"
                                },
                                "resources": [
    
                                ]
                            },                       
                            {
                                "type": "Microsoft.Storage/storageAccounts/blobServices",
                                "apiVersion": "2019-04-01",
                                "name": "[concat(parameters('saName'), '/default')]",
                                "dependsOn": [                                
                                    "[concat('/subscriptions/',variables('subscriptionId'),'/resourceGroups/',parameters('rgName'),'/providers/Microsoft.Storage/storageAccounts/',parameters('saName'))]"
                                ],
                                "properties": {
                                    "cors": {
                                        "corsRules": [
                                        ]
                                    },
                                    "deleteRetentionPolicy": {
                                        "enabled": false
                                    }
                                }
                            },
                            {
                                "name": "[parameters('uamiName')]",
                                "type": "Microsoft.ManagedIdentity/userAssignedIdentities",
                                "apiVersion": "2018-11-30",
                                "location": "[parameters('deplocation')]",
                                "tags": "[parameters('tags')]",
                                "properties": {
                                }
                            },
                            {
                                "name": "[parameters('fa1Name')]",
                                "type": "Microsoft.Web/sites",
                                "apiVersion": "2019-08-01",
                                "kind": "functionapp",
                                "location": "[parameters('deplocation')]",
                                "tags": "[parameters('tags')]",
                                "dependsOn": [
                                    "[concat('/subscriptions/',variables('subscriptionId'),'/resourceGroups/',parameters('rgName'),'/providers/Microsoft.ManagedIdentity/userAssignedIdentities/',parameters('uamiName'))]",
                                    "[concat('/subscriptions/',variables('subscriptionId'),'/resourceGroups/',parameters('rgName'),'/providers/Microsoft.Storage/storageAccounts/',parameters('saName'))]"
                                ],
                                "identity": {
                                    "type": "SystemAssigned, UserAssigned",
                                    "userAssignedIdentities": {
                                        "[concat('/subscriptions/',variables('subscriptionId'),'/resourceGroups/',parameters('rgName'),'/providers/Microsoft.ManagedIdentity/userAssignedIdentities/',parameters('uamiName'))]": {
                                        }
                                    }
                                },
                                "properties": {
                                    "siteConfig": {
                                        "appSettings": [
                                            {
                                                "name": "FUNCTIONS_WORKER_RUNTIME",
                                                "value": "dotnet"
                                            },
                                            {
                                                "name": "WEBSITE_TIME_ZONE",
                                                "value": "W. Europe Standard Time"
                                            },
                                            // {
                                            //     "name": "AzureWebJobsStorage",
                                            //     "value": "[concat('DefaultEndpointsProtocol=https;AccountName=',parameters('saName'),';AccountKey=',listKeys(concat('/subscriptions/',variables('subscriptionId'),'/resourceGroups/',parameters('rgName'),'/providers/Microsoft.Storage/storageAccounts/',parameters('saName')),providers('Microsoft.Storage', 'storageAccounts').apiVersions[0]).keys[0].value,';')]"
                                            // },
                                            {
                                                "name": "FUNCTIONS_EXTENSION_VERSION",
                                                "value": "~2"
                                            },
                                            {
                                                "name": "WEBSITE_RUN_FROM_PACKAGE",
                                                "value": "0"
                                            },
                                            {
                                                "name": "APPINSIGHTS_INSTRUMENTATIONKEY",
                                                "value": "[reference(concat('/subscriptions/',variables('subscriptionId'),'/resourceGroups/',parameters('appInsightsRg'),'/providers/microsoft.insights/components/',parameters('appInsightsName')),providers('microsoft.insights', 'components').apiVersions[0]).InstrumentationKey]"
                                            }
                                        ],
                                        "alwaysOn": true
                                    },
                                    "serverFarmId": "[concat('/subscriptions/',variables('subscriptionId'),'/resourceGroups/',parameters('aspRg'),'/providers/Microsoft.Web/serverfarms/',parameters('aspName'))]",
                                    "httpsOnly": true
                                }
                            },
                            {
                                "name": "[parameters('fa2Name')]",
                                "type": "Microsoft.Web/sites",
                                "apiVersion": "2019-08-01",
                                "kind": "functionapp",
                                "location": "[parameters('deplocation')]",
                                "tags": "[parameters('tags')]",
                                "dependsOn": [
                                    "[concat('/subscriptions/',variables('subscriptionId'),'/resourceGroups/',parameters('rgName'),'/providers/Microsoft.ManagedIdentity/userAssignedIdentities/',parameters('uamiName'))]",
                                    "[concat('/subscriptions/',variables('subscriptionId'),'/resourceGroups/',parameters('rgName'),'/providers/Microsoft.Storage/storageAccounts/',parameters('saName'))]"
                                ],
                                "identity": {
                                    "type": "SystemAssigned, UserAssigned",
                                    "userAssignedIdentities": {
                                        "[concat('/subscriptions/',variables('subscriptionId'),'/resourceGroups/',parameters('rgName'),'/providers/Microsoft.ManagedIdentity/userAssignedIdentities/',parameters('uamiName'))]": {
                                        }
                                    }
                                },
                                "properties": {
                                    "siteConfig": {
                                        "appSettings": [
                                            {
                                                "name": "FUNCTIONS_WORKER_RUNTIME",
                                                "value": "dotnet"
                                            },
                                            {
                                                "name": "WEBSITE_TIME_ZONE",
                                                "value": "W. Europe Standard Time"
                                            },
                                            // {
                                            //     "name": "AzureWebJobsStorage",
                                            //     "value": "[concat('DefaultEndpointsProtocol=https;AccountName=',parameters('saName'),';AccountKey=',listKeys(concat('/subscriptions/',variables('subscriptionId'),'/resourceGroups/',parameters('rgName'),'/providers/Microsoft.Storage/storageAccounts/',parameters('saName')),providers('Microsoft.Storage', 'storageAccounts').apiVersions[0]).keys[0].value,';')]"
                                            // },
                                            {
                                                "name": "FUNCTIONS_EXTENSION_VERSION",
                                                "value": "~2"
                                            },
                                            {
                                                "name": "WEBSITE_RUN_FROM_PACKAGE",
                                                "value": "0"
                                            },
                                            {
                                                "name": "APPINSIGHTS_INSTRUMENTATIONKEY",
                                                "value": "[reference(concat('/subscriptions/',variables('subscriptionId'),'/resourceGroups/',parameters('appInsightsRg'),'/providers/microsoft.insights/components/',parameters('appInsightsName')),providers('microsoft.insights', 'components').apiVersions[0]).InstrumentationKey]"
                                            }
                                        ],
                                        "alwaysOn": true
                                    },
                                    "serverFarmId": "[concat('/subscriptions/',variables('subscriptionId'),'/resourceGroups/',parameters('aspRg'),'/providers/Microsoft.Web/serverfarms/',parameters('aspName'))]",
                                    "httpsOnly": true
                                }
                            },
                            {
                                "name": "[parameters('kvName')]",
                                "type": "Microsoft.KeyVault/vaults",
                                "apiVersion": "2018-02-14",
                                "location": "[parameters('deplocation')]",
                                "tags": "[parameters('tags')]",
                                "dependsOn": [
                                    "[concat('/subscriptions/',variables('subscriptionId'),'/resourceGroups/',parameters('rgName'),'/providers/Microsoft.Web/sites/',parameters('fa1Name'))]",
                                    "[concat('/subscriptions/',variables('subscriptionId'),'/resourceGroups/',parameters('rgName'),'/providers/Microsoft.Web/sites/',parameters('fa2Name'))]"                                
                                ],
                                "properties": {
                                    "tenantId": "[variables('tenantId')]",
                                    "accessPolicies": [
                                        // {
                                        //     "tenantId": "[variables('tenantId')]",
                                        //     "objectId": "[reference(concat('/subscriptions/',variables('subscriptionId'),'/resourceGroups/',parameters('rgName'),'/providers/Microsoft.Web/sites/', parameters('fa1Name'), '/providers/Microsoft.ManagedIdentity/Identities/default'),providers('Microsoft.ManagedIdentity', 'Identities').apiVersions[0]).principalId]",
                                        //     "permissions": {
                                        //         "secrets": "[parameters('kvSecretsPermissions')]"
                                        //     }
                                        // },
                                        // {
                                        //     "tenantId": "[variables('tenantId')]",
                                        //     "objectId": "[reference(concat('/subscriptions/',variables('subscriptionId'),'/resourceGroups/',parameters('rgName'),'/providers/Microsoft.Web/sites/', parameters('fa2Name'), '/providers/Microsoft.ManagedIdentity/Identities/default'),providers('Microsoft.ManagedIdentity', 'Identities').apiVersions[0]).principalId]",
                                        //     "permissions": {
                                        //         "secrets": "[parameters('kvSecretsPermissions')]"
                                        //     }
                                        // }
                                    ],
                                    "sku": {
                                        "name": "[parameters('kvSkuName')]",
                                        "family": "[parameters('kvSkuFamily')]"
                                    }
    
                                }
                            }
                        ]
                    }
                }
            }
        ],
        "outputs": {
            // "uamiPrincipalId": {            
            //     "value": "[reference(concat('/subscriptions/',variables('subscriptionId'),'/resourceGroups/',parameters('rgName'),'/providers/Microsoft.ManagedIdentity/userAssignedIdentities/', parameters('uamiName')), providers('Microsoft.ManagedIdentity', 'userAssignedIdentities').apiVersions[0]).principalId]",
            //     "type": "string"
            // }
        }
    }
    

    这项工作非常完美,但正如你所看到的,我注释掉了 3 个部分。这是现在的问题区域。它们都是dependsOn问题。当我取消注释函数应用部署中的 AzureWebJobsStorage 部分时,部署失败并显示以下消息:

    12:00:18 - Resource Microsoft.Storage/storageAccounts 'resourcesdevsa' failed with message '{
      "error": {
        "code": "ResourceGroupNotFound",
        "message": "Resource group 'resources-dev-rg' could not be found."
      }
    }'
    

    我已将 StorageAccount 添加到 dependentOn 部分

    "dependsOn": [
      "[concat('/subscriptions/',variables('subscriptionId'),'/resourceGroups/',parameters('rgName'),'/providers/Microsoft.ManagedIdentity/userAssignedIdentities/',parameters('uamiName'))]",
      "[concat('/subscriptions/',variables('subscriptionId'),'/resourceGroups/',parameters('rgName'),'/providers/Microsoft.Storage/storageAccounts/',parameters('saName'))]"
    ],
    

    但这似乎并不能解决问题。

    有什么想法吗?

    更新2019年11月28日

    好的。我有点沮丧。我现在拥有功能齐全的资源组级别部署。我正在 powershell 中创建资源组和资源组删除锁,然后创建 New-AzResourceGroupDeployment。当我尝试将其重写为订阅级别部署时,我不断遇到依赖性问题。例如;创建 KeyVault 访问策略会导致找不到函数应用的错误。为函数应用设置 AzureWebJobsStorage 设置时也会出现类似的错误。但当然不是对存储帐户的引用。

    关于azure - 使用 ARM 订阅级部署部署多个资源时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58997832/

    相关文章:

    azure - 大容量复制程序 (bcp) 实用程序 - 导入 CSV 时出错 - 证书链由不受信任的机构颁发

    azure - 用于与现有 VNET 子网集成应用服务的 ARM 模板

    交叉编译 helloworld.c 到 ARM (Cortex-A5)

    c# - ASP.NET MVC 如何将应用程序从 ASP.NET Identity 转换为 Azure AD

    windows - 在没有虚拟化的情况下在 Windows 上运行 Docker

    windows - Windows Server 2016 TP4上的Docker通过powershell下载容器中的git

    c++ - C++ 初始化器上的 Cortex M4 硬故障

    python - 如何验证您在 Azure 上是否有足够的资源

    Azure 创建的 ARM 在 Azure 中无效

    azure - 使用托管身份将 API 连接到服务总线的 ARM 模板