다음을 통해 공유


Azure Batch 계정 및 두 개의 풀 배포 - Terraform

이 빠른 시작에서는 Terraform을 사용하여 Azure Batch 계정, Azure Storage 계정 및 두 개의 Batch 풀을 만듭니다. Batch는 많은 컴퓨터에서 대량의 데이터 처리를 병렬화하고 분산하는 클라우드 기반 작업 예약 서비스입니다. 일반적으로 매개 변수 스윕, 몬테카를로 시뮬레이션, 재무 위험 모델링 및 기타 고성능 컴퓨팅 애플리케이션에 사용됩니다. Batch 계정은 풀, 작업 및 작업에 대한 액세스를 제공하는 Batch 서비스의 최상위 리소스입니다. Storage 계정은 Batch 서비스에서 사용 및 생성되는 모든 파일을 저장하고 관리하는 데 사용되며, 두 Batch 풀은 태스크를 실행하는 컴퓨팅 노드의 컬렉션입니다.

Terraform은 클라우드 인프라의 정의, 프리뷰 및 배포를 사용합니다. Terraform을 사용하는 경우 HCL 구문를 사용하여 구성 파일을 만듭니다. HCL 구문을 사용하면 클라우드 공급자(예: Azure) 그리고 클라우드 인프라를 구성하는 요소를 지정할 수 있습니다. 구성 파일을 만든 후 배포되기 전에 인프라 변경을 미리 볼 수 있는 실행 계획를 만듭니다. 변경 내용을 확인 한 후에는 실행 계획을 적용하여 인프라를 배포합니다.

  • Terraform의 필수 버전과 필요한 공급자를 지정합니다.
  • 추가 기능 없이 Azure 공급자를 정의합니다.
  • 리소스 그룹의 위치 및 리소스 그룹 이름의 접두사에 대한 변수를 정의합니다.
  • 제공된 접두사를 사용하여 리소스 그룹에 대한 임의 이름을 생성합니다.
  • 지정된 위치에 생성된 이름을 사용하여 Azure 리소스 그룹을 만듭니다.
  • Storage 계정의 이름으로 사용할 임의 문자열을 생성합니다.
  • 생성된 리소스 그룹, 동일한 위치 및 표준 계정 계층 및 로컬 중복 스토리지 복제 유형을 사용하여 생성된 이름을 사용하여 Storage 계정을 만듭니다.
  • Batch 계정의 이름으로 사용할 다른 임의 문자열을 생성합니다.
  • 생성된 리소스 그룹에 생성된 이름을 사용하여 동일한 위치에 Batch 계정을 만들고 스토리지 키 인증 모드를 사용하여 만든 Storage 계정에 연결합니다.
  • "풀" 접두사를 사용하여 Batch 풀의 임의 이름을 생성합니다.
  • 생성된 리소스 그룹에서 생성된 이름을 사용하여 고정된 크기로 Batch 풀을 만들고, 생성된 Batch 계정에 연결하고, 표준 A1 VM(가상 머신) 크기, Ubuntu 22.04 노드 에이전트 SKU 및 최대 한 번의 재시도로 '$env 헬로 월드'을 에코하고 성공을 기다리는 시작 작업을 만듭니다.
  • 생성된 리소스 그룹에서 동일한 생성된 이름을 사용하여 표준 A1 VM 크기, Ubuntu 22.04 노드 에이전트 SKU 및 자동 크기 조정 수식을 사용하여 생성된 Batch 계정에 연결된 자동 크기 조정을 사용하여 다른 Batch 풀을 만듭니다.
  • 만든 리소스 그룹, 스토리지 계정, Batch 계정 및 두 Batch 풀의 이름을 출력합니다.

필수 조건

Terraform 코드 구현

참고 항목

이 문서의 샘플 코드는 Azure Terraform GitHub 리포지토리에 있습니다. Terraform의 현재 및 이전 버전의 테스트 결과가 포함된 로그 파일을 볼 수 있습니다.

Terraform을 사용한 Azure 리소스 관리 방법을 보여 주는 문서 및 샘플 코드를 참조하세요.

  1. 샘플 Terraform 코드를 테스트하고 실행할 디렉터리를 만들고 현재 디렉터리로 만듭니다.

  2. 이름이 지정된 main.tf파일을 만들고 다음 코드를 삽입합니다.

    resource "random_pet" "rg_name" {
      prefix = var.resource_group_name_prefix
    }
    
    resource "azurerm_resource_group" "rg" {
      location = var.resource_group_location
      name     = random_pet.rg_name.id
    }
    
    resource "random_string" "storage_account_name" {
      length  = 8
      lower   = true
      numeric = false
      special = false
      upper   = false
    }
    
    resource "azurerm_storage_account" "example" {
      name                     = random_string.storage_account_name.result
      resource_group_name      = azurerm_resource_group.rg.name
      location                 = azurerm_resource_group.rg.location
      account_tier             = "Standard"
      account_replication_type = "LRS"
    }
    
    resource "random_string" "batch_account_name" {
      length  = 8
      lower   = true
      numeric = false
      special = false
      upper   = false
    }
    
    resource "azurerm_batch_account" "example" {
      name                                = random_string.batch_account_name.result
      resource_group_name                 = azurerm_resource_group.rg.name
      location                            = azurerm_resource_group.rg.location
      storage_account_id                  = azurerm_storage_account.example.id
      storage_account_authentication_mode = "StorageKeys"
    }
    
    resource "random_pet" "azurerm_batch_pool_name" {
      prefix = "pool"
    }
    
    resource "azurerm_batch_pool" "fixed" {
      name                = "${random_pet.azurerm_batch_pool_name.id}-fixed-pool"
      resource_group_name = azurerm_resource_group.rg.name
      account_name        = azurerm_batch_account.example.name
      display_name        = "Fixed Scale Pool"
      vm_size             = "Standard_A1"
      node_agent_sku_id   = "batch.node.ubuntu 22.04"
    
      fixed_scale {
        target_dedicated_nodes = 2
        resize_timeout         = "PT15M"
      }
    
      storage_image_reference {
        publisher = "Canonical"
        offer     = "0001-com-ubuntu-server-jammy"
        sku       = "22_04-lts"
        version   = "latest"
      }
    
      start_task {
        command_line       = "echo 'Hello World from $env'"
        task_retry_maximum = 1
        wait_for_success   = true
    
        common_environment_properties = {
          env = "TEST"
        }
    
        user_identity {
          auto_user {
            elevation_level = "NonAdmin"
            scope           = "Task"
          }
        }
      }
    
      metadata = {
        "tagName" = "Example tag"
      }
    }
    
    resource "azurerm_batch_pool" "autopool" {
      name                = "${random_pet.azurerm_batch_pool_name.id}-autoscale-pool"
      resource_group_name = azurerm_resource_group.rg.name
      account_name        = azurerm_batch_account.example.name
      display_name        = "Auto Scale Pool"
      vm_size             = "Standard_A1"
      node_agent_sku_id   = "batch.node.ubuntu 22.04"
    
      auto_scale {
        evaluation_interval = "PT15M"
    
        formula = <<EOF
          startingNumberOfVMs = 1;
          maxNumberofVMs = 25;
          pendingTaskSamplePercent = $PendingTasks.GetSamplePercent(180 * TimeInterval_Second);
          pendingTaskSamples = pendingTaskSamplePercent < 70 ? startingNumberOfVMs : avg($PendingTasks.GetSample(180 * TimeInterval_Second));
          $TargetDedicatedNodes=min(maxNumberofVMs, pendingTaskSamples);
    EOF
      }
    
      storage_image_reference {
        publisher = "Canonical"
        offer     = "0001-com-ubuntu-server-jammy"
        sku       = "22_04-lts"
        version   = "latest"
      }
    }
    
  3. 이름이 지정된 outputs.tf파일을 만들고 다음 코드를 삽입합니다.

    output "resource_group_name" {
      value = azurerm_resource_group.rg.name
    }
    
    output "storage_account_name" {
      value = azurerm_storage_account.example.name
    }
    
    output "batch_account_name" {
      value = azurerm_batch_account.example.name
    }
    
    output "batch_pool_fixed_name" {
      value = azurerm_batch_pool.fixed.name
    }
    
    output "batch_pool_autopool_name" {
      value = azurerm_batch_pool.autopool.name
    }
    
  4. 이름이 지정된 providers.tf파일을 만들고 다음 코드를 삽입합니다.

    terraform {
      required_version = ">=1.0"
    
      required_providers {
        azurerm = {
          source  = "hashicorp/azurerm"
          version = "~>3.0"
        }
        random = {
          source  = "hashicorp/random"
          version = "~>3.0"
        }
      }
    }
    
    provider "azurerm" {
      features {}
    }
    
  5. 이름이 지정된 variables.tf파일을 만들고 다음 코드를 삽입합니다.

    variable "resource_group_location" {
      type        = string
      default     = "eastus"
      description = "Location of the resource group."
    }
    
    variable "resource_group_name_prefix" {
      type        = string
      default     = "rg"
      description = "Prefix of the resource group name that's combined with a random ID so name is unique in your Azure subscription."
    }
    

Terraform 초기화

terraform init를 실행하여 Terraform 배포를 초기화합니다. 이 명령은 Azure 리소스를 관리하는 데 필요한 Azure 공급자를 다운로드합니다.

terraform init -upgrade

주요 정보:

  • -upgrade 매개 변수는 필요한 공급자 플러그 인을 구성의 버전 제약 조건을 준수하는 최신 버전으로 업그레이드합니다.

Terraform 실행 계획 만들기

terraform plan을 실행하여 실행 계획을 만듭니다.

terraform plan -out main.tfplan

주요 정보:

  • terraform plan 명령은 실행 계획을 만들지만 실행하지는 않습니다. 대신 구성 파일에 지정된 구성을 만드는 데 필요한 작업을 결정합니다. 이 패턴을 사용하면 실제 리소스를 변경하기 전에 실행 계획이 예상과 일치하는지 확인할 수 있습니다.
  • 선택 사항인 -out 매개 변수를 사용하여 계획의 출력 파일을 지정할 수 있습니다. -out 매개 변수를 사용하면 검토한 계획이 정확하게 적용됩니다.

Terraform 실행 계획 적용

terraform apply를 실행하여 실행 계획을 클라우드 인프라에 적용합니다.

terraform apply main.tfplan

주요 정보:

  • 예시 terraform apply 명령은 이전에 terraform plan -out main.tfplan를 실행했다고 가정합니다.
  • -out 매개 변수에 다른 파일 이름을 지정한 경우 terraform apply에 대한 호출에서 동일한 파일 이름을 사용합니다.
  • -out 매개 변수를 사용하지 않은 경우 매개 변수 없이 terraform apply를 호출합니다.

결과 확인

Batch 계정을 보려면 실행 az batch account show 합니다.

az batch account show --name <batch_account_name> --resource-group <resource_group_name>

Batch 계정 <batch_account_name> 의 이름과 리소스 그룹의 이름으로 바꿉 <resource_group_name> 니다.

리소스 정리

Terraform을 통해 리소스를 만들 필요가 더 이상 없으면 다음 단계를 수행합니다.

  1. terraform 플랜을 실행하고 destroy 플래그를 지정합니다.

    terraform plan -destroy -out main.destroy.tfplan
    

    주요 정보:

    • terraform plan 명령은 실행 계획을 만들지만 실행하지는 않습니다. 대신 구성 파일에 지정된 구성을 만드는 데 필요한 작업을 결정합니다. 이 패턴을 사용하면 실제 리소스를 변경하기 전에 실행 계획이 예상과 일치하는지 확인할 수 있습니다.
    • 선택 사항인 -out 매개 변수를 사용하여 계획의 출력 파일을 지정할 수 있습니다. -out 매개 변수를 사용하면 검토한 계획이 정확하게 적용됩니다.
  2. terraform apply를 실행하여 실행 계획을 적용합니다.

    terraform apply main.destroy.tfplan
    

Azure의 Terraform 문제 해결

Azure에서 Terraform을 사용할 때 발생하는 일반적인 문제를 해결합니다.

다음 단계