이 빠른 시작에서는 Terraform을 사용하여 Azure Batch 계정, Azure Storage 계정 및 두 개의 Batch 풀을 만듭니다. Batch는 많은 컴퓨터에서 대량의 데이터 처리를 병렬화하고 분산하는 클라우드 기반 작업 예약 서비스입니다. 일반적으로 3D 그래픽 렌더링, 큰 데이터 세트 분석 또는 비디오 처리와 같은 작업에 사용됩니다. 이 경우 생성된 리소스에는 Batch 계정(분산 처리 작업을 위한 중앙 구성 엔터티), 처리할 데이터를 보관하기 위한 Storage 계정 및 태스크를 실행하는 가상 머신 그룹인 두 개의 Batch 풀이 포함됩니다.
Terraform 을 사용하면 클라우드 인프라의 정의, 미리 보기 및 배포가 가능합니다. Terraform을 사용하여 HCL 구문을 사용하여 구성 파일을 만듭니다. HCL 구문을 사용하면 클라우드 공급자(예: Azure) 그리고 클라우드 인프라를 구성하는 요소를 지정할 수 있습니다. 구성 파일을 만든 후에는 인프라 변경 내용을 배포하기 전에 미리 볼 수 있는 실행 계획을 만듭니다. 변경 내용을 확인 한 후에는 실행 계획을 적용하여 인프라를 배포합니다.
- Terraform의 필수 버전과 필요한 공급자를 지정합니다.
- 추가 기능 없이 Azure 공급자를 정의합니다.
- 리소스 그룹 위치 및 이름 접두사에 대한 변수를 정의합니다.
- Azure 리소스 그룹에 대한 임의 이름을 생성합니다.
- 지정된 위치에 생성된 이름을 사용하여 리소스 그룹을 만듭니다.
- Storage 계정 이름에 대한 임의의 문자열을 생성합니다.
- 생성된 리소스 그룹에 생성된 이름을 사용하여 Storage 계정을 만듭니다.
- Batch 계정 이름에 대한 임의의 문자열을 생성합니다.
- 생성된 리소스 그룹에서 생성된 이름을 사용하여 생성된 Storage 계정에 연결된 Batch 계정을 만듭니다.
- Batch 풀의 임의 이름을 생성합니다.
- 만든 리소스 그룹에서 고정된 크기 조정을 사용하여 Batch 풀을 만들고 만든 Batch 계정에 연결합니다.
- 만든 리소스 그룹에서 자동 크기 조정을 사용하여 Batch 풀을 만들고 만든 Batch 계정에 연결합니다.
- 만든 리소스 그룹, 스토리지 계정, Batch 계정 및 두 Batch 풀의 이름을 출력합니다.
필수 조건
- 활성 구독이 있는 Azure 계정을 만듭니다. 계정을 무료로 만들 수 있습니다.
- Terraform을 설치하고 구성합니다.
Terraform 코드 구현
참고 항목
이 문서의 샘플 코드는 Azure Terraform GitHub 리포지토리에 있습니다. 현재 및 이전 버전의 Terraform에서 테스트 결과를 포함하는 로그 파일을 볼 수 있습니다.
Terraform을 사용하여 Azure 리소스를 관리하는 방법을 보여 주는 더 많은 문서 및 샘플 코드를 참조하세요.
샘플 Terraform 코드를 테스트하고 실행할 디렉터리를 만들고 현재 디렉터리로 만듭니다.
이름이 지정된
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_D4_v3" 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_D4_v3" 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" } }이름이 지정된
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 }이름이 지정된
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 {} }이름이 지정된
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 계획을 실행하여 실행 계획을 만듭니다.
terraform plan -out main.tfplan
핵심 사항:
-
terraform plan명령은 실행 계획을 만들지만 실행하지는 않습니다. 대신 구성 파일에 지정된 구성을 만드는 데 필요한 작업을 결정합니다. 이 패턴을 사용하면 실제 리소스를 변경하기 전에 실행 계획이 예상과 일치하는지 확인할 수 있습니다. - 선택 사항인
-out매개 변수를 사용하여 계획의 출력 파일을 지정할 수 있습니다.-out매개 변수를 사용하면 검토한 계획이 정확하게 적용됩니다.
Terraform 실행 계획 적용
terraform 적용을 실행하여 클라우드 인프라에 실행 계획을 적용합니다.
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을 통해 리소스를 만들 필요가 더 이상 없으면 다음 단계를 수행합니다.
terraform 계획을 실행하고 플래그를 지정합니다
destroy.terraform plan -destroy -out main.destroy.tfplan핵심 사항:
-
terraform plan명령은 실행 계획을 만들지만 실행하지는 않습니다. 대신 구성 파일에 지정된 구성을 만드는 데 필요한 작업을 결정합니다. 이 패턴을 사용하면 실제 리소스를 변경하기 전에 실행 계획이 예상과 일치하는지 확인할 수 있습니다. - 선택 사항인
-out매개 변수를 사용하여 계획의 출력 파일을 지정할 수 있습니다.-out매개 변수를 사용하면 검토한 계획이 정확하게 적용됩니다.
-
terraform을 실행하여 실행 계획을 적용합니다.
terraform apply main.destroy.tfplan
Azure의 Terraform 문제 해결
Azure에서 Terraform을 사용할 때 발생하는 일반적인 문제를 해결합니다.