Udostępnij za pośrednictwem


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

Aby utworzyć nowe grupy 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 wdrożyć w 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 głównego.

Dla każdej nazwy wdrożenia lokalizacja jest niezmienna. Nie można utworzyć wdrożenia w jednej lokalizacji, gdy istnieje wdrożenie o tej samej nazwie w innej lokalizacji. Jeśli na przykład utworzysz wdrożenie subskrypcji o nazwie deployment1 w centralus, nie można później utworzyć innego wdrożenia z nazwą deployment1, ale lokalizacją 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ć o określonym zakresie dla miejsca 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' = {
  ...
}

Aby zapoznać się z przykładami wdrażania w subskrypcji, zobacz Tworzenie grup zasobów za pomocą Bicep i Przypisywanie definicji zasad.

Aby wdrożyć zasoby w subskrypcji innej niż subskrypcja z operacji, dodaj moduł. Użyj funkcji subscription, 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 jego 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 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 używać modułu, można ustawić zakres na tenant() dla niektórych typów zasobów. Poniższy przykład umożliwia wdrożenie grupy 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 za pomocą 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ł umożliwiający przypisanie 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: