연습 - 구독 범위 리소스 배포

완료됨

중요

이 연습을 수행하려면 사용자의 Azure 구독이 필요하며 요금이 발생할 수 있습니다. Azure 구독이 아직 없는 경우 시작하기 전에 체험 계정을 만듭니다.

Project Teddybear는 전체 스윙에 있으며, R&D 팀은 새 Azure 구독에 대한 액세스 권한을 부여할 때까지 기다리고 있습니다. 구독을 이미 만들었지만 팀에 액세스 권한을 부여하기 전에 팀의 정책을 준수하는 가상 머신만 배포하도록 해야 합니다. 팀에서 F 또는 G 시리즈 가상 머신을 배포하지 않도록 지시했습니다.

이 연습에서는 팀 정책을 기반으로 구독을 구성하는 Bicep 템플릿을 만듭니다.

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

  • 구독 범위에 배포할 Bicep 템플릿을 만듭니다.
  • Azure Policy 정의 및 할당을 추가합니다.
  • 템플릿을 배포하고 결과를 확인합니다.

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

이 연습에서는 Visual Studio Code용 Bicep 확장을 사용합니다. Visual Studio Code에서 해당 확장을 설치해야 합니다.

구독 범위 템플릿 만들기

  1. Visual Studio Code를 엽니다.

  2. main.bicep이라는 새 파일을 만듭니다.

  3. Visual Studio Code에서 Bicep 도구가 로드되도록 빈 파일을 저장합니다.

    파일>다른 이름으로 저장을 선택해도 되고 Windows에서 Ctrl+S(macOS는 ⌘+S) 키를 눌러도 됩니다. 파일을 저장한 위치를 기억해야 합니다. 예를 들어 파일을 저장할 scripts 폴더를 만들 수 있습니다.

  4. main.bicep 파일에 다음 콘텐츠를 추가합니다. 조금 뒤에 템플릿을 배포할 것입니다. 도구가 Bicep 파일을 작성하는 데 어떤 도움을 주는지 확인할 수 있도록 복사하여 붙여넣는 대신 수동으로 입력하는 것이 좋습니다.

    targetScope = 'subscription'
    

    이 코드 줄은 템플릿이 구독 범위에 배포될 것임을 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'
          }
        }
      }
    }
    

    정책 정의는 다음과 같은 리소스에만 적용됩니다.

    • 리소스 형식은 Microsoft.Compute/virtualMachines와 같습니다.
    • sku.name 속성은 Standard_F 또는 Standard_G하나로 시작합니다.

    이러한 조건과 일치하는 리소스를 만들려고 하면 Azure에서 리소스 만들기를 거부합니다.

    경고

    특히 구독 및 관리 그룹과 같은 광범위한 범위에서 정책 정의에 거부 정책 효과를 사용할 때는 주의해야 합니다. 정의가 제대로 생성되지 않으면 예기치 않은 영향을 받아 중단이 발생할 수 있습니다. 감사 정책 효과를 시작한 다음, 일정 시간 동안 정상적으로 작동하는 것을 확인한 후에만 거부 효과로 전환하는 것이 좋습니다.

    구독 범위에서 정책 정의를 만들고 있습니다. 즉, 정의를 배포한 후 구독의 모든 리소스 그룹에서 사용할 수 있습니다.

정책 할당

정책 정의는 적용될 때까지 효과가 없습니다. 이 단계에서는 구독에 정책 정의를 적용하는 두 번째 구독 범위 리소스를 배포합니다.

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

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

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

    전체 구독에 적용되도록 정책 할당을 명시적으로 구성하지는 않습니다. Bicep은 템플릿이 구독 범위에 배포되므로 이를 이해합니다.

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

템플릿 확인

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

targetScope = 'subscription'

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 계정에 로그인해야 합니다. Azure CLI 도구를 설치했는지 확인합니다.

  1. 터미널 메뉴에서 새 터미널을 선택합니다. 터미널 창은 일반적으로 화면의 아래쪽 절반에서 열립니다.

  2. 터미널 창의 오른쪽에 bash가 표시되면 올바른 셸이 이미 열려 있음을 의미합니다. 또는 오른쪽에 bash 셸 아이콘이 표시되면 해당 아이콘을 선택하여 셸을 시작할 수 있습니다.

    Bash 옵션이 표시된 Visual Studio Code 터미널 창의 스크린샷

    bash 이외의 셸이 나타나면 셸 드롭다운 화살표를 선택한 다음 Git Bash를 선택합니다.

    표시되어 있는 터미널 셸 드롭다운에서 Git Bash 기본값이 선택된 상태의 Visual Studio Code 터미널 창 스크린샷

  3. 터미널에서 템플릿을 저장한 디렉터리로 이동합니다. 예를 들어, templates 폴더에 템플릿을 저장한 경우 다음 명령을 사용할 수 있습니다.

    cd templates
    

Bicep 설치

다음 명령을 실행하여 최신 버전의 Bicep이 있는지 확인합니다.

az bicep install && az bicep upgrade

