Funkcje zasobów dla szablonów arm

Resource Manager udostępnia następujące funkcje służące do uzyskiwania wartości zasobów w szablonie Azure Resource Manager (szablon usługi ARM):

Aby uzyskać wartości z parametrów, zmiennych lub bieżącego wdrożenia, zobacz Funkcje wartości wdrożenia.

Aby uzyskać wartości zakresu wdrożenia, zobacz Funkcje zakresu.

extensionResourceId

extensionResourceId(baseResourceId, resourceType, resourceName1, [resourceName2], ...)

Zwraca identyfikator zasobu rozszerzenia ,który jest typem zasobu stosowanym do innego zasobu w celu dodania go do jego możliwości.

Parametry

Parametr Wymagane Typ Opis
baseResourceId Tak ciąg Identyfikator zasobu dla zasobu, do których jest stosowany zasób rozszerzenia.
resourceType Tak ciąg Typ zasobu rozszerzenia, w tym przestrzeń nazw dostawcy zasobów.
resourceName1 Tak ciąg Nazwa zasobu rozszerzenia.
resourceName2 Nie ciąg Następny segment nazwy zasobu, jeśli to konieczne.

Kontynuuj dodawanie nazw zasobów jako parametrów, gdy typ zasobu zawiera więcej segmentów.

Wartość zwracana

Podstawowy format identyfikatora zasobu zwróconego przez tę funkcję to:

{scope}/providers/{extensionResourceProviderNamespace}/{extensionResourceType}/{extensionResourceName}

Segment zakresu różni się w zależności od rozszerzanych zasobów podstawowych. Na przykład identyfikator subskrypcji ma inne segmenty niż identyfikator grupy zasobów.

Po zastosowaniu zasobu rozszerzenia do zasobu identyfikator zasobu jest zwracany w następującym formacie:

/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{baseResourceProviderNamespace}/{baseResourceType}/{baseResourceName}/providers/{extensionResourceProviderNamespace}/{extensionResourceType}/{extensionResourceName}

Po zastosowaniu zasobu rozszerzenia do grupy zasobów zwracany format to:

/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{extensionResourceProviderNamespace}/{extensionResourceType}/{extensionResourceName}

Przykład użycia tej funkcji z grupą zasobów przedstawiono w następnej sekcji.

Po zastosowaniu zasobu rozszerzenia do subskrypcji zwracany format to:

/subscriptions/{subscriptionId}/providers/{extensionResourceProviderNamespace}/{extensionResourceType}/{extensionResourceName}

Po zastosowaniu zasobu rozszerzenia do grupy zarządzania zwracany format to:

/providers/Microsoft.Management/managementGroups/{managementGroupName}/providers/{extensionResourceProviderNamespace}/{extensionResourceType}/{extensionResourceName}

Przykład użycia tej funkcji z grupą zarządzania został przedstawiony w następnej sekcji.

przykład extensionResourceId

Poniższy przykład zwraca identyfikator zasobu blokady grupy zasobów.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "lockName": {
      "type": "string"
    }
  },
  "variables": {},
  "resources": [],
  "outputs": {
    "lockResourceId": {
      "type": "string",
      "value": "[extensionResourceId(resourceGroup().Id , 'Microsoft.Authorization/locks', parameters('lockName'))]"
    }
  }
}

Definicja zasad niestandardowych wdrożona w grupie zarządzania jest implementowana jako zasób rozszerzenia. Aby utworzyć i przypisać zasady, należy wdrożyć następujący szablon w grupie zarządzania.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-08-01/managementGroupDeploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "metadata": {
    "_generator": {
      "name": "bicep",
      "version": "0.4.1.14562",
      "templateHash": "2350252618174097128"
    }
  },
  "parameters": {
    "targetMG": {
      "type": "string",
      "metadata": {
        "description": "Target Management Group"
      }
    },
    "allowedLocations": {
      "type": "array",
      "defaultValue": [
        "australiaeast",
        "australiasoutheast",
        "australiacentral"
      ],
      "metadata": {
        "description": "An array of the allowed locations, all other locations will be denied by the created policy."
      }
    }
  },
  "functions": [],
  "variables": {
    "mgScope": "[tenantResourceId('Microsoft.Management/managementGroups', parameters('targetMG'))]",
    "policyDefinitionName": "LocationRestriction"
  },
  "resources": [
    {
      "type": "Microsoft.Authorization/policyDefinitions",
      "apiVersion": "2020-03-01",
      "name": "[variables('policyDefinitionName')]",
      "properties": {
        "policyType": "Custom",
        "mode": "All",
        "parameters": {},
        "policyRule": {
          "if": {
            "not": {
              "field": "location",
              "in": "[parameters('allowedLocations')]"
            }
          },
          "then": {
            "effect": "deny"
          }
        }
      }
    },
    {
      "type": "Microsoft.Authorization/policyAssignments",
      "apiVersion": "2020-03-01",
      "name": "location-lock",
      "properties": {
        "scope": "[variables('mgScope')]",
        "policyDefinitionId": "[extensionResourceId(variables('mgScope'), 'Microsoft.Authorization/policyDefinitions', variables('policyDefinitionName'))]"
      },
      "dependsOn": [
        "[format('Microsoft.Authorization/policyDefinitions/{0}', variables('policyDefinitionName'))]"
      ]
    }
  ]
}

Wbudowane definicje zasad to zasoby na poziomie dzierżawy. Aby uzyskać przykład wdrażania wbudowanej definicji zasad, zobacz tenantResourceId.

list*

list{Value}(resourceName or resourceIdentifier, apiVersion, functionValues)

Składnia tej funkcji zależy od nazwy operacji listy. Każda implementacja zwraca wartości dla typu zasobu, który obsługuje operację listy. Nazwa operacji musi zaczynać się od list i może mieć sufiks. Niektóre typowe zastosowania to list , listKeys , i listKeyValue listSecrets .

Parametry

Parametr Wymagane Typ Opis
resourceName lub resourceIdentifier Tak ciąg Unikatowy identyfikator zasobu.
apiVersion Tak ciąg Wersja interfejsu API stanu środowiska uruchomieniowego zasobów. Zazwyczaj w formacie yyyy-mm-dd.
functionValues Nie object Obiekt, który ma wartości funkcji. Ten obiekt należy udostępnić tylko dla funkcji, które obsługują odbieranie obiektu z wartościami parametrów, takimi jak listAccountSas na koncie magazynu. W tym artykule przedstawiono przykład przekazywania wartości funkcji.

Prawidłowe zastosowania

Funkcje listy mogą być używane we właściwościach definicji zasobu. Nie używaj funkcji list, która uwidacznia poufne informacje w sekcji danych wyjściowych szablonu. Wartości wyjściowe są przechowywane w historii wdrażania i mogą być pobierane przez złośliwego użytkownika.

W przypadku użycia z iteracjąwłaściwości można użyć funkcji listy , ponieważ wyrażenie jest input przypisane do właściwości zasobu. Nie można ich używać z , count ponieważ liczba musi zostać określona przed rozpoznaną funkcją listy.

Implementacje

Możliwe zastosowania listy* przedstawiono w poniższej tabeli.

Typ zasobu Nazwa funkcji
Microsoft.Addons/supportProviders listsupportplaninfo
Microsoft.AnalysisServices/servers listGatewayStatus
Microsoft.ApiManagement/service/authorizationServers listSecrets
Microsoft.ApiManagement/service/gateways listKeys
Microsoft.ApiManagement/service/identityProviders listSecrets
Microsoft.ApiManagement/service/namedValues listValue
Microsoft.ApiManagement/service/openidConnectProviders listSecrets
Microsoft.ApiManagement/service/subscriptions listSecrets
Microsoft.AppConfiguration/configurationStores ListKeys
Microsoft.AppPlatform/Spring listTestKeys
Microsoft.Automation/automationAccounts listKeys
Microsoft.Batch/batchAccounts listkeys
Microsoft.BatchAI/workspaces/experiments/jobs listoutputfiles
Microsoft.Blockchain/blockchainMembers listApiKeys
Microsoft.Blockchain/blockchainMembers/transactionNodes listApiKeys
Microsoft.BotService/botServices/channels listChannelWithKeys
Microsoft.Cache/redis listKeys
Microsoft.CognitiveServices/accounts listKeys
Microsoft.ContainerRegistry/registries listBuildSourceUploadUrl
Microsoft.ContainerRegistry/registries listCredentials
Microsoft.ContainerRegistry/registries listUsages
Microsoft.ContainerRegistry/registries/agentpools listQueueStatus
Microsoft.ContainerRegistry/registries/buildTasks listSourceRepositoryProperties
Microsoft.ContainerRegistry/registries/buildTasks/steps listBuildArguments
Microsoft.ContainerRegistry/registries/taskruns listDetails
Microsoft.ContainerRegistry/registries/webhooks listEvents
Microsoft.ContainerRegistry/registries/runs listLogSasUrl
Microsoft.ContainerRegistry/registries/tasks listDetails
Microsoft.ContainerService/managedClusters listClusterAdminCredential
Microsoft.ContainerService/managedClusters listClusterMonitoringUserCredential
Microsoft.ContainerService/managedClusters listClusterUserCredential
Microsoft.ContainerService/managedClusters/accessProfiles listCredential
Microsoft.DataBox/jobs listCredentials
Microsoft.DataFactory/datafactories/gateways listauthkeys
Microsoft.DataFactory/fabryki/integrationruntimes listauthkeys
Microsoft.DataLakeAnalytics/accounts/storageAccounts/Containers listSasTokens
Microsoft.DataShare/accounts/shares listSynchronizations
Microsoft.DataShare/accounts/shareSubscriptions listSourceShareSynchronizationSettings
Microsoft.DataShare/accounts/shareSubscriptions listSynchronizationDetails
Microsoft.DataShare/accounts/shareSubscriptions listSynchronizations
Microsoft.Devices/iotHubs listkeys
Microsoft.Devices/iotHubs/iotHubKeys listkeys
Microsoft.Devices/provisioningServices/keys listkeys
Microsoft.Devices/provisioningServices listkeys
Microsoft.DevTestLab/labs ListVhds
Microsoft.DevTestLab/labs/schedules ListApplicable
Microsoft.DevTestLab/labs/users/serviceFabrics ListApplicableSchedules
Microsoft.DevTestLab/labs/virtualMachines ListApplicableSchedules
Microsoft.DocumentDB/databaseAccounts listConnectionStrings
Microsoft.DocumentDB/databaseAccounts listKeys
Microsoft.DocumentDB/databaseAccounts/notebookWorkspaces listConnectionInfo
Microsoft.DomainRegistration listDomainRecommendations
Microsoft.DomainRegistration/topLevelDomains listAgreements
Microsoft.EventGrid/domains listKeys
Microsoft.EventGrid/topics listKeys
Microsoft.EventHub/namespaces/authorizationRules listkeys
Microsoft.EventHub/namespaces/disasterRecoveryConfigs/authorizationRules listkeys
Microsoft.EventHub/namespaces/eventhubs/authorizationRules listkeys
Microsoft.ImportExport/jobs listBitLockerKeys
Microsoft.Kusto/Clusters/Databases ListPrincipals
Microsoft.LabServices/users ListEnvironments
Microsoft.LabServices/users ListLabs
Microsoft.Logic/integrationAccounts/agreements listContentCallbackUrl
Microsoft.Logic/integrationAccounts/assemblies listContentCallbackUrl
Microsoft.Logic/integrationAccounts listCallbackUrl
Microsoft.Logic/integrationAccounts listKeyVaultKeys
Microsoft.Logic/integrationAccounts/maps listContentCallbackUrl
Microsoft.Logic/integrationAccounts/partners listContentCallbackUrl
Microsoft.Logic/integrationAccounts/schemas listContentCallbackUrl
Microsoft.Logic/workflows listCallbackUrl
Microsoft.Logic/workflows listSwagger
Microsoft.Logic/workflows/runs/actions listExpressionTraces
Microsoft.Logic/workflows/runs/actions/powtórzenia listExpressionTraces
Microsoft.Logic/workflows/triggers listCallbackUrl
Microsoft.Logic/workflows/versions/triggers listCallbackUrl
Microsoft.MachineLearning/webServices listkeys
Microsoft.MachineLearning/Workspaces listworkspacekeys
Microsoft.MachineLearningServices/workspaces/computes listKeys
Microsoft.MachineLearningServices/workspaces/computes listNodes
Microsoft.MachineLearningServices/workspaces listKeys
Microsoft. Mapy/konta listKeys
Microsoft.Media/mediaservices/assets listContainerSas
Microsoft.Media/mediaservices/assets listStreamingLocators
Microsoft.Media/mediaservices/streamingLocators listContentKeys
Microsoft.Media/mediaservices/streamingLocators listPaths
Microsoft.Network/applicationSecurityGroups listIpConfigurations
Microsoft.NotificationHubs/Namespaces/authorizationRules listkeys
Microsoft.NotificationHubs/Namespaces/NotificationHubs/authorizationRules listkeys
Microsoft.OperationalInsights/workspaces list
Microsoft.OperationalInsights/workspaces listKeys
Microsoft.PolicyInsights/remediations listDeployments
Microsoft.RedHatOpenShift/openShiftClusters listCredentials
Microsoft.Relay/namespaces/authorizationRules listkeys
Microsoft.Relay/namespaces/disasterRecoveryConfigs/authorizationRules listkeys
Microsoft.Relay/namespaces/HybridConnections/authorizationRules listkeys
Microsoft.Relay/namespaces/WcfRelays/authorizationRules listkeys
Microsoft.Search/searchServices listAdminKeys
Microsoft.Search/searchServices listQueryKeys
Microsoft.ServiceBus/namespaces/authorizationRules listkeys
Microsoft.ServiceBus/namespaces/disasterRecoveryConfigs/authorizationRules listkeys
Microsoft.ServiceBus/namespaces/queues/authorizationRules listkeys
Microsoft.ServiceBus/namespaces/topics/authorizationRules listkeys
Microsoft.SignalRService/SignalR listkeys
Microsoft. Storage/storageAccounts listAccountSas
Microsoft. Storage/storageAccounts listkeys
Microsoft. Storage/storageAccounts listServiceSas
Microsoft.StorSimple/managers/devices listFailoverSets
Microsoft.StorSimple/managers/devices listFailoverTargets
Microsoft.StorSimple/managers listActivationKey
Microsoft.StorSimple/managers listPublicEncryptionKey
Microsoft.Synapse/workspaces/integrationRuntimes listAuthKeys
Microsoft.Web/connectionGateways ListStatus
microsoft.web/connections listconsentlinks
Microsoft.Web/customApis listWsdlInterfaces
microsoft.web/locations listwsdlinterfaces
microsoft.web/apimanagementaccounts/apis/connections listconnectionkeys
microsoft.web/apimanagementaccounts/apis/connections listSecrets
microsoft.web/sites/backups list
Microsoft.Web/sites/config list
microsoft.web/sites/functions listkeys
microsoft.web/sites/functions listSecrets
microsoft.web/sites/hybridconnectionnamespaces/relays listkeys
microsoft.web/sites listsyncfunctiontriggerstatus
microsoft.web/sites/slots/functions listSecrets
microsoft.web/sites/slots/backups list
Microsoft.Web/sites/slots/config list
microsoft.web/sites/slots/functions listSecrets

Aby określić, które typy zasobów mają operację listy, dostępne są następujące opcje:

  • Wyświetl operacje interfejsu API REST dla dostawcy zasobów i poszukaj operacji listy. Na przykład konta magazynu mają operację listKeys.

  • Użyj polecenia cmdlet Get-AzProviderOperation programu PowerShell. Poniższy przykład pobiera wszystkie operacje listy dla kont magazynu:

    Get-AzProviderOperation -OperationSearchString "Microsoft.Storage/*" | where {$_.Operation -like "*list*"} | FT Operation
    
  • Użyj następującego polecenia interfejsu wiersza polecenia platformy Azure, aby filtrować tylko operacje listy:

    az provider operation show --namespace Microsoft.Storage --query "resourceTypes[?name=='storageAccounts'].operations[].name | [?contains(@, 'list')]"
    

Wartość zwracana

Zwrócony obiekt różni się w zależności od funkcji listy, z których korzystasz. Na przykład wartość listKeys dla konta magazynu zwraca następujący format:

{
  "keys": [
    {
      "keyName": "key1",
      "permissions": "Full",
      "value": "{value}"
    },
    {
      "keyName": "key2",
      "permissions": "Full",
      "value": "{value}"
    }
  ]
}

Inne funkcje listy mają różne formaty zwracane. Aby wyświetlić format funkcji, dołącz ją do sekcji danych wyjściowych, jak pokazano w przykładowym szablonie.

Uwagi

Określ zasób przy użyciu nazwy zasobu lub funkcji resourceId. W przypadku korzystania z funkcji listy w tym samym szablonie, który wdraża przywołyty zasób, użyj nazwy zasobu.

Jeśli używasz funkcji w zasobie, który jest wdrażany warunkowo, funkcja jest oceniana nawet wtedy, gdy list zasób nie został wdrożony. Jeśli funkcja odwołuje się do zasobu, który nie istnieje, wystąpi list błąd. Użyj funkcji , aby upewnić się, że funkcja jest oceniana tylko podczas if wdrażania zasobu. Zobacz funkcję if przykładowego szablonu, który używa instrukcji if i z warunkowo wdrożonym zasobem.

Przykład listy

W poniższym przykładzie użyto listKeys podczas ustawiania wartości dla skryptów wdrażania.

"storageAccountSettings": {
  "storageAccountName": "[variables('storageAccountName')]",
  "storageAccountKey": "[listKeys(resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName')), '2019-06-01').keys[0].value]"
}

W następnym przykładzie pokazano funkcję listy, która przyjmuje parametr . W tym przypadku funkcja to listAccountSas. Przekaż obiekt na czas wygaśnięcia. Czas wygaśnięcia musi być w przyszłości.

"parameters": {
  "accountSasProperties": {
    "type": "object",
    "defaultValue": {
      "signedServices": "b",
      "signedPermission": "r",
      "signedExpiry": "2020-08-20T11:00:00Z",
      "signedResourceTypes": "s"
    }
  }
},
...
"sasToken": "[listAccountSas(parameters('storagename'), '2018-02-01', parameters('accountSasProperties')).accountSasToken]"

pickZones

pickZones(providerNamespace, resourceType, location, [numberOfZones], [offset])

Określa, czy typ zasobu obsługuje strefy dla określonej lokalizacji lub regionu. Ta funkcja obsługuje tylko zasoby strefowe, a usługi strefowo nadmiarowe zwracają pustą tablicę. Aby uzyskać więcej informacji, zobacz Usługi platformy Azure, które obsługują Strefy dostępności. Aby użyć funkcji pickZones z usługami strefowo nadmiarowych, zobacz poniższe przykłady.

Parametry

Parametr Wymagane Typ Opis
providerNamespace Tak ciąg Przestrzeń nazw dostawcy zasobów dla typu zasobu do sprawdzania obsługi strefy.
resourceType Tak ciąg Typ zasobu, który ma być sprawdzany pod celu obsługi strefy.
location Tak ciąg Region, w przypadku których ma być sprawdzana obsługa strefy.
numberOfZones Nie liczba całkowita Liczba stref logicznych do zwrócenia. Wartość domyślna to 1. Liczba musi być dodatnią liczbą całkowitą z 1 do 3. Użyj 1 dla zasobów z jedną strefą. W przypadku zasobów z wieloma strefami wartość musi być mniejsza lub równa liczbie obsługiwanych stref.
przesunięcie Nie liczba całkowita Przesunięcie od strefy logicznej uruchamiania. Funkcja zwraca błąd, jeśli przesunięcie plus liczba stref przekracza liczbę obsługiwanych stref.

Wartość zwracana

Tablica z obsługiwanymi strefami. W przypadku używania wartości domyślnych dla wartości offset i numberOfZones typ zasobu i region obsługujący strefy zwraca następującą tablicę:

[
    "1"
]

Gdy parametr numberOfZones jest ustawiony na 3, zwraca:

[
    "1",
    "2",
    "3"
]

Gdy typ zasobu lub region nie obsługuje stref, zwracana jest pusta tablica. Pusta tablica jest również zwracana dla usług strefowo nadmiarowych.

[
]

Uwagi

Istnieją różne kategorie dla Strefy dostępności platformy Azure — strefowe i strefowo nadmiarowe. Funkcja pickZones może służyć do zwracania numeru strefy dostępności lub liczb dla zasobu strefowego. W przypadku usług strefowo nadmiarowych (ZRS) funkcja zwróci pustą tablicę. Zasoby strefowe można zwykle zidentyfikować za pomocą właściwości zones w nagłówku zasobu. Usługi strefowo nadmiarowe mają różne sposoby identyfikowania i używania stref dostępności dla poszczególnych zasobów. Skorzystaj z dokumentacji dla określonej usługi, aby określić kategorię obsługi stref dostępności. Aby uzyskać więcej informacji, zobacz Usługi platformy Azure, które obsługują Strefy dostępności.

Aby określić, czy dany region lub lokalizacja platformy Azure obsługuje strefy dostępności, wywołaj funkcję pickZones() z typem zasobu strefowego, na przykład Microsoft.Storage/storageAccounts . Jeśli odpowiedź nie jest pusta, region obsługuje strefy dostępności.

przykład pickZones

Poniższy szablon przedstawia trzy wyniki użycia funkcji pickZones.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {},
  "functions": [],
  "variables": {},
  "resources": [],
  "outputs": {
    "supported": {
      "type": "array",
      "value": "[pickZones('Microsoft.Compute', 'virtualMachines', 'westus2')]"
    },
    "notSupportedRegion": {
      "type": "array",
      "value": "[pickZones('Microsoft.Compute', 'virtualMachines', 'northcentralus')]"
    },
    "notSupportedType": {
      "type": "array",
      "value": "[pickZones('Microsoft.Cdn', 'profiles', 'westus2')]"
    }
  }
}

Dane wyjściowe z powyższych przykładów zwraca trzy tablice.

Nazwa Typ Wartość
Obsługiwane array [ "1" ]
notSupportedRegion array []
notSupportedType array []

Możesz użyć odpowiedzi z pickZones, aby określić, czy zapewnić wartość null dla stref, czy przypisać maszyny wirtualne do różnych stref. W poniższym przykładzie ustawiana jest wartość strefy na podstawie dostępności stref.

"zones": {
  "value": "[if(not(empty(pickZones('Microsoft.Compute', 'virtualMachines', 'westus2'))), string(add(mod(copyIndex(),3),1)), json('null'))]"
},

W poniższym przykładzie pokazano, jak za pomocą funkcji pickZones włączyć nadmiarowość strefy dla Cosmos DB.

"resources": [
  {
    "type": "Microsoft.DocumentDB/databaseAccounts",
    "apiVersion": "2021-04-15",
    "name": "[variables('accountName_var')]",
    "location": "[parameters('location')]",
    "kind": "GlobalDocumentDB",
    "properties": {
      "consistencyPolicy": "[variables('consistencyPolicy')[parameters('defaultConsistencyLevel')]]",
      "locations": [
        {
          "locationName": "[parameters('primaryRegion')]",
          "failoverPriority": 0,
          "isZoneRedundant": "[if(empty(pickZones('Microsoft.Storage', 'storageAccounts', parameters('primaryRegion'))), bool('false'), bool('true'))]",
        },
        {
          "locationName": "[parameters('secondaryRegion')]",
          "failoverPriority": 1,
          "isZoneRedundant": "[if(empty(pickZones('Microsoft.Storage', 'storageAccounts', parameters('secondaryRegion'))), bool('false'), bool('true'))]",
        }
      ],
      "databaseAccountOfferType": "Standard",
      "enableAutomaticFailover": "[parameters('automaticFailover')]"
    }
  }
]

dostawców

Funkcja providers jest przestarzała. Nie zalecamy już jej używania. Jeśli używasz tej funkcji do uzyskania wersji interfejsu API dla dostawcy zasobów, zalecamy podanie określonej wersji interfejsu API w szablonie. Użycie dynamicznie zwracanej wersji interfejsu API może przerwać szablon, jeśli właściwości zmienią się między wersjami.

reference

reference(resourceName or resourceIdentifier, [apiVersion], ['Full'])

Zwraca obiekt reprezentujący stan środowiska uruchomieniowego zasobu.

Parametry

Parametr Wymagane Typ Opis
resourceName lub resourceIdentifier Tak ciąg Nazwa lub unikatowy identyfikator zasobu. Podczas odwoływania się do zasobu w bieżącym szablonie podaj tylko nazwę zasobu jako parametr. W przypadku odwoływania się do wcześniej wdrożonego zasobu lub gdy nazwa zasobu jest niejednoznaczna, podaj identyfikator zasobu.
apiVersion Nie ciąg Wersja interfejsu API określonego zasobu. Ten parametr jest wymagany, gdy zasób nie jest aprowowany w ramach tego samego szablonu. Zazwyczaj w formacie yyyy-mm-dd. Aby uzyskać informacje o prawidłowych wersjach interfejsu API dla zasobu, zobacz informacje o szablonie.
"Pełna" Nie ciąg Wartość określająca, czy ma być zwracany obiekt pełnego zasobu. Jeśli nie określisz właściwości , zostanie zwrócony tylko obiekt 'Full' właściwości zasobu. Pełny obiekt zawiera wartości, takie jak identyfikator zasobu i lokalizacja.

Wartość zwracana

Każdy typ zasobu zwraca inne właściwości dla funkcji odwołania. Funkcja nie zwraca jednego wstępnie zdefiniowanego formatu. Ponadto zwracana wartość różni się w zależności od wartości 'Full' argumentu. Aby wyświetlić właściwości typu zasobu, zwróć obiekt w sekcji danych wyjściowych, jak pokazano w przykładzie.

Uwagi

Funkcja referencyjna pobiera stan środowiska uruchomieniowego wcześniej wdrożonego zasobu lub zasobu wdrożonego w bieżącym szablonie. W tym artykule przedstawiono przykłady dla obu scenariuszy.

Zazwyczaj funkcja zwraca określoną wartość z obiektu, taką jak identyfikator URI punktu końcowego obiektu blob lub w reference pełni kwalifikowana nazwa domeny.

"outputs": {
  "BlobUri": {
    "type": "string",
    "value": "[reference(resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName'))).primaryEndpoints.blob]"
  },
  "FQDN": {
    "type": "string",
    "value": "[reference(resourceId('Microsoft.Network/publicIPAddresses', parameters('ipAddressName'))).dnsSettings.fqdn]"
  }
}

Użyj, 'Full' gdy potrzebujesz wartości zasobów, które nie są częścią schematu właściwości. Aby na przykład ustawić zasady dostępu do magazynu kluczy, pobierz właściwości tożsamości dla maszyny wirtualnej.

{
  "type": "Microsoft.KeyVault/vaults",
  "apiVersion": "2019-09-01",
  "name": "vaultName",
  "properties": {
    "tenantId": "[subscription().tenantId]",
    "accessPolicies": [
      {
        "tenantId": "[reference(resourceId('Microsoft.Compute/virtualMachines', variables('vmName')), '2019-03-01', 'Full').identity.tenantId]",
        "objectId": "[reference(resourceId('Microsoft.Compute/virtualMachines', variables('vmName')), '2019-03-01', 'Full').identity.principalId]",
        "permissions": {
          "keys": [
            "all"
          ],
          "secrets": [
            "all"
          ]
        }
      }
    ],
    ...

Prawidłowe zastosowania

Funkcji referencyjnej można używać tylko we właściwościach definicji zasobu i sekcji danych wyjściowych szablonu lub wdrożenia. W przypadku użycia z iteracjąwłaściwości można użyć funkcji odwołania dla , ponieważ wyrażenie jest input przypisane do właściwości zasobu.

Nie można użyć funkcji odwołania do ustawienia wartości właściwości count w pętli kopiowania. Możesz użyć funkcji , aby ustawić inne właściwości w pętli. Odwołanie jest blokowane dla właściwości count, ponieważ ta właściwość musi zostać określona przed rozpoznaną funkcją referencyjną.

Aby użyć funkcji lub dowolnej funkcji w sekcji outputs (dane wyjściowe) zagnieżdżonych szablonów, należy ustawić obiekt do używania oceny zakresu wewnętrznego lub użyć połączonego szablonu zamiast szablonu reference list* expressionEvaluationOptions zagnieżdżonych.

Jeśli używasz funkcji w zasobie, który jest wdrażany warunkowo, funkcja jest oceniana nawet wtedy, gdy reference zasób nie został wdrożony. Jeśli funkcja odwołuje się do zasobu, który nie istnieje, wystąpi reference błąd. Użyj if funkcji , aby upewnić się, że funkcja jest oceniana tylko podczas wdrażania zasobu. Zobacz funkcję if przykładowego szablonu, który używa instrukcji if i z warunkowo wdrożonym zasobem.

Zależność niejawna

Korzystając z funkcji odwołania, niejawnie deklaruje się, że jeden zasób zależy od innego zasobu, jeśli przywołyowany zasób jest aprowowany w ramach tego samego szablonu i odwołujesz się do zasobu według jego nazwy (a nie identyfikatora zasobu). Nie trzeba również używać właściwości dependsOn. Funkcja nie jest oceniana, dopóki zasób, do których się odwołujesz, nie zakończy wdrożenia.

Nazwa lub identyfikator zasobu

W przypadku odwoływania się do zasobu wdrożonego w tym samym szablonie podaj nazwę zasobu.

"value": "[reference(parameters('storageAccountName'))]"

W przypadku odwoływania się do zasobu, który nie został wdrożony w tym samym szablonie, podaj identyfikator zasobu i apiVersion .

"value": "[reference(resourceId(parameters('storageResourceGroup'), 'Microsoft.Storage/storageAccounts', parameters('storageAccountName')), '2018-07-01')]"

Aby uniknąć niejednoznaczności co do zasobu, do którego się odwołujesz, możesz podać w pełni kwalifikowany identyfikator zasobu.

"value": "[reference(resourceId('Microsoft.Network/publicIPAddresses', parameters('ipAddressName')))]"

Podczas konstruowania w pełni kwalifikowanego odwołania do zasobu kolejność łączenia segmentów z typu i nazwy nie jest po prostu ich łączeniem. Zamiast tego po przestrzeni nazw użyj sekwencji par typu/nazwy od najmniej określonej do najbardziej specyficznej:

{resource-provider-namespace}/{parent-resource-type}/{parent-resource-name}[/{child-resource-type}/{child-resource-name}]

Na przykład:

Microsoft.Compute/virtualMachines/myVM/extensions/myExt odpowiedź jest Microsoft.Compute/virtualMachines/extensions/myVM/myExt poprawna, ale nie jest poprawna

Aby uprościć tworzenie dowolnego identyfikatora zasobu, użyj funkcji opisanych w tym dokumencie resourceId() zamiast concat() funkcji .

Uzyskiwanie tożsamości zarządzanej

Tożsamości zarządzane dla zasobów platformy Azure to typy zasobów rozszerzeń tworzone niejawnie dla niektórych zasobów. Ponieważ tożsamość zarządzana nie jest jawnie zdefiniowana w szablonie, należy odwoływać się do zasobu, do których jest stosowana tożsamość. Użyj Full , aby pobrać wszystkie właściwości, w tym niejawnie utworzoną tożsamość.

Wzorzec jest:

"[reference(resourceId(<resource-provider-namespace>, <resource-name>), <API-version>, 'Full').Identity.propertyName]"

Aby na przykład uzyskać identyfikator podmiotu zabezpieczeń tożsamości zarządzanej, który jest stosowany do maszyny wirtualnej, użyj:

"[reference(resourceId('Microsoft.Compute/virtualMachines', variables('vmName')),'2019-12-01', 'Full').identity.principalId]",

Aby uzyskać identyfikator dzierżawy tożsamości zarządzanej, która jest stosowana do zestawu skalowania maszyn wirtualnych, użyj:

"[reference(resourceId('Microsoft.Compute/virtualMachineScaleSets',  variables('vmNodeType0Name')), 2019-12-01, 'Full').Identity.tenantId]"

Przykład referencyjny

Poniższy przykład wdraża zasób i odwołuje się do tego zasobu.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "storageAccountName": {
      "type": "string"
    }
  },
  "resources": [
    {
      "type": "Microsoft.Storage/storageAccounts",
      "apiVersion": "2021-04-01",
      "name": "[parameters('storageAccountName')]",
      "location": "[resourceGroup().location]",
      "sku": {
        "name": "Standard_LRS"
      },
      "kind": "Storage",
      "tags": {},
      "properties": {
      }
    }
  ],
  "outputs": {
    "referenceOutput": {
      "type": "object",
      "value": "[reference(parameters('storageAccountName'))]"
    },
    "fullReferenceOutput": {
      "type": "object",
      "value": "[reference(parameters('storageAccountName'), '2021-04-01', 'Full')]"
    }
  }
}

Poprzedni przykład zwraca dwa obiekty. Obiekt właściwości ma następujący format:

{
   "creationTime": "2017-10-09T18:55:40.5863736Z",
   "primaryEndpoints": {
     "blob": "https://examplestorage.blob.core.windows.net/",
     "file": "https://examplestorage.file.core.windows.net/",
     "queue": "https://examplestorage.queue.core.windows.net/",
     "table": "https://examplestorage.table.core.windows.net/"
   },
   "primaryLocation": "southcentralus",
   "provisioningState": "Succeeded",
   "statusOfPrimary": "available",
   "supportsHttpsTrafficOnly": false
}

Pełny obiekt ma następujący format:

{
  "apiVersion":"2021-04-01",
  "location":"southcentralus",
  "sku": {
    "name":"Standard_LRS",
    "tier":"Standard"
  },
  "tags":{},
  "kind":"Storage",
  "properties": {
    "creationTime":"2017-10-09T18:55:40.5863736Z",
    "primaryEndpoints": {
      "blob":"https://examplestorage.blob.core.windows.net/",
      "file":"https://examplestorage.file.core.windows.net/",
      "queue":"https://examplestorage.queue.core.windows.net/",
      "table":"https://examplestorage.table.core.windows.net/"
    },
    "primaryLocation":"southcentralus",
    "provisioningState":"Succeeded",
    "statusOfPrimary":"available",
    "supportsHttpsTrafficOnly":false
  },
  "subscriptionId":"<subscription-id>",
  "resourceGroupName":"functionexamplegroup",
  "resourceId":"Microsoft.Storage/storageAccounts/examplestorage",
  "referenceApiVersion":"2021-04-01",
  "condition":true,
  "isConditionTrue":true,
  "isTemplateResource":false,
  "isAction":false,
  "provisioningOperation":"Read"
}

Poniższy przykładowy szablon odwołuje się do konta magazynu, które nie jest wdrożone w tym szablonie. Konto magazynu już istnieje w ramach tej samej subskrypcji.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "storageResourceGroup": {
      "type": "string"
    },
    "storageAccountName": {
      "type": "string"
    }
  },
  "resources": [],
  "outputs": {
    "ExistingStorage": {
      "type": "object",
      "value": "[reference(resourceId(parameters('storageResourceGroup'), 'Microsoft.Storage/storageAccounts', parameters('storageAccountName')), '2021-04-01')]"
    }
  }
}

resourceGroup

Zobacz funkcję zakresu resourceGroup.

resourceId

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

Zwraca unikatowy identyfikator zasobu. Tej funkcji należy używać, gdy nazwa zasobu jest niejednoznaczna lub nie jest aprowizowana w ramach tego samego szablonu. Format zwróconego identyfikatora różni się w zależności od tego, czy wdrożenie odbywa się w zakresie grupy zasobów, subskrypcji, grupy zarządzania, czy dzierżawy.

Parametry

Parametr Wymagane Typ Opis
subscriptionId Nie string (w formacie IDENTYFIKATORA GUID) Wartość domyślna to bieżąca subskrypcja. Określ tę wartość, gdy musisz pobrać zasób w innej subskrypcji. Tę wartość należy podać tylko podczas wdrażania w zakresie grupy zasobów lub subskrypcji.
resourceGroupName Nie ciąg Wartość domyślna to bieżąca grupa zasobów. Określ tę wartość, gdy musisz pobrać zasób w innej grupie zasobów. Tę wartość należy podać tylko podczas wdrażania w zakresie grupy zasobów.
resourceType Tak ciąg Typ zasobu, w tym przestrzeń nazw dostawcy zasobów.
resourceName1 Tak ciąg Nazwa zasobu.
resourceName2 Nie ciąg Następny segment nazwy zasobu, jeśli to konieczne.

Kontynuuj dodawanie nazw zasobów jako parametrów, gdy typ zasobu zawiera więcej segmentów.

Wartość zwracana

Po wdrożeniu szablonu w zakresie grupy zasobów identyfikator zasobu jest zwracany w następującym formacie:

/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProviderNamespace}/{resourceType}/{resourceName}

Funkcji resourceId można używać w przypadku innych zakresów wdrażania, ale format identyfikatora zmienia się.

Jeśli używasz identyfikatora resourceId podczas wdrażania w subskrypcji, identyfikator zasobu jest zwracany w następującym formacie:

/subscriptions/{subscriptionId}/providers/{resourceProviderNamespace}/{resourceType}/{resourceName}

Jeśli używasz identyfikatora resourceId podczas wdrażania w grupie zarządzania lub dzierżawie, identyfikator zasobu jest zwracany w następującym formacie:

/providers/{resourceProviderNamespace}/{resourceType}/{resourceName}

Aby uniknąć nieporozumień, nie zalecamy używania go podczas pracy z zasobami wdrożonymi w subskrypcji, grupie resourceId zarządzania lub dzierżawie. Zamiast tego należy użyć funkcji ID, która jest przeznaczona dla zakresu.

W przypadku zasobów na poziomie subskrypcjiużyj funkcji subscriptionResourceId.

W przypadku zasobów na poziomie grupy zarządzaniaużyj funkcji extensionResourceId, aby odwołać się do zasobu zaimplementowanego jako rozszerzenie grupy zarządzania. Na przykład niestandardowe definicje zasad wdrażane w grupie zarządzania są rozszerzeniami grupy zarządzania. Funkcja tenantResourceId umożliwia odwołanie się do zasobów wdrożonych w dzierżawie, ale dostępnych w grupie zarządzania. Na przykład wbudowane definicje zasad są implementowane jako zasoby na poziomie dzierżawy.

W przypadku zasobów na poziomie dzierżawyużyj funkcji tenantResourceId. Użyj wartości tenantResourceId dla wbudowanych definicji zasad, ponieważ są one implementowane na poziomie dzierżawy.

Uwagi

Liczba poszczególnych parametrów zależy od tego, czy zasób jest zasobem nadrzędnym, czy podrzędnym, oraz od tego, czy zasób należy do tej samej subskrypcji, czy grupy zasobów.

Aby uzyskać identyfikator zasobu nadrzędnego w tej samej subskrypcji i tej samej grupie zasobów, podaj typ i nazwę zasobu.

"[resourceId('Microsoft.ServiceBus/namespaces', 'namespace1')]"

Aby uzyskać identyfikator zasobu podrzędnego, zwróć uwagę na liczbę segmentów w typie zasobu. Podaj nazwę zasobu dla każdego segmentu typu zasobu. Nazwa segmentu odpowiada zasobowi, który istnieje dla tej części hierarchii.

"[resourceId('Microsoft.ServiceBus/namespaces/queues/authorizationRules', 'namespace1', 'queue1', 'auth1')]"

Aby uzyskać identyfikator zasobu w tej samej subskrypcji, ale w innej grupie zasobów, podaj nazwę grupy zasobów.

"[resourceId('otherResourceGroup', 'Microsoft.Storage/storageAccounts', 'examplestorage')]"

Aby uzyskać identyfikator zasobu w innej subskrypcji i grupie zasobów, podaj identyfikator subskrypcji i nazwę grupy zasobów.

"[resourceId('xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx', 'otherResourceGroup', 'Microsoft.Storage/storageAccounts','examplestorage')]"

Często należy używać tej funkcji podczas korzystania z konta magazynu lub sieci wirtualnej w alternatywnej grupie zasobów. W poniższym przykładzie pokazano, jak można łatwo używać zasobu z zewnętrznej grupy zasobów:

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "location": {
      "type": "string"
    },
    "virtualNetworkName": {
      "type": "string"
    },
    "virtualNetworkResourceGroup": {
      "type": "string"
    },
    "subnet1Name": {
      "type": "string"
    },
    "nicName": {
      "type": "string"
    }
  },
  "variables": {
    "subnet1Ref": "[resourceId(parameters('virtualNetworkResourceGroup'), 'Microsoft.Network/virtualNetworks/subnets', parameters('virtualNetworkName'), parameters('subnet1Name'))]"
  },
  "resources": [
    {
      "type": "Microsoft.Network/networkInterfaces",
      "apiVersion": "2021-02-01",
      "name": "[parameters('nicName')]",
      "location": "[parameters('location')]",
      "properties": {
        "ipConfigurations": [
          {
            "name": "ipconfig1",
            "properties": {
              "privateIPAllocationMethod": "Dynamic",
              "subnet": {
                "id": "[variables('subnet1Ref')]"
              }
            }
          }
        ]
      }
    }
  ]
}

Przykład identyfikatora zasobu

Poniższy przykład zwraca identyfikator zasobu dla konta magazynu w grupie zasobów:

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "resources": [],
  "outputs": {
    "sameRGOutput": {
      "type": "string",
      "value": "[resourceId('Microsoft.Storage/storageAccounts','examplestorage')]"
    },
    "differentRGOutput": {
      "type": "string",
      "value": "[resourceId('otherResourceGroup', 'Microsoft.Storage/storageAccounts','examplestorage')]"
    },
    "differentSubOutput": {
      "type": "string",
      "value": "[resourceId('11111111-1111-1111-1111-111111111111', 'otherResourceGroup', 'Microsoft.Storage/storageAccounts','examplestorage')]"
    },
    "nestedResourceOutput": {
      "type": "string",
      "value": "[resourceId('Microsoft.SQL/servers/databases', 'serverName', 'databaseName')]"
    }
  }
}

