Wdrożenia subskrypcji z plikami Bicep

Aby uprościć zarządzanie zasobami, możesz wdrażać zasoby na poziomie subskrypcji platformy Azure. Możesz na przykład wdrożyć zasady i kontrolę dostępu opartą na rolach platformy Azure (RBAC) do subskrypcji, która będzie stosowana w ramach subskrypcji.

W tym artykule opisano sposób ustawiania zakresu wdrożenia na subskrypcję w pliku Bicep.

Uwaga

W ramach wdrożenia na poziomie subskrypcji można wdrożyć 800 różnych grup zasobów.

Zasoby szkoleniowe

Jeśli wolisz dowiedzieć się więcej o zakresach wdrażania za pomocą szczegółowych wskazówek, zobacz Wdrażanie zasobów w subskrypcjach, grupach zarządzania i dzierżawach przy użyciu usługi Bicep.

Obsługiwane zasoby

Nie wszystkie typy zasobów można wdrożyć na poziomie subskrypcji. Ta sekcja zawiera listę obsługiwanych typów zasobów.

W przypadku usługi Azure Blueprints użyj:

W przypadku zasad platformy Azure użyj:

W przypadku kontroli dostępu użyj:

W przypadku szablonów zagnieżdżonych wdrażanych w grupach zasobów użyj:

Do tworzenia nowych grup zasobów użyj:

Do zarządzania subskrypcją użyj:

Do monitorowania użyj:

W przypadku zabezpieczeń użyj:

Inne obsługiwane typy to:

Ustawianie zakresu

Aby ustawić zakres na subskrypcję, użyj:

targetScope = 'subscription'

Polecenia wdrażania

Aby przeprowadzić wdrożenie w ramach subskrypcji, użyj poleceń wdrażania na poziomie subskrypcji.

W przypadku interfejsu wiersza polecenia platformy Azure użyj polecenia az deployment sub create. Poniższy przykład umożliwia wdrożenie szablonu w celu utworzenia grupy zasobów:

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

Aby uzyskać bardziej szczegółowe informacje o poleceniach wdrażania i opcjach wdrażania szablonów usługi ARM, zobacz:

Lokalizacja i nazwa wdrożenia

W przypadku wdrożeń na poziomie subskrypcji należy podać lokalizację wdrożenia. Lokalizacja wdrożenia jest oddzielona od lokalizacji wdrażanych zasobów. Lokalizacja wdrożenia określa miejsce przechowywania danych wdrożenia. Wdrożenia grupy zarządzania i dzierżawy również wymagają lokalizacji. W przypadku wdrożeń grup zasobów lokalizacja grupy zasobów jest używana do przechowywania danych wdrożenia.

Możesz podać nazwę wdrożenia lub użyć domyślnej nazwy wdrożenia. Domyślna nazwa to nazwa pliku szablonu. Na przykład wdrożenie szablonu o nazwie main.json powoduje utworzenie domyślnej nazwy wdrożenia main.

Dla każdej nazwy wdrożenia lokalizacja jest niezmienna. Nie można utworzyć wdrożenia w jednej lokalizacji, jeśli istnieje istniejące wdrożenie o tej samej nazwie w innej lokalizacji. Jeśli na przykład utworzysz wdrożenie subskrypcji o nazwie deployment1 w lokalizacji centralus, nie będzie można później utworzyć innego wdrożenia o nazwie deployment1 , ale lokalizacji westus. Jeśli zostanie wyświetlony kod InvalidDeploymentLocationbłędu , użyj innej nazwy lub tej samej lokalizacji co poprzednie wdrożenie dla tej nazwy.

Zakresy wdrażania

Podczas wdrażania w ramach subskrypcji można wdrożyć zasoby w:

  • subskrypcja docelowa z operacji
  • dowolna subskrypcja w dzierżawie
  • grupy zasobów w ramach subskrypcji lub innych subskrypcji
  • dzierżawa subskrypcji

Zasób rozszerzenia może być zakresem obiektu docelowego, który różni się od docelowego wdrożenia.

Użytkownik wdrażający szablon musi mieć dostęp do określonego zakresu.

Zakres subskrypcji

Aby wdrożyć zasoby w subskrypcji docelowej, dodaj te zasoby za pomocą słowa kluczowego resource .

targetScope = 'subscription'

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

Przykłady wdrażania w subskrypcji można znaleźć w temacie Create resource groups with Bicep and Assign policy definition (Tworzenie grup zasobów przy użyciu Bicep i Przypisywanie definicji zasad).

Aby wdrożyć zasoby w subskrypcji innej niż subskrypcja z operacji, dodaj moduł. Użyj funkcji subskrypcji , aby ustawić scope właściwość. subscriptionId Podaj właściwość identyfikatora subskrypcji, do której chcesz wdrożyć.

targetScope = 'subscription'

param otherSubscriptionID string

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

Zakres do grupy zasobów

Aby wdrożyć zasoby w grupie zasobów w ramach subskrypcji, dodaj moduł i ustaw jej scope właściwość. Jeśli grupa zasobów już istnieje, użyj funkcji resourceGroup , aby ustawić wartość zakresu. Podaj nazwę grupy zasobów.

targetScope = 'subscription'

param resourceGroupName string

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

Jeśli grupa zasobów zostanie utworzona w tym samym pliku Bicep, użyj symbolicznej nazwy grupy zasobów, aby ustawić wartość zakresu. Aby zapoznać się z przykładem ustawienia zakresu na nazwę symboliczną, zobacz Create resource group with Bicep (Tworzenie grupy zasobów przy użyciu elementu Bicep).

Zakres do dzierżawy

Aby utworzyć zasoby w dzierżawie, dodaj moduł. Użyj funkcji dzierżawy , aby ustawić jej scope właściwość.

Użytkownik wdrażający szablon musi mieć wymagany dostęp do wdrożenia w dzierżawie.

Poniższy przykład obejmuje moduł wdrożony w dzierżawie.

targetScope = 'subscription'

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

Zamiast korzystać z modułu, można ustawić zakres dla tenant() niektórych typów zasobów. Poniższy przykład wdraża grupę zarządzania w dzierżawie.

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

Aby uzyskać więcej informacji, zobacz Grupa zarządzania.

Grupy zasobów

Aby uzyskać informacje na temat tworzenia grup zasobów, zobacz Create resource group with Bicep (Tworzenie grupy zasobów przy użyciu elementu Bicep).

Azure Policy

Przypisywanie definicji zasad

Poniższy przykład przypisuje istniejącą definicję zasad do subskrypcji. Jeśli definicja zasad przyjmuje parametry, podaj je jako obiekt. Jeśli definicja zasad nie bierze parametrów, użyj domyślnego pustego obiektu.

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
  }
}

Tworzenie i przypisywanie definicji zasad

Definicję zasad można zdefiniować i przypisać w tym samym pliku Bicep.

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
  }
}

Kontrola dostępu

Aby dowiedzieć się więcej na temat przypisywania ról, zobacz Dodawanie przypisań ról platformy Azure przy użyciu szablonów usługi Azure Resource Manager.

Poniższy przykład tworzy grupę zasobów, stosuje do niej blokadę i przypisuje rolę do podmiotu zabezpieczeń.

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
  }
}

W poniższym przykładzie pokazano moduł do zastosowania blokady:

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

W następnym przykładzie pokazano moduł do przypisania roli:

@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
  }
}

Następne kroki

Aby dowiedzieć się więcej o innych zakresach, zobacz: