여러 범위에 리소스 배포
경우에 따라 하나의 배포 내에서 계층 구조의 여러 수준에 걸쳐 리소스를 배포해야 합니다. 이 작업을 수행할 수 있는 몇 가지 상황은 다음과 같습니다.
- 두 개의 서로 다른 리소스 그룹에 리소스를 배포해야 합니다. 예를 들어 공유 리소스 그룹에 네트워크 보안 그룹을 만들고 애플리케이션의 리소스 그룹에 가상 머신에 대한 네트워크 인터페이스를 배포할 수도 있습니다.
- 템플릿을 사용하여 구독 범위 리소스인 리소스 그룹을 만든 다음, 리소스 그룹 범위 배포를 사용하여 스토리지 계정 및 기타 Azure 리소스를 해당 리소스 그룹에 배포하려고 합니다.
- 관리 그룹 계층 구조를 배포하고 있으며 테넌트 범위 리소스인 일부 구독도 배포하려고 합니다.
Bicep을 사용하면 scope
키워드를 사용하여 다양한 범위에서 작동하는 배포를 만들 수 있습니다.
참고
이 단원의 명령은 개념을 설명하기 위해 표시된 것입니다. 명령을 아직 실행하지 마세요. 여기에서 학습하는 내용을 곧 연습할 예정입니다.
모듈 범위 지정
Bicep 모듈을 사용하여 파일에 지정된 targetScope
와 다른 범위에서 리소스 세트를 배포할 수 있습니다. 다음은 subscription
의 targetScope
로 배포되지만 모듈을 사용하여 리소스 그룹에 일부 리소스를 배포하는 예제 Bicep 파일입니다.
targetScope = 'subscription'
module networkModule 'modules/network.bicep' = {
scope: resourceGroup('ToyNetworking')
name: 'networkModule'
}
scope
속성은 Bicep 함수를 사용하여 대상으로 지정할 범위를 식별합니다. 앞의 예제에서는 resourceGroup()
함수를 사용하고 대상으로 지정할 리소스 그룹의 이름을 지정합니다. subscription()
, managementGroup()
및 tenant()
함수를 사용할 수도 있습니다. Bicep 파일에 targetScope
키워드를 사용하고 모듈에 scope
키워드를 사용하면 배포에 다양한 범위 조합을 만들 수 있습니다.
참고
한 가지 예외는 targetScope
가 resourceGroup
또는 subscription
인 Bicep 파일은 scope
가 managementGroup
인 모듈을 포함할 수 없다는 것입니다.
팁
구독 범위 Bicep 파일을 사용하여 리소스 그룹을 만드는 경우 리소스 그룹의 기호 이름을 모듈의 scope
로 사용할 수 있습니다. 다음 연습에서 이 작업을 수행하는 방법을 확인할 수 있습니다.
여러 리소스 그룹에 배포
범위의 일반적인 용도는 여러 리소스 그룹에 리소스를 배포하는 것입니다. 대부분의 Azure 리소스에서 scope
속성을 설정할 수 없지만 모듈을 사용하여 리소스 세트를 다른 리소스 그룹에 배포해야 함을 Bicep에 알릴 수 있습니다.
예를 들어 가상 네트워크 및 리소스를 ToyNetworking이라는 공유 리소스 그룹에 배포하는 단일 Bicep 파일 세트를 만든 다음, 다른 리소스 그룹에 네트워크 인터페이스를 배포할 수 있습니다. Bicep 파일은 다음과 같습니다.
module networkModule 'modules/network.bicep' = {
scope: resourceGroup('ToyNetworking')
name: 'networkModule'
}
resource networkInterface 'Microsoft.Network/networkInterfaces@2024-01-01' = {
name: 'production-nic'
location: resourceGroup().location
properties: {
ipConfigurations: [
{
name: 'toy-subnet-ip-configuration'
properties: {
subnet: {
id: networkModule.outputs.subnetResourceId
}
}
}
]
}
}
ToyNetworking 리소스 그룹에 배포할 리소스는 모듈에 정의되어 있으며 subnetResourceId
출력은 네트워크 인터페이스의 리소스 정의에 사용됩니다.
이 파일을 배포한 후 다음과 같이 ProjectTeddybear라는 다른 리소스 그룹을 대상으로 지정할 수 있습니다.
az deployment group create --resource-group ProjectTeddybear ...
New-AzResourceGroupDeployment -ResourceGroupName ProjectTeddybear ...
배포가 ProjectTeddybear 리소스 그룹을 대상으로 하지만 가상 네트워크 리소스는 ToyNetworking 리소스 그룹에 배포됩니다. 네트워크 인터페이스는 ProjectTeddybear 리소스 그룹에 배포됩니다.
resourceGroup
범위에 구독 ID를 포함하여 다른 구독에 리소스 그룹을 배포할 수도 있습니다.
module networkModule 'modules/network.bicep' = {
scope: resourceGroup('f0750bbe-ea75-4ae5-b24d-a92ca601da2c', 'ToyNetworking')
name: 'networkModule'
}
마찬가지로 subscription()
범위 함수를 사용하여 구독 범위의 여러 구독에 리소스를 배포하고 managementGroup()
범위 함수를 사용하여 여러 관리 그룹에 리소스를 배포할 수 있습니다. 그러나 여러 테넌트 간에 배포할 수는 없습니다.
단일 리소스의 범위 지정
scope
키워드는 모듈뿐만 아니라 다른 특정 리소스 종류에서도 사용할 수 있습니다. 확장 리소스는 scope
키워드를 사용하여 적용할 리소스를 지정합니다. 또한 테넌트 범위 리소스는 scope
키워드를 사용하여 템플릿에서 배포할 수 있습니다.
예를 들어 다음 예제와 같이 Bicep 파일을 사용하여 관리 그룹 계층 구조를 만들 수 있습니다.
targetScope = 'managementGroup'
resource parentManagementGroup 'Microsoft.Management/managementGroups@2023-04-01' = {
scope: tenant()
name: 'NonProduction'
properties: {
displayName: 'Non-production'
}
}
resource childManagementGroup 'Microsoft.Management/managementGroups@2023-04-01' = {
scope: tenant()
name: 'SecretRND'
properties: {
displayName: 'Secret R&D Projects'
details: {
parent: {
id: parentManagementGroup.id
}
}
}
}
이 예제에서는 템플릿 파일에서 targetScope = 'managementGroup'
을 사용하지만 tenant()
범위 내에서 관리 그룹을 배포합니다.
참고
앞의 예제에서는 Bicep을 사용하여 관리 그룹 계층 구조를 만드는 방법을 보여줍니다. NonProduction 관리 그룹은 루트 관리 그룹의 자식이 되고 SecretRND 관리 그룹은 NonProduction 관리 그룹의 자식이 됩니다.
관리 그룹 및 구독 계층 구조 만들기
이제 다양한 범위에서 다양한 리소스를 배포하는 방법을 알고 있으며, Bicep 모듈과 scope
키워드를 사용하여 리소스 조합을 배포하는 방법을 알고 있습니다. 앞의 예제에서 관리 그룹 계층 구조를 확장하는 데 이 모든 새로운 지식을 적용해 보겠습니다. 이제 계층 구조에는 새 Azure 구독을 만드는 테넌트 범위 리소스인 구독 별칭도 포함됩니다.
resource subscription 'Microsoft.Subscription/aliases@2024-08-01-preview'
scope: tenant()
name: subscriptionAliasName
properties: {
// ...
}
}
참고
구독 별칭을 만들 때 청구 범위와 같은 다른 속성도 지정합니다. 명확성을 위해 해당 내용은 생략했습니다.
그런 다음, 구독을 관리 그룹과 연결할 수 있습니다. 이 경우 Microsoft.Management/managementGroups/subscriptions
라는 리소스 종류를 배포해야 합니다. 이 리소스가 작동하는 방식으로 인해 모듈에서 선언합니다. 예를 들어 이름이 modules/mg-subscription-association.bicep인 파일이 있습니다.
targetScope = 'tenant'
@description('The name of the management group that should contain the subscription.')
param managementGroupName string
@description('The subscription ID to place into the management group.')
param subscriptionId string
resource managementGroup 'Microsoft.Management/managementGroups@2023-04-01' existing = {
name: managementGroupName
}
resource subscriptionAssociation 'Microsoft.Management/managementGroups/subscriptions@2023-04-01' = {
parent: managementGroup
name: subscriptionId
}
관리 그룹은 existing
키워드를 통해 참조됩니다.
그런 다음, 주 Bicep 파일은 모듈을 포함하여 연결을 만들 수 있습니다. 전체 Bicep 파일은 다음과 같습니다.
targetScope = 'managementGroup'
@description('The name of the subscription alias to deploy.')
param subscriptionAliasName string
resource parentManagementGroup 'Microsoft.Management/managementGroups@2023-04-01' = {
scope: tenant()
name: 'NonProduction'
properties: {
displayName: 'Non-production'
}
}
resource childManagementGroup 'Microsoft.Management/managementGroups@2023-04-01' = {
scope: tenant()
name: 'SecretRND'
properties: {
displayName: 'Secret R&D Projects'
details: {
parent: {
id: parentManagementGroup.id
}
}
}
}
resource subscription 'Microsoft.Subscription/aliases@2024-08-01-preview'
scope: tenant()
name: subscriptionAliasName
properties: {
// ...
}
}
module subscriptionAssociation 'modules/mg-subscription-association.bicep' = {
name: 'subscriptionAssociation'
scope: tenant()
params: {
managementGroupName: childManagementGroup.name
subscriptionId: subscription.properties.subscriptionId
}
}
앞서 살펴본 바와 같이 모든 범위 및 Bicep 언어 기능을 함께 사용하여 전체 Azure 인프라의 정교한 배포를 만들 수 있습니다.