다음을 통해 공유


빠른 시작: Terraform을 사용하여 비규격 리소스를 식별하는 정책 할당 만들기

Azure의 규정 준수를 이해하는 첫 번째 단계는 리소스 상태를 식별하는 것입니다. 이 빠른 시작에서는 관리 디스크를 사용하지 않는 가상 머신을 식별하는 정책 할당을 만들고 할당하는 과정을 단계별로 안내합니다.

이 프로세스가 끝나면 구독에서 관리 디스크를 사용하지 않는 가상 머신을 식별합니다. 이 가상 머신은 정책 할당을 비준수합니다.

기본 제공 정책 또는 이니셔티브 정의를 할당할 때 버전을 참조하는 것은 선택 사항입니다. 기본 제공 정의의 정책 할당은 기본적으로 최신 버전으로 지정되며 별도로 지정하지 않는 한 자동으로 부 버전 변경 내용을 상속합니다.

필수 조건

  • Azure 구독이 없는 경우 시작하기 전에 체험 계정을 만듭니다.
  • 사용자 환경에 구성된 Terraform 버전 0.12.0 이상. 자세한 내용은 Azure Cloud Shell을 사용하여 Terraform 구성을 참조하세요.
  • 이 빠른 시작에서는 Azure CLI 버전 2.13.0 이상을 실행해야 합니다. 버전을 확인하려면 az --version을 실행합니다. 설치 또는 업그레이드해야 하는 경우 Azure CLI 설치를 참조하세요.

Terraform 구성, 변수 및 출력 파일 만들기

이 빠른 시작에서는 정책 할당을 만들고 관리 디스크를 사용하지 않는 VM 감사 정의를 할당합니다. 이 정책 정의는 정책 정의에 설정된 조건을 준수하지 않는 리소스를 식별합니다.

Terraform 구성, 변수 및 출력 파일을 구성합니다. Azure Policy에 대한 Terraform 리소스는 Azure 공급자를 사용합니다.

  1. policy-assignment라는 새 폴더를 만들고 디렉터리를 변경합니다.

  2. 다음 코드로 main.tf를 만듭니다.

    참고 항목

    관리 그룹에서 정책 할당을 만들려면 azurerm_management_group_policy_assignment 리소스를 사용하고 리소스 그룹에는 azurerm_resource_group_policy_assignment를 사용하고 구독의 경우 azurerm_subscription_policy_assignment 리소스를 사용합니다.

      provider "azurerm" {
        features {}
      }
    
      terraform {
      required_providers {
          azurerm = {
              source = "hashicorp/azurerm"
              version = ">= 2.96.0"
          }
        }
      }
    
      resource "azurerm_subscription_policy_assignment" "auditvms" {
      name = "audit-vm-manageddisks"
      subscription_id = var.cust_scope
      policy_definition_id = "/providers/Microsoft.Authorization/policyDefinitions/06a78e20-9358-41c9-923c-fb736d382a4d"
      description = "Shows all virtual machines not using managed disks"
      display_name = "Audit VMs without managed disks assignment"
      }
    
  3. 다음 코드로 variables.tf를 만듭니다.

    variable "cust_scope" {
        default = "{scope}"
    }
    

    범위는 정책 할당이 적용되는 리소스 또는 리소스 그룹을 결정합니다. 관리 그룹에서 개별 리소스에 이르기까지 다양할 수 있습니다. {scope}를 선언된 리소스에 따라 다음 패턴 중 하나로 바꿔야 합니다.

    • 구독: /subscriptions/{subscriptionId}
    • 리소스 그룹: /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}
    • 리소스: /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProviderNamespace}/[{parentResourcePath}/]
  4. 다음 코드로 output.tf를 만듭니다.

    output "assignment_id" {
        value = azurerm_subscription_policy_assignment.auditvms.id
    }
    

Terraform 초기화 및 계획 만들기

Terraform을 초기화하여 필요한 공급자를 다운로드한 다음, 계획을 만듭니다.

  1. terraform init 명령을 실행합니다. 이 명령은 Terraform 구성에서 Azure 리소스 그룹을 만드는 데 필요한 Azure 모듈을 다운로드합니다.

    terraform init
    

    azurerm 모듈 및 성공 메시지 다운로드를 보여주는 terraform init 명령 실행 스크린샷.

  2. Terraform에 대한 Azure CLI를 사용하여 인증합니다. 자세한 내용은 Azure 공급자: Azure CLI를 사용하여 인증을 참조하세요.

    az login
    
  3. terraform plan 명령 및 out 매개 변수를 사용하여 실행 계획을 만듭니다.

    terraform plan -out assignment.tfplan
    

    terraform plan 명령 및 out 매개 변수를 실행하여 생성되는 Azure 리소스를 표시하는 스크린샷.

    참고 항목

    실행 계획 및 보안 유지에 대한 자세한 내용은 Terraform 계획: 보안 경고를 참조하세요.

Terraform 실행 계획 적용

실행 계획을 적용합니다.

terraform apply 명령을 실행하고 이미 생성된 assignment.tfplan을 지정합니다.

terraform apply assignment.tfplan

terraform apply 명령 실행 및 결과 리소스 생성의 스크린샷.

이제 Apply complete! Resources: 1 added, 0 changed, 0 destroyed. 메시지를 사용하여 정책 할당이 생성됩니다. outputs.tf 파일을 정의했으므로 assignment_id도 반환됩니다.

비규격 리소스 식별

이 새 할당에서 규정을 준수하지 않는 리소스를 보려면 terraform apply에서 반환된 assignment_id를 사용합니다. 이를 통해 다음 명령을 실행하여 JSON 파일로 출력되는 비규격 리소스의 리소스 ID를 가져옵니다.

armclient post "/subscriptions/<subscriptionID>/providers/Microsoft.PolicyInsights/policyStates/latest/queryResults?api-version=2019-10-01&$filter=IsCompliant eq false and PolicyAssignmentId eq '<policyAssignmentID>'&$apply=groupby((ResourceId))" > <json file to direct the output with the resource IDs into>

결과는 다음 예제와 유사합니다.

{
  "@odata.context": "https://management.azure.com/subscriptions/<subscriptionId>/providers/Microsoft.PolicyInsights/policyStates/$metadata#latest",
  "@odata.count": 3,
  "value": [
    {
      "@odata.id": null,
      "@odata.context": "https://management.azure.com/subscriptions/<subscriptionId>/providers/Microsoft.PolicyInsights/policyStates/$metadata#latest/$entity",
      "ResourceId": "/subscriptions/<subscriptionId>/resourcegroups/<rgname>/providers/microsoft.compute/virtualmachines/<virtualmachineId>"
    },
    {
      "@odata.id": null,
      "@odata.context": "https://management.azure.com/subscriptions/<subscriptionId>/providers/Microsoft.PolicyInsights/policyStates/$metadata#latest/$entity",
      "ResourceId": "/subscriptions/<subscriptionId>/resourcegroups/<rgname>/providers/microsoft.compute/virtualmachines/<virtualmachine2Id>"
    },
    {
      "@odata.id": null,
      "@odata.context": "https://management.azure.com/subscriptions/<subscriptionId>/providers/Microsoft.PolicyInsights/policyStates/$metadata#latest/$entity",
      "ResourceId": "/subscriptions/<subscriptionName>/resourcegroups/<rgname>/providers/microsoft.compute/virtualmachines/<virtualmachine3ID>"
    }
  ]
}

결과는 Azure Portal 보기에서 비준수 리소스 아래 나열된 것과 비교할 수 있습니다.

리소스 정리

만든 할당을 제거하려면 Azure CLI를 사용하거나 terraform destroy를 사용하여 Terraform 실행 계획을 취소합니다.

  • Azure CLI

    az policy assignment delete --name 'audit-vm-manageddisks' --scope '/subscriptions/<subscriptionID>/<resourceGroupName>'
    
  • Terraform

    terraform destroy
    

다음 단계

이 빠른 시작에서는 Azure 환경에서 규정 비준수 리소스를 식별하는 정책 정의를 할당했습니다.

새 리소스가 규정을 준수하는지 확인하는 정책을 할당하는 방법을 알아보려면 다음 자습서를 계속 진행하세요.