Dane wyjściowe z poprzedniego przykładu z wartościami domyślnymi to:

Nazwa Typ Wartość
sameRGOutput Ciąg /subscriptions/{current-sub-id}/resourceGroups/examplegroup/providers/Microsoft. Storage/storageAccounts/examplestorage
differentRGOutput Ciąg /subscriptions/{current-sub-id}/resourceGroups/otherResourceGroup/providers/Microsoft. Storage/storageAccounts/examplestorage
differentSubOutput Ciąg /subscriptions/11111111-1111-1111-1111-1111111111/resourceGroups/otherResourceGroup/providers/Microsoft. Storage/storageAccounts/examplestorage
nestedResourceOutput Ciąg /subscriptions/{current-sub-id}/resourceGroups/examplegroup/providers/Microsoft. SQL/servers/serverName/databases/databaseName

subskrypcja

Zobacz funkcję zakresu subskrypcji.

subscriptionResourceId

subscriptionResourceId([subscriptionId], resourceType, resourceName1, [resourceName2], ...)

Zwraca unikatowy identyfikator zasobu wdrożonego na poziomie subskrypcji.

Parametry

Parametr Wymagane Typ Opis
subscriptionId Nie string (w formacie identyfikatora GUID) Wartość domyślna to bieżąca subskrypcja. Określ tę wartość, jeśli musisz pobrać zasób w innej subskrypcji.
resourceType Tak ciąg Typ zasobu, w tym przestrzeń nazw dostawcy zasobów.
resourceName1 Tak ciąg Nazwa zasobu.
resourceName2 Nie ciąg Następny segment nazwy zasobu, jeśli to konieczne.

Kontynuuj dodawanie nazw zasobów jako parametrów, gdy typ zasobu zawiera więcej segmentów.

Wartość zwracana

Identyfikator jest zwracany w następującym formacie:

/subscriptions/{subscriptionId}/providers/{resourceProviderNamespace}/{resourceType}/{resourceName}

Uwagi

Ta funkcja umożliwia uzyskiwanie identyfikatora zasobu dla zasobów wdrożonych w subskrypcji, a nie w grupie zasobów. Zwrócony identyfikator różni się od wartości zwracanej przez funkcję resourceId, nie uwzględniając wartości grupy zasobów.

subscriptionResourceID , przykład

Poniższy szablon przypisuje wbudowaną rolę. Można go wdrożyć w grupie zasobów lub subskrypcji. Używa funkcji subscriptionResourceId , aby uzyskać identyfikator zasobu dla ról wbudowanych.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "principalId": {
      "type": "string",
      "metadata": {
        "description": "The principal to assign the role to"
      }
    },
    "builtInRoleType": {
      "type": "string",
      "allowedValues": [
        "Owner",
        "Contributor",
        "Reader"
      ],
      "metadata": {
        "description": "Built-in role to assign"
      }
    },
    "roleNameGuid": {
      "type": "string",
      "defaultValue": "[newGuid()]",
      "metadata": {
        "description": "A new GUID used to identify the role assignment"
      }
    }
  },
  "variables": {
    "Owner": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', '8e3af657-a8ff-443c-a75c-2fe8c4bcb635')]",
    "Contributor": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'b24988ac-6180-42a0-ab88-20f7382dd24c')]",
    "Reader": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'acdd72a7-3385-48ef-bd42-f606fba81ae7')]"
  },
  "resources": [
    {
      "type": "Microsoft.Authorization/roleAssignments",
      "apiVersion": "2020-10-01-preview",
      "name": "[parameters('roleNameGuid')]",
      "properties": {
        "roleDefinitionId": "[variables(parameters('builtInRoleType'))]",
        "principalId": "[parameters('principalId')]"
      }
    }
  ]
}

tenantResourceId

tenantResourceId(resourceType, resourceName1, [resourceName2], ...)

Zwraca unikatowy identyfikator zasobu wdrożonego na poziomie dzierżawy.

Parametry

Parametr Wymagane Typ Opis
resourceType Tak ciąg Typ zasobu, w tym przestrzeń nazw dostawcy zasobów.
resourceName1 Tak ciąg Nazwa zasobu.
resourceName2 Nie ciąg Następny segment nazwy zasobu, jeśli to konieczne.

Kontynuuj dodawanie nazw zasobów jako parametrów, gdy typ zasobu zawiera więcej segmentów.

Wartość zwracana

Identyfikator jest zwracany w następującym formacie:

/providers/{resourceProviderNamespace}/{resourceType}/{resourceName}

Uwagi

Ta funkcja umożliwia uzyskiwanie identyfikatora zasobu wdrożonego w dzierżawie. Zwrócony identyfikator różni się od wartości zwracanych przez inne funkcje identyfikatora zasobu, nie uwzględniając wartości grupy zasobów ani subskrypcji.

przykład tenantResourceId

Wbudowane definicje zasad to zasoby na poziomie dzierżawy. Aby wdrożyć przypisanie zasad, które odwołuje się do wbudowanej definicji zasad, użyj tenantResourceId funkcji .

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "policyDefinitionID": {
      "type": "string",
      "defaultValue": "0a914e76-4921-4c19-b460-a2d36003525a",
      "metadata": {
        "description": "Specifies the ID of the policy definition or policy set definition being assigned."
      }
    },
    "policyAssignmentName": {
      "type": "string",
      "defaultValue": "[guid(parameters('policyDefinitionID'), resourceGroup().name)]",
      "metadata": {
        "description": "Specifies the name of the policy assignment, can be used defined or an idempotent name as the defaultValue provides."
      }
    }
  },
  "resources": [
    {
      "type": "Microsoft.Authorization/policyAssignments",
      "name": "[parameters('policyAssignmentName')]",
      "apiVersion": "2020-09-01",
      "properties": {
        "scope": "[subscriptionResourceId('Microsoft.Resources/resourceGroups', resourceGroup().name)]",
        "policyDefinitionId": "[tenantResourceId('Microsoft.Authorization/policyDefinitions', parameters('policyDefinitionID'))]"
      }
    }
  ]
}

Następne kroki