Azure CLI를 사용하여 Azure에 로그인

  1. Visual Studio Code 터미널에서 다음 명령을 실행하여 Azure에 로그인합니다.

    az login
    
  2. 열리는 브라우저에서 Azure 계정에 로그인합니다.

    Visual Studio Code 터미널에는 이 계정과 연결된 구독 목록이 표시됩니다.

  3. 목록에서 이 연습에 사용할 구독을 찾습니다.

    로그인에서 목록을 누락한 경우 다음 조각을 사용하여 구독을 다시 나열할 수 있습니다.

    az account list --output table
    
  4. 이 세션에서 실행하는 모든 Azure CLI 명령에 대한 기본 구독을 설정합니다.

    az account set --subscription "Your Subscription Name or ID"
    

Azure에 이 템플릿을 배포하려면 Visual Studio Code 터미널에서 Azure 계정에 로그인합니다. Azure PowerShell을 설치했는지 확인합니다.

  1. 터미널 메뉴에서 새 터미널을 선택합니다. 터미널 창은 일반적으로 화면의 아래쪽 절반에서 열립니다.

  2. 터미널 창의 오른쪽에 pwsh 또는 powershell이 표시되면 올바른 셸이 이미 열려 있음을 의미합니다. 또는 오른쪽에 PowerShell 셸 아이콘이 표시되면 해당 아이콘을 선택하여 셸을 시작할 수 있습니다.

    셸 드롭다운 목록에 pwsh 옵션이 표시된 Visual Studio Code 터미널 창의 스크린샷.

    pwsh 또는 powershell 이외의 셸이 나타나면 셸 드롭다운 화살표를 선택한 다음, PowerShell을 선택합니다.

    터미널 셸 드롭다운 목록이 표시되고 PowerShell이 선택되어 있는 Visual Studio Code 터미널 창의 스크린샷.

  3. 터미널에서 템플릿을 저장한 디렉터리로 이동합니다. 예를 들어, templates 폴더에 템플릿을 저장한 경우 다음 명령을 사용할 수 있습니다.

    Set-Location -Path templates
    

Bicep CLI 설치

Azure PowerShell에서 Bicep을 사용하려면 Bicep CLI를 설치합니다.

Azure PowerShell을 사용하여 Azure에 로그인

  1. Visual Studio Code 터미널에서 다음 명령을 실행하여 Azure에 로그인합니다.

    Connect-AzAccount
    
  2. 열리는 브라우저에서 Azure 계정에 로그인합니다.

  3. 다음 명령을 실행하여 이 연습에 사용할 구독의 ID를 가져옵니다.

    Get-AzSubscription
    

    구독 ID는 두 번째 열입니다. 두 번째 열을 복사합니다. aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e와 비슷하게 보입니다.

  4. 이 세션에서 실행하는 모든 Azure PowerShell 명령에 대한 기본 구독을 설정합니다.

    Set-AzContext -SubscriptionId {Your subscription ID}
    

Azure에 템플릿 배포

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

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

az deployment sub create \
    --name $deploymentName \
    --location westus \
    --template-file $templateFile

사용할 수 있는 az deployment group create 명령 대신 az deployment sub create 명령을 사용하여 구독 범위 배포를 만드는 중입니다.

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

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

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

사용할 수 있는 New-AzResourceGroupDeployment cmdlet 대신 New-AzSubscriptionDeployment cmdlet을 사용하여 구독 범위 배포를 만드는 중입니다.

또한 배포의 이름 및 위치를 명시적으로 지정하고 있습니다. Azure는 이 정보를 사용하여 배포 메타데이터를 저장합니다.

배포 이름에는 오늘 날짜가 포함됩니다. 이렇게 하면 실수로 다른 배포와 동일한 이름을 사용할 가능성이 줄어듭니다.

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

참고

AuthorizationFailed 코드가 있는 오류 메시지가 수신되면 구독 범위 리소스를 배포할 수 있는 권한이 없을 수 있습니다. Azure 관리자에게 권한을 부여하도록 요청합니다. 또는 현재 Azure 계정으로 이 요구 사항을 충족할 수 없는 경우 평가판을 받고 새 Azure 구독 및 테넌트를 만들 수 있습니다.

배포 확인

Azure Portal에서 구독 범위 배포를 볼 수 있습니다. 이는 배포가 성공적으로 완료되었는지 확인하고 결과를 검사하는 데 유용할 수 있습니다.

  1. Azure Portal로 이동합니다.

  2. 왼쪽 창에서 구독을 선택합니다.

  3. 구독을 선택합니다.

  4. 검색 상자에 배포를 입력한 다음, 배포 메뉴 항목을 선택합니다.

    Azure Portal 검색 상자 및 배포 메뉴 항목의 스크린샷.

  5. 배포 이름 열에서 하위 범위로 시작하는 배포를 선택하여 배포된 리소스를 확인합니다.

    배포 목록을 보여주는 Azure Portal 인터페이스의 스크린샷.

  6. 배포 세부 정보를 선택하여 확장합니다. 이 경우 두 개의 Azure Policy 리소스가 나열됩니다.

    선택한 배포에 대한 Azure Portal 개요 창의 스크린샷.

리소스 정리

구독 범위 리소스를 성공적으로 배포했습니다. 다음 명령을 실행하여 만든 정책 리소스를 제거할 수 있습니다.

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
$subscriptionId = (Get-AzContext).Subscription.Id

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

다음 연습 단원에서는 동일한 정책 리소스를 다시 배포합니다. 다시 만들지만 나중에 다시 정리할 수 있습니다.