연습 - 모듈을 사용하여 여러 범위에 리소스 배포

완료됨

참고

이 연습에는 Azure 구독이 필요합니다. 아직 없는 경우, 무료 구독을 가져올 수 있습니다.

R&D 팀은 Project Teddybear 구독에서 가상 네트워크를 만드는 데 도움을 요청했습니다. 향후 더 많은 구독을 통해 팀에 도움을 줄 수 있으므로 재사용 가능한 Bicep 템플릿을 확장하여 팀 멤버가 사용할 가상 네트워크를 배포할 수 있습니다.

이 연습에서는 마지막 연습에서 빌드를 시작한 템플릿을 업데이트합니다.

프로세스 중에 다음을 수행합니다.

  • 구독 범위 템플릿을 업데이트하여 새 리소스 그룹을 만듭니다.
  • 가상 네트워크를 사용하여 별도의 Bicep 모듈을 만들고 매개 변수를 사용하여 가상 네트워크를 구성하는 방법을 제어합니다.
  • 템플릿을 업데이트하여 리소스 그룹에 모듈을 배포합니다.
  • 템플릿을 배포합니다.

이 연습에서는 구독 범위 리소스를 배포할 수 있는 권한이 있어야 합니다. 현재 Azure 계정으로 이 요구 사항을 충족할 수 없는 경우 평가판을 받고 새 Azure 구독 및 테넌트를 만들 수 있습니다. 또는 이 연습의 배포 단계를 건너뛸 수 있습니다.

리소스 그룹 만들기

  1. Visual Studio Code에서 이전 연습에서 만든 main.bicep 파일을 엽니다.

  2. 현재 변수 정의 아래에 다음 변수 정의를 추가합니다.

    var resourceGroupName = 'ToyNetworking'
    
  3. 파일 맨 아래에 다음 리소스 정의를 추가합니다.

    resource resourceGroup 'Microsoft.Resources/resourceGroups@2024-07-01' = {
      name: resourceGroupName
      location: deployment().location
    }
    

    다른 리소스를 정의하는 것처럼 리소스 그룹을 정의합니다. 리소스 그룹은 targetScopesubscription으로 설정된 Bicep 파일에서 배포 및 관리할 수 있는 구독 범위 리소스입니다.

  4. 변경 내용을 파일에 저장합니다.

가상 네트워크를 만드는 모듈 추가

다음으로, R&D 팀의 가상 네트워크에 대한 Bicep 모듈을 만듭니다. 이 연습 뒷부분에서 모듈의 리소스를 리소스 그룹에 배포합니다.

  1. Visual Studio Code에서 main.bicep 파일을 만든 폴더에 modules라는 새 폴더를 만듭니다.

  2. modules 폴더에서 virtualNetwork.bicep이라는 파일을 만들고 저장합니다.

  3. virtualNetwork.bicep 파일에서 다음 콘텐츠를 추가합니다.

    param virtualNetworkName string
    param virtualNetworkAddressPrefix string
    
    resource virtualNetwork 'Microsoft.Network/virtualNetworks@2024-01-01' = {
      name: virtualNetworkName
      location: resourceGroup().location
      properties: {
        addressSpace: {
          addressPrefixes: [
            virtualNetworkAddressPrefix
          ]
        }
      }
    }
    

    이 모듈에는 targetScope를 지정하지 않았습니다. Bicep 파일이 리소스 그룹을 대상으로 하는 경우 대상 범위를 지정할 필요가 없습니다.

  4. 변경 내용을 파일에 저장합니다.

구독 배포에서 모듈 사용

이제 리소스 그룹에 모듈을 배포하도록 Bicep에 지시할 준비가 되었습니다.

  1. Visual Studio Code에 있는 main.bicep 파일의 targetScope 줄 아래에 다음 매개 변수 정의를 추가합니다.

    param virtualNetworkName string
    param virtualNetworkAddressPrefix string
    

    이러한 매개 변수는 템플릿을 다시 사용할 수 있게 합니다. R&D 팀에 새 구독이 필요할 때마다 고유한 이름 및 IP 주소 범위를 사용하여 가상 네트워크를 만들 수 있습니다.

  2. 파일 맨 아래에 다음 모듈 정의를 추가합니다.

    module virtualNetwork 'modules/virtualNetwork.bicep' = {
      scope: resourceGroup
      name: 'virtualNetwork'
      params: {
        virtualNetworkName: virtualNetworkName
        virtualNetworkAddressPrefix: virtualNetworkAddressPrefix
      }
    }
    

    모듈에 대한 scope를 명시적으로 지정하고 있습니다. Bicep은 모듈 내의 리소스를 파일에서 이전에 만든 리소스 그룹에 배포해야 함을 인식합니다.

템플릿 확인

main.bicep 파일은 다음과 같아야 합니다.

targetScope = 'subscription'

param virtualNetworkName string
param virtualNetworkAddressPrefix string

var policyDefinitionName = 'DenyFandGSeriesVMs'
var policyAssignmentName = 'DenyFandGSeriesVMs'
var resourceGroupName = 'ToyNetworking'

resource policyDefinition 'Microsoft.Authorization/policyDefinitions@2024-05-01' = {
  name: policyDefinitionName
  properties: {
    policyType: 'Custom'
    mode: 'All'
    parameters: {}
    policyRule: {
      if: {
        allOf: [
          {
            field: 'type'
            equals: 'Microsoft.Compute/virtualMachines'
          }
          {
            anyOf: [
              {
                field: 'Microsoft.Compute/virtualMachines/sku.name'
                like: 'Standard_F*'
              }
              {
                field: 'Microsoft.Compute/virtualMachines/sku.name'
                like: 'Standard_G*'
              }
            ]
          }
        ]
      }
      then: {
        effect: 'deny'
      }
    }
  }
}

resource policyAssignment 'Microsoft.Authorization/policyAssignments@2024-05-01' = {
  name: policyAssignmentName
  properties: {
    policyDefinitionId: policyDefinition.id
  }
}

resource resourceGroup 'Microsoft.Resources/resourceGroups@2024-07-01' = {
  name: resourceGroupName
  location: deployment().location
}

module virtualNetwork 'modules/virtualNetwork.bicep' = {
  scope: resourceGroup
  name: 'virtualNetwork'
  params: {
    virtualNetworkName: virtualNetworkName
    virtualNetworkAddressPrefix: virtualNetworkAddressPrefix
  }
}

modules/virtualNetwork.bicep 파일은 다음과 같아야 합니다.

param virtualNetworkName string
param virtualNetworkAddressPrefix string

resource virtualNetwork 'Microsoft.Network/virtualNetworks@2024-01-01' = {
  name: virtualNetworkName
  location: resourceGroup().location
  properties: {
    addressSpace: {
      addressPrefixes: [
        virtualNetworkAddressPrefix
      ]
    }
  }
}

두 파일 중 하나가 예제와 일치하지 않는 경우 예제를 복사하거나 템플릿을 조정합니다.

Azure에 템플릿 배포

Visual Studio Code 터미널에서 다음 Azure CLI 명령을 사용하여 템플릿을 배포합니다.

templateFile="main.bicep"
today=$(date +"%d-%b-%Y")
deploymentName="sub-scope-"$today
virtualNetworkName="rnd-vnet-001"
virtualNetworkAddressPrefix="10.0.0.0/24"

az deployment sub create \
    --name $deploymentName \
    --location westus \
    --template-file $templateFile \
    --parameters virtualNetworkName=$virtualNetworkName \
                 virtualNetworkAddressPrefix=$virtualNetworkAddressPrefix

Visual Studio Code 터미널에서 다음 Azure PowerShell 명령을 사용하여 템플릿을 배포합니다.

$templateFile = 'main.bicep'
$today = Get-Date -Format 'MM-dd-yyyy'
$deploymentName = "sub-scope-$today"
$virtualNetworkName = 'rnd-vnet-001'
$virtualNetworkAddressPrefix = '10.0.0.0/24'

New-AzSubscriptionDeployment `
  -Name $deploymentName `
  -Location westus `
  -TemplateFile $templateFile `
  -virtualNetworkName $virtualNetworkName `
  -virtualNetworkAddressPrefix $virtualNetworkAddressPrefix

virtualNetworkNamevirtualNetworkAddressPrefix 매개 변수에 대한 값을 전달하고 있습니다. 다른 R&D 팀에서 구독을 준비하도록 요청하는 경우 이러한 값을 변경하여 해당 팀에 자체 가상 네트워크를 제공할 수 있습니다.

1~2분 정도 후에 배포가 성공적으로 완료됩니다.

배포 확인

이제 모듈에서 만든 리소스 그룹 및 배포를 확인합니다.

  1. Azure Portal로 이동합니다.

  2. 왼쪽 창에서 리소스 그룹을 선택합니다. ToyNetworking 리소스 그룹이 만들어졌습니다.

  3. ToyNetworking 리소스 그룹을 선택합니다. 모듈이 리소스 그룹에 성공적으로 배포되고 가상 네트워크가 생성되었습니다.

    Screenshot of the Azure portal, showing the ToyNetworking resource group.

리소스 정리

리소스 그룹을 포함하여 구독 범위 리소스를 성공적으로 배포했으며, 모듈을 사용하여 생성한 리소스 그룹에 리소스를 배포했습니다. 생성한 정책 리소스 및 리소스 그룹을 제거할 수 있습니다.

주의

이 명령은 ToyNetworking이라는 리소스 그룹과 모든 해당 리소스를 영구적으로 삭제합니다. 이 리소스 그룹에 다른 항목을 배포한 경우 이 단계를 건너뛰어야 합니다.

subscriptionId=$(az account show --query 'id' --output tsv)

az policy assignment delete --name 'DenyFandGSeriesVMs' --scope "/subscriptions/$subscriptionId"
az policy definition delete --name 'DenyFandGSeriesVMs' --subscription $subscriptionId
az group delete --name ToyNetworking
$subscriptionId = (Get-AzContext).Subscription.Id

Remove-AzPolicyAssignment -Name 'DenyFandGSeriesVMs' -Scope "/subscriptions/$subscriptionId"
Remove-AzPolicyDefinition -Name 'DenyFandGSeriesVMs' -SubscriptionId $subscriptionId
Remove-AzResourceGroup -Name ToyNetworking