연습 - 관리 그룹에 리소스 배포

완료됨

Project Teddybear는 성공적이었고, 이제 장난감 회사의 비밀 R&D 개발은 더 많은 새 장난감을 연구할 준비가 되었습니다. 팀에서 거의 매일 새 구독을 요청하기 시작했고 모든 구독에 정책을 적용해야 합니다.

각 구독에서 정책 정의 및 할당을 복제하는 대신 모든 팀의 구독을 관리 그룹 내에 배치하기로 결정했습니다. 그런 다음, 각 구독 대신 전체 관리 그룹에 정책을 적용할 수 있습니다.

이 연습에서는 관리 그룹에 정책 정의 및 할당을 적용하는 새 Bicep 템플릿을 만듭니다.

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

  • 새 관리 그룹을 만듭니다.
  • 새 관리 그룹 범위 Bicep 파일을 만듭니다.
  • 파일에 Azure Policy 리소스를 추가합니다.
  • 리소스 ID를 수동으로 구성하여 정책 할당을 정책 정의에 연결합니다.
  • 템플릿을 배포하고 결과를 확인합니다.

이 연습에는 다음 필수 조건이 필요합니다.

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

관리 그룹 만들기

이 연습에서는 Azure 환경의 다른 부분에 있는 리소스에 실수로 영향을 주지 않도록 새 관리 그룹을 만듭니다.

Visual Studio Code 터미널에서 다음 Azure CLI 명령을 실행합니다.

az account management-group create \
  --name SecretRND \
  --display-name "Secret R&D Projects"

기본적으로 새 관리 그룹은 테넌트 루트 관리 그룹의 직계 자식으로 생성됩니다. 관리 그룹을 기존 관리 그룹 계층 구조의 특정 위치에 배치해야 하는 경우 --parent-id 매개 변수를 사용하고 부모로 사용할 관리 그룹의 이름을 지정합니다.

Visual Studio Code 터미널에서 다음 Azure PowerShell 명령을 실행합니다.

New-AzManagementGroup `
  -GroupId 'SecretRND' `
  -DisplayName 'Secret R&D Projects'

기본적으로 새 관리 그룹은 테넌트 루트 관리 그룹의 자식으로 생성됩니다. 관리 그룹을 기존 관리 그룹 계층 구조의 특정 위치에 배치해야 하는 경우 -ParentId 매개 변수를 사용하고 부모로 사용할 관리 그룹의 이름을 지정합니다.

실제 배포 에서는 R&D 팀의 구독을 관리 그룹으로 이동합니다. 이 연습에서는 관리 그룹에 구독이 포함되어 있지 않은 경우에도 정책을 배포합니다. 관리 그룹이 비어 있거나 구독을 포함하는지 여부에 관계없이 동일한 배포 프로세스가 적용됩니다.

관리 그룹에 배포할 Bicep 파일 만들기

  1. Visual Studio Code를 엽니다.

  2. main.bicep 파일을 삭제한 다음, 같은 이름으로 새 빈 파일을 만듭니다.

  3. 빈 파일을 저장합니다.

  4. 파일에 다음 내용을 추가합니다.

    targetScope = 'managementGroup'
    

    이 코드 줄은 템플릿이 관리 그룹 범위에 배포될 것임을 Bicep에 알려줍니다.

정책 정의 추가

앞에서 설명한 것처럼 Bicep 파일에 정책 정의를 만듭니다.

  1. 방금 추가한 줄 아래에 다음 변수 정의를 추가합니다.

    var policyDefinitionName = 'DenyFandGSeriesVMs'
    
  2. 파일 맨 아래에 Azure Policy 정의를 추가합니다.

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

    정책 정의는 이전에 구독에 적용한 것과 동일합니다. 그러나 이번에는 관리 그룹에 배포합니다.

정책 할당 추가

이제 관리 그룹에 정책을 적용합니다. 즉, 이 관리 그룹의 자식인 모든 구독에 정책이 적용됩니다.

  1. policyDefinitionName 변수 정의 아래에 다음 변수를 추가합니다.

    var policyAssignmentName = 'DenyFandGSeriesVMs'
    
  2. 파일 하단의 정책 정의 리소스 아래에 다음 정책 할당을 추가합니다.

    resource policyAssignment 'Microsoft.Authorization/policyAssignments@2024-05-01' = {
      name: policyAssignmentName
      properties: {
        policyDefinitionId: policyDefinition.id
      }
    }
    
  3. 변경 내용을 파일에 저장합니다.

템플릿 확인

템플릿은 다음과 같이 표시됩니다.

targetScope = 'managementGroup'

var policyDefinitionName = 'DenyFandGSeriesVMs'
var policyAssignmentName = 'DenyFandGSeriesVMs'

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

그렇지 않은 경우 예제를 복사하거나 예제와 일치하도록 템플릿을 조정합니다.

Azure에 템플릿 배포

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

managementGroupId="SecretRND"
templateFile="main.bicep"
today=$(date +"%d-%b-%Y")
deploymentName="mg-scope-"$today

az deployment mg create \
  --management-group-id $managementGroupId \
  --name $deploymentName \
  --location westus \
  --template-file $templateFile

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

$managementGroupId = 'SecretRND'
$templateFile = 'main.bicep'
$today = Get-Date -Format 'MM-dd-yyyy'
$deploymentName = "mg-scope-$today"

New-AzManagementGroupDeployment `
  -ManagementGroupId $managementGroupId `
  -Name $deploymentName `
  -Location westus `
  -TemplateFile $templateFile

구독 배포와 마찬가지로 배포 메타데이터의 이름과 위치를 명시적으로 지정합니다. 그리고 현재 날짜를 사용하여 기존 배포의 이름을 사용할 가능성을 줄입니다.

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

배포 확인

구독 범위 배포의 경우와 마찬가지로 Azure Portal에서 관리 그룹 범위 배포를 볼 수 있습니다.

  1. Azure Portal로 이동합니다.

  2. 왼쪽 창에서 모든 서비스를 선택합니다.

  3. 검색 상자에 관리 그룹을 입력한 다음 결과 목록에서 관리 그룹을 선택합니다.

    Screenshot of the Azure portal interface showing the service list with 'Management groups' highlighted.

  4. 비밀 R&D 프로젝트 관리 그룹을 선택합니다.

    Screenshot of the Azure portal interface, highlighting 'Secret R&D Projects' in the list of management groups.

  5. 왼쪽 창의 검색 상자에 배포를 입력한 다음 거버넌스에서 배포를 선택합니다.

    Screenshot of the Azure portal interface, showing the management group details.

  6. mg-scope로 시작하는 배포를 선택하여 배포된 리소스를 확인합니다.

    Screenshot of the Azure portal Deployments pane, highlighting the 'mg-scope-*' deployment in the list of deployments.

  7. 선택한 배포의 개요 창에서 배포 세부 정보를 선택하여 확장합니다. 두 개의 Azure Policy 리소스가 나열됩니다.

    Screenshot of the Azure portal 'Overview' pane for the selected deployment.

리소스 정리

관리 그룹 범위 리소스를 성공적으로 배포했습니다. 사용자가 만든 정책 리소스 및 관리 그룹을 제거할 수 있습니다.

az account management-group delete --name SecretRND
Remove-AzManagementGroup -GroupId SecretRND