Bicep 파일을 사용하여 관리 그룹 배포

이 문서에서는 관리 그룹에 배포할 때 Bicep을 사용하여 범위를 설정하는 방법을 설명합니다.

조직이 성장하면 Bicep 파일을 배포하여 관리 그룹 수준에서 리소스를 만들 수 있습니다. 예를 들어 관리 그룹에 대한 정책을 정의하고 할당하거나 Azure RBAC(역할 기반 액세스 제어)를 할당해야 할 수 있습니다. 관리 그룹 수준 템플릿을 사용하면 선언적으로 정책을 적용하고 관리 그룹 수준에서 역할을 할당할 수 있습니다.

학습 리소스

단계별 지침을 통해 배포 범위에 대해 알아보려면 Bicep을 사용하여 구독, 관리 그룹 및 테넌트에 리소스 배포를 참조하세요.

지원되는 리소스

모든 리소스 종류를 관리 그룹 수준에 배포할 수 있는 것은 아닙니다. 이 섹션에서는 지원되는 리소스 종류를 나열합니다.

Azure Blueprints의 경우 다음을 사용합니다.

Azure Policy의 경우 다음을 사용합니다.

액세스 제어를 위해 다음을 사용합니다.

구독 또는 리소스 그룹에 배포하는 중첩된 템플릿의 경우 다음을 사용합니다.

리소스를 관리하려면 다음을 사용합니다.

관리 그룹은 테넌트 수준 리소스입니다. 그러나 새 관리 그룹의 범위를 테넌트로 설정하여 관리 그룹 배포에서 관리 그룹을 만들 수 있습니다. 관리 그룹을 참조하세요.

집합 범위

범위를 관리 그룹으로 설정하려면 다음을 사용합니다.

targetScope = 'managementGroup'

배포 명령

관리 그룹에 배포하려면 관리 그룹 배포 명령을 사용합니다.

Azure CLI의 경우 az deployment mg create를 사용합니다.

az deployment mg create \
  --name demoMGDeployment \
  --location WestUS \
  --management-group-id myMG \
  --template-uri "https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/management-level-deployment/azuredeploy.json"

ARM 템플릿 배포를 위한 배포 명령 및 옵션에 대한 자세한 내용은 다음을 참조하세요.

배포 위치 및 이름

관리 그룹 수준 배포의 경우 배포할 위치를 제공해야 합니다. 배포 위치는 배포하는 리소스의 위치와는 별개입니다. 배포 위치는 배포 데이터를 저장할 위치를 지정합니다. 구독테넌트 배포에도 위치가 필요합니다. 리소스 그룹 배포의 경우 배포 데이터를 저장하는 데 리소스 그룹의 위치가 사용됩니다.

배포 이름을 제공하거나 기본 배포 이름을 사용할 수 있습니다. 기본 이름은 템플릿 파일의 이름입니다. 예를 들어 main.bicep이라는 템플릿을 배포하면 main이라는 기본 배포 이름이 만들어집니다.

각 배포 이름의 경우 위치는 변경할 수 없습니다. 다른 위치의 이름이 동일한 기존 배포가 있는 경우 하나의 위치에서 배포를 만들 수 없습니다. 예를 들어 centralus에서 이름이 deployment1인 관리 그룹 배포를 만드는 경우 나중에 이름은 deployment1이지만 위치는 westus인 다른 배포를 만들 수 없습니다. 오류 코드 InvalidDeploymentLocation을 수신하게 되면 해당 이름의 이전 배포와 다른 이름이나 동일한 위치를 사용합니다.

배포 범위

관리 그룹에 배포하는 경우 다음에 리소스를 배포할 수 있습니다.

  • 작업의 대상 관리 그룹
  • 테넌트의 다른 관리 그룹
  • 관리 그룹의 구독
  • 관리 그룹의 리소스 그룹
  • 리소스 그룹에 대한 테넌트

확장 리소스의 범위를 배포 대상과 다른 대상으로 지정할 수 있습니다.

템플릿을 배포하는 사용자가 지정된 범위에 액세스할 수 있어야 합니다.

관리 그룹에 대한 범위

대상 관리 그룹에 리소스를 배포하려면 resource 키워드를 사용하여 해당 리소스를 추가합니다.

targetScope = 'managementGroup'

// policy definition created in the management group
resource policyDefinition 'Microsoft.Authorization/policyDefinitions@2021-06-01' = {
  ...
}

다른 관리 그룹을 대상으로 하려면 모듈을 추가합니다. managementGroup 함수를 사용하여 scope 속성을 설정합니다. 관리 그룹 이름을 입력합니다.

targetScope = 'managementGroup'

param otherManagementGroupName string

// module deployed at management group level but in a different management group
module exampleModule 'module.bicep' = {
  name: 'deployToDifferentMG'
  scope: managementGroup(otherManagementGroupName)
}

구독으로 범위 지정

관리 그룹 내에서 구독을 대상으로 지정할 수도 있습니다. 템플릿을 배포하는 사용자가 지정된 범위에 액세스할 수 있어야 합니다.

관리 그룹 내의 구독을 대상으로 하려면 모듈을 추가합니다. subscription 함수를 사용하여 scope 속성을 설정합니다. 구독 ID를 입력합니다.

targetScope = 'managementGroup'

param subscriptionID string

// module deployed to subscription in the management group
module exampleModule 'module.bicep' = {
  name: 'deployToSub'
  scope: subscription(subscriptionID)
}

리소스 그룹에 대한 범위

관리 그룹 내에서 리소스 그룹을 대상으로 지정할 수도 있습니다. 템플릿을 배포하는 사용자가 지정된 범위에 액세스할 수 있어야 합니다.

관리 그룹 내에서 리소스 그룹을 대상으로 하려면 모듈을 추가합니다. resourceGroup 함수를 사용하여 scope 속성을 설정합니다. 구독 ID 및 리소스 그룹 이름을 입력합니다.

targetScope = 'managementGroup'

param subscriptionID string
param resourceGroupName string

// module deployed to resource group in the management group
module exampleModule 'module.bicep' = {
  name: 'deployToRG'
  scope: resourceGroup(subscriptionID, resourceGroupName)
}

테넌트로 범위 지정

테넌트에서 리소스를 만들려면 모듈을 추가합니다. tenant 함수를 사용하여 scope 속성을 설정합니다. 템플릿을 배포하는 사용자에게는 테넌트에서 배포하는 데 필요한 액세스 권한이 있어야 합니다.

targetScope = 'managementGroup'

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

또는 관리 그룹과 같은 일부 리소스 종류에 대해 범위를 /로 설정할 수 있습니다. 새 관리 그룹을 만드는 방법에 대해서는 다음 섹션에서 설명합니다.

관리 그룹

관리 그룹 배포에서 관리 그룹을 만들려면 범위를 테넌트로 설정해야 합니다.

다음 예에서는 루트 관리 그룹에 새 관리 그룹을 만듭니다.

targetScope = 'managementGroup'

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

resource newMG 'Microsoft.Management/managementGroups@2021-04-01' = {
  scope: tenant()
  name: mgName
  properties: {}
}

output newManagementGroup string = mgName

다음 예에서는 배포 대상 관리 그룹에 새 관리 그룹을 만듭니다. 관리 그룹 기능을 사용합니다.

targetScope = 'managementGroup'

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

resource newMG 'Microsoft.Management/managementGroups@2021-04-01' = {
  scope: tenant()
  name: mgName
  properties: {
    details: {
      parent: {
        id: managementGroup().id
      }
    }
  }
}

output newManagementGroup string = mgName

Abunələr

ARM 템플릿을 사용하여 관리 그룹에서 새 Azure 구독을 만들려면 다음을 참조하세요.

기존 Azure 구독을 새 관리 그룹으로 이동하는 템플릿을 배포하려면 ARM 템플릿에서 구독 이동을 참조하세요.

Azure Policy

관리 그룹에 배포되는 사용자 지정 정책 정의는 관리 그룹의 확장입니다. 사용자 지정 정책 정의의 ID를 가져오려면 Extensionresourceid() 함수를 사용합니다. 기본 제공 정책 정의는 테넌트 수준 리소스입니다. 기본 제공 정책 정의의 ID를 가져오려면 Tenantresourceid() 함수를 사용합니다.

다음 예에서는 관리 그룹 수준에서 정책을 정의하고 할당하는 방법을 보여 줍니다.

targetScope = 'managementGroup'

@description('An array of the allowed locations, all other locations will be denied by the created policy.')
param allowedLocations array = [
  'australiaeast'
  'australiasoutheast'
  'australiacentral'
]

resource policyDefinition 'Microsoft.Authorization/policyDefinitions@2021-06-01' = {
  name: 'locationRestriction'
  properties: {
    policyType: 'Custom'
    mode: 'All'
    parameters: {}
    policyRule: {
      if: {
        not: {
          field: 'location'
          in: allowedLocations
        }
      }
      then: {
        effect: 'deny'
      }
    }
  }
}

resource policyAssignment 'Microsoft.Authorization/policyAssignments@2022-06-01' = {
  name: 'locationAssignment'
  properties: {
    policyDefinitionId: policyDefinition.id
  }
}

다음 단계

다른 범위에 대한 자세한 내용은 다음을 참조하세요.