빠른 시작: AzAPI Terraform 공급자를 사용하여 Azure 리소스 작업 수행

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

관리되는 Terraform 리소스로 azapi_resource_action 사용하여 Azure 리소스에 대해 명령적 상태 변경 작업을 수행합니다. 이 예제에서는 Azure 스토리지 계정을 만든 다음 해당 액세스 키를 회전합니다.

azapi_resource_action 에는 다음 두 가지 사용 양식이 있습니다.

  • 리소스: 상태를 변경하는 작업을 수행하는 동안terraform apply. Terraform은 상태에서 작업을 추적하고, 필요에 따라 해당 작업을 반대로 실행할 수 있습니다.
  • 데이터 원본: 계획 중에 읽기 전용 작업을 수행합니다. 해당 시나리오에 대한 리소스 작업 데이터 원본 빠른 시작을 참조하세요.

표준 만들기/읽기/업데이트/삭제 수명 주기(예: 자격 증명 회전, VM 시작 또는 중지 또는 장애 조치 트리거)를 기반으로 하지 않는 Azure 작업을 수행하려면 Terraform이 필요한 경우 리소스 양식을 사용합니다.

  • AzureRM 공급자를 사용하여 스토리지 계정 만들기
  • azapi_resource_action를 사용하여 스토리지 계정 액세스 키를 회전시키십시오.

사전 요구 사항

  • Azure 구독: Azure 구독이 아직 없는 경우 시작하기 전에 체험 계정을 만듭니다.

Microsoft 계정으로 Azure Portal에 로그인하면 해당 계정에 대한 기본 Azure 구독이 사용됩니다.

Terraform은 기본 Azure 구독의 정보를 사용하여 자동으로 인증합니다.

az account show를 실행하여 현재 Microsoft 계정 및 Azure 구독을 확인합니다.

az account show

Terraform을 통해 변경한 내용은 표시된 Azure 구독에 있습니다. 그것이 당신이 원하는 것이라면, 이 글의 나머지 부분을 건너뛰세요.

Terraform 코드 구현

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

  2. providers.tf라는 파일을 만들고 다음 코드를 삽입합니다.

    terraform {
      required_providers {
        azapi = {
          source  = "Azure/azapi"
          version = "~> 2.0"
        }
        azurerm = {
          source  = "hashicorp/azurerm"
          version = "~> 4.0"
        }
        random = {
          source  = "hashicorp/random"
          version = "~> 3.0"
        }
      }
    }
    
    provider "azurerm" {
      features {}
    }
    
    provider "azapi" {}
    
  3. 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 value to create a unique name."
    }
    
    variable "storage_account_name_prefix" {
      type        = string
      default     = "st"
      description = "Prefix of the storage account name that's combined with a random value to create a unique name."
    }
    
  4. main.tf라는 파일을 만들고 다음 코드를 삽입합니다.

    resource "random_pet" "rg_name" {
      prefix = var.resource_group_name_prefix
    }
    
    resource "random_string" "storage_suffix" {
      length  = 8
      upper   = false
      special = false
    }
    
    resource "azurerm_resource_group" "example" {
      location = var.resource_group_location
      name     = random_pet.rg_name.id
    }
    
    resource "azurerm_storage_account" "example" {
      name                     = "${var.storage_account_name_prefix}${random_string.storage_suffix.result}"
      resource_group_name      = azurerm_resource_group.example.name
      location                 = azurerm_resource_group.example.location
      account_tier             = "Standard"
      account_replication_type = "LRS"
    }
    
    resource "azapi_resource_action" "regenerate_key" {
      type        = "Microsoft.Storage/storageAccounts@2023-01-01"
      resource_id = azurerm_storage_account.example.id
      action      = "regenerateKey"
      method      = "POST"
    
      body = {
        keyName = "key1"
      }
    }
    

    리소스로 사용하는 azapi_resource_action 방법에 대한 핵심 사항은 다음과 같습니다.

    • action 필드는 수행할 ARM 작업을 지정합니다. 스토리지 계정 키 회전을 위해 regenerateKey를 사용하십시오.
    • method 필드는 HTTP 메서드를 지정합니다. 대부분의 명령적 작업은 .를 사용합니다 POST.
    • 이 특성은 body 액션에 데이터를 전달합니다. 키 다시 생성의 경우 회전할 키(key1 또는 key2)를 지정합니다.
    • 작업은 terraform apply 동안 수행되고 Terraform 상태에 추적됩니다.
  5. outputs.tf라는 파일을 만들고 다음 코드를 삽입합니다.

    output "resource_group_name" {
      value = azurerm_resource_group.example.name
    }
    
    output "storage_account_name" {
      value = azurerm_storage_account.example.name
    }
    

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

terraform init -upgrade

핵심 사항:

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

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

terraform plan -out main.tfplan

핵심 사항:

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

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

terraform apply main.tfplan

핵심 사항:

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

결과 확인

terraform apply 완료되면 스토리지 계정 키가 회전됩니다. Azure 스토리지 계정 키를 확인하여 키 회전을 확인할 수 있습니다.

az storage account keys list를 실행하여 스토리지 계정 키를 봅니다.

az storage account keys list \
  --resource-group <resource_group_name> \
  --account-name <storage_account_name>

필드에 현재 value 키가 표시됩니다.

다른 리소스 작업의 예

azapi_resource_action 리소스는 많은 Azure 작업에서 작동합니다. 일반적인 예는 다음과 같습니다.

  • Virtual Machines: deallocate, start, restart, powerOff, reimage
  • 키 자격 증명 모음: purge (일시 삭제된 키 자격 증명 모음의 경우), rotate (관리되는 키의 경우)
  • App Services: swap (배포 슬롯의 경우), restart
  • 데이터베이스: failover, promote
  • 컴퓨트 리소스: 리소스를 만들거나 삭제하지 않고 상태를 수정하는 Azure REST API에 의해 노출되는 모든 작업

자원을 정리하세요

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을 사용할 때 발생하는 일반적인 문제 해결

다음 단계