Prenumerationsdistributioner med Bicep-filer

För att förenkla hanteringen av resurser kan du distribuera resurser på azure-prenumerationsnivå. Du kan till exempel distribuera principer och rollbaserad åtkomstkontroll i Azure (Azure RBAC) till din prenumeration, vilket tillämpar dem i hela prenumerationen.

Den här artikeln beskriver hur du ställer in distributionsomfånget på en prenumeration i en Bicep-fil.

Anteckning

Du kan distribuera till 800 olika resursgrupper i en distribution på prenumerationsnivå.

Träningsresurser

Om du hellre vill lära dig mer om distributionsomfång via stegvis vägledning kan du läsa Distribuera resurser till prenumerationer, hanteringsgrupper och klientorganisationer med hjälp av Bicep.

Resurser som stöds

Alla resurstyper kan inte distribueras till prenumerationsnivå. I det här avsnittet visas vilka resurstyper som stöds.

För Azure Blueprints använder du:

För Azure-principer använder du:

För åtkomstkontroll använder du:

För kapslade mallar som distribueras till resursgrupper använder du:

Om du vill skapa nya resursgrupper använder du:

För att hantera din prenumeration använder du:

För övervakning använder du:

För säkerhet använder du:

Andra typer som stöds är:

Ange omfång

Om du vill ange omfånget till prenumeration använder du:

targetScope = 'subscription'

Distributionskommandon

Om du vill distribuera till en prenumeration använder du distributionskommandona på prenumerationsnivå.

För Azure CLI använder du az deployment sub create. I följande exempel distribueras en mall för att skapa en resursgrupp:

az deployment sub create \
  --name demoSubDeployment \
  --location centralus \
  --template-file main.bicep \
  --parameters rgName=demoResourceGroup rgLocation=centralus

Mer detaljerad information om distributionskommandon och alternativ för distribution av ARM-mallar finns i:

Distributionsplats och namn

För distributioner på prenumerationsnivå måste du ange en plats för distributionen. Platsen för distributionen är separat från platsen för de resurser som du distribuerar. Distributionsplatsen anger var distributionsdata ska lagras. Hanteringsgrupps- och klientdistributioner kräver också en plats. För resursgruppsdistributioner används platsen för resursgruppen för att lagra distributionsdata.

Du kan ange ett namn för distributionen eller använda standarddistributionsnamnet. Standardnamnet är namnet på mallfilen. Om du till exempel distribuerar en mall med namnet main.json skapas ett standarddistributionsnamn för main.

För varje distributionsnamn är platsen oföränderlig. Du kan inte skapa en distribution på en plats när det finns en befintlig distribution med samma namn på en annan plats. Om du till exempel skapar en prenumerationsdistribution med namnet deployment1 i centralus kan du inte senare skapa en annan distribution med namnet deployment1 utan en plats i westus. Om du får felkoden InvalidDeploymentLocationanvänder du antingen ett annat namn eller samma plats som den tidigare distributionen för det namnet.

Distributionsomfång

När du distribuerar till en prenumeration kan du distribuera resurser till:

  • målprenumerationen från åtgärden
  • valfri prenumeration i klientorganisationen
  • resursgrupper i prenumerationen eller andra prenumerationer
  • klientorganisationen för prenumerationen

En tilläggsresurs kan begränsas till ett annat mål än distributionsmålet.

Användaren som distribuerar mallen måste ha åtkomst till det angivna omfånget.

Omfång för prenumeration

Om du vill distribuera resurser till målprenumerationen lägger du till resurserna med nyckelordet resource .

targetScope = 'subscription'

// resource group created in target subscription
resource exampleResource 'Microsoft.Resources/resourceGroups@2022-09-01' = {
  ...
}

Exempel på distribution till prenumerationen finns i Skapa resursgrupper med Bicep och Tilldela principdefinition.

Om du vill distribuera resurser till en prenumeration som skiljer sig från prenumerationen från åtgärden lägger du till en modul. Använd prenumerationsfunktionen för att ange scope egenskapen . subscriptionId Ange egenskapen till ID:t för den prenumeration som du vill distribuera till.

targetScope = 'subscription'

param otherSubscriptionID string

// module deployed at subscription level but in a different subscription
module exampleModule 'module.bicep' = {
  name: 'deployToDifferentSub'
  scope: subscription(otherSubscriptionID)
}

Omfång för resursgrupp

Om du vill distribuera resurser till en resursgrupp i prenumerationen lägger du till en modul och anger dess scope egenskap. Om resursgruppen redan finns använder du funktionen resourceGroup för att ange omfångsvärdet. Ange resursgruppens namn.

targetScope = 'subscription'

param resourceGroupName string

module exampleModule 'module.bicep' = {
  name: 'exampleModule'
  scope: resourceGroup(resourceGroupName)
}

Om resursgruppen skapas i samma Bicep-fil använder du det symboliska namnet på resursgruppen för att ange omfångsvärdet. Ett exempel på hur du ställer in omfånget på det symboliska namnet finns i Skapa resursgrupp med Bicep.

Omfång för klientorganisation

Om du vill skapa resurser i klientorganisationen lägger du till en modul. Använd klientfunktionen för att ange dess scope egenskap.

Användaren som distribuerar mallen måste ha den åtkomst som krävs för att distribuera i klientorganisationen.

I följande exempel ingår en modul som distribueras till klientorganisationen.

targetScope = 'subscription'

// module deployed at tenant level
module exampleModule 'module.bicep' = {
  name: 'deployToTenant'
  scope: tenant()
}

I stället för att använda en modul kan du ange omfånget till tenant() för vissa resurstyper. I följande exempel distribueras en hanteringsgrupp i klientorganisationen.

targetScope = 'subscription'

param mgName string = 'mg-${uniqueString(newGuid())}'

// management group created at tenant
resource managementGroup 'Microsoft.Management/managementGroups@2021-04-01' = {
  scope: tenant()
  name: mgName
  properties: {}
}

output output string = mgName

Mer information finns i Hanteringsgrupp.

Resursgrupper

Information om hur du skapar resursgrupper finns i Skapa resursgrupp med Bicep.

Azure Policy

Tilldela principdefinition

I följande exempel tilldelas en befintlig principdefinition till prenumerationen. Om principdefinitionen tar parametrar anger du dem som ett -objekt. Om principdefinitionen inte tar parametrar använder du det tomma standardobjektet.

targetScope = 'subscription'

param policyDefinitionID string
param policyName string
param policyParameters object = {}

resource policyAssign 'Microsoft.Authorization/policyAssignments@2022-06-01' = {
  name: policyName
  properties: {
    policyDefinitionId: policyDefinitionID
    parameters: policyParameters
  }
}

Skapa och tilldela principdefinitioner

Du kan definiera och tilldela en principdefinition i samma Bicep-fil.

targetScope = 'subscription'

resource locationPolicy 'Microsoft.Authorization/policyDefinitions@2021-06-01' = {
  name: 'locationpolicy'
  properties: {
    policyType: 'Custom'
    parameters: {}
    policyRule: {
      if: {
        field: 'location'
        equals: 'northeurope'
      }
      then: {
        effect: 'deny'
      }
    }
  }
}

resource locationRestrict 'Microsoft.Authorization/policyAssignments@2022-06-01' = {
  name: 'allowedLocation'
  properties: {
    policyDefinitionId: locationPolicy.id
  }
}

Åtkomstkontroll

Mer information om hur du tilldelar roller finns i Lägga till Azure-rolltilldelningar med hjälp av Azure Resource Manager-mallar.

I följande exempel skapas en resursgrupp, ett lås tillämpas på den och en roll tilldelas till ett huvudkonto.

targetScope = 'subscription'

@description('Name of the resourceGroup to create')
param resourceGroupName string

@description('Location for the resourceGroup')
param resourceGroupLocation string

@description('principalId of the user that will be given contributor access to the resourceGroup')
param principalId string

@description('roleDefinition to apply to the resourceGroup - default is contributor')
param roleDefinitionId string = 'b24988ac-6180-42a0-ab88-20f7382dd24c'

@description('Unique name for the roleAssignment in the format of a guid')
param roleAssignmentName string = guid(principalId, roleDefinitionId, resourceGroupName)

var roleID = '/subscriptions/${subscription().subscriptionId}/providers/Microsoft.Authorization/roleDefinitions/${roleDefinitionId}'

resource newResourceGroup 'Microsoft.Resources/resourceGroups@2022-09-01' = {
  name: resourceGroupName
  location: resourceGroupLocation
  properties: {}
}

module applyLock 'lock.bicep' = {
  name: 'applyLock'
  scope: newResourceGroup
}

module assignRole 'role.bicep' = {
  name: 'assignRBACRole'
  scope: newResourceGroup
  params: {
    principalId: principalId
    roleNameGuid: roleAssignmentName
    roleDefinitionId: roleID
  }
}

I följande exempel visas modulen för att tillämpa låset:

resource createRgLock 'Microsoft.Authorization/locks@2020-05-01' = {
  name: 'rgLock'
  properties: {
    level: 'CanNotDelete'
    notes: 'Resource group should not be deleted.'
  }
}

I nästa exempel visas modulen för att tilldela rollen:

@description('The principal to assign the role to')
param principalId string

@description('A GUID used to identify the role assignment')
param roleNameGuid string = newGuid()

param roleDefinitionId string

resource roleNameGuid_resource 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
  name: roleNameGuid
  properties: {
    roleDefinitionId: roleDefinitionId
    principalId: principalId
  }
}

Nästa steg

Mer information om andra omfång finns i: