다음을 통해 공유


Terraform AzAPI 공급자 개요

AzAPI 공급자는 Azure ARM REST API 위에 있는 얇은 계층입니다. API 버전을 사용하여 모든 Azure 리소스 유형을 관리할 수 있으므로 Azure 내에서 최신 기능을 활용할 수 있습니다. AzAPI는 자체적으로 또는 AzureRM 공급자와 함께 사용하도록 설계된 일류 공급자입니다.

AzAPI 공급자 사용의 이점

AzAPI 공급자는 다음과 같은 이점을 제공합니다.

  • 모든 Azure 컨트롤 플레인 서비스를 지원합니다.
    • 서비스 및 기능 미리 보기
    • 모든 API 버전
  • 전체 Terraform 상태 파일 충실도
    • 속성과 값이 상태에 저장됩니다
  • Swagger에 대한 종속성 없음
  • 일반적이고 일관된 Azure 인증
  • 기본 제공 프리플라이트 유효성 검사
  • 인프라 개발에 대한 세부적인 제어
  • 강력한 VS Code 확장

리소스

업데이트를 요구하지 않고 모든 Azure 리소스 및 기능을 관리할 수 있도록 AzAPI 공급자는 다음과 같은 일반 리소스를 포함합니다.

리소스 이름 설명
azapi_resource 전체 CRUD를 사용하여 Azure(컨트롤 플레인) 리소스(API)를 완전히 관리하는 데 사용됩니다.
   예제 사용 사례:
      새 미리 보기 서비스
      기존 서비스에 추가된 새 기능
      현재 다루지 않는 기존 기능/서비스
azapi_update_resource 전체 CRUD가 없는 리소스 또는 리소스의 일부를 관리하는 데 사용됩니다.
   예제 사용 사례:
      기존 서비스의 새 속성 업데이트
      DNS SOA 레코드와 같이 미리 만든 자식 리소스를 업데이트합니다.
azapi_resource_action 리소스의 수명 주기를 관리하지 않고 리소스에 대해 단일 작업을 수행하는 데 사용됩니다.
   예제 사용 사례:
      가상 머신을 종료하다
      Key Vault에 비밀 추가
azapi_data_plane_resource Azure 데이터 평면 리소스의 특정 하위 집합 을 관리하는 데 사용됩니다.
   예제 사용 사례:
      KeyVault 인증서 연락처
      Synapse 작업 영역 라이브러리

사용 계층 구조

전반적으로 사용량은 다음 단계를 따라야 합니다.

  1. 가능한 많은 작업을 azapi_resource 내에서 수행하는 것으로 시작하는 것이 항상 좋습니다.
  2. 리소스 타입이 azapi_resource 에 존재하지 않지만 azapi_data_plane_resource에서 지원하는 타입 중 하나에 속하는 경우, 그렇다면 그것을 대신 사용합니다.
  3. 리소스가 이미 AzureRM에 있거나 내에서 azapi_resource액세스할 수 없는 속성이 있는 경우 이러한 특정 속성에 액세스하는 데 사용합니다 azapi_update_resource . azapi_resource 또는 azapi_data_plane_resource이 지원하지 않는 리소스는 이 리소스를 통해 업데이트할 수 없습니다.
  4. Azure CRUD 친화적인 리소스에 기반하지 않은 작업을 수행하려는 경우, azapi_resource_actionazapi_update_resource보다 덜 간단하지만 더 유연합니다.

리소스 구성 예제

다음 코드 조각은 AzureRM 공급자에 현재 존재하지 않는 리소스를 구성합니다.

resource "azapi_resource" "publicip" {
  type      = "Microsoft.Network/Customipprefixes@2021-03-01"
  name      = "exfullrange"
  parent_id = azurerm_resource_group.example.id
  location  = "westus2"

  body = {
    properties = {
      cidr          = "10.0.0.0/24"
      signedMessage = "Sample Message for WAN"
    }
  }
}

다음 코드 조각은 AzureRM의 기존 리소스에 대한 미리 보기 속성을 구성합니다.

resource "azapi_update_resource" "test" {
  type        = "Microsoft.ContainerRegistry/registries@2020-11-01-preview"
  resource_id = azurerm_container_registry.acr.id

  body = {
    properties = {
      anonymousPullEnabled = var.bool_anonymous_pull
    }
  }
}

다음 코드 조각은 기존 AzureRM 리소스에 대한 리소스 작업을 구성합니다.

resource "azapi_resource_action" "vm_shutdown" {
  type = "Microsoft.Compute/virtualMachines@2023-07-01"
  resource_id = azurerm_linux_virtual_machine.example.id
  action = "powerOff”
}

다음 코드 조각은 데이터 평면에서 프로비전되어 AzureRM 공급자에 현재 존재하지 않는 리소스를 구성합니다.

resource "azapi_data_plane_resource" "dataset" {
  type      = "Microsoft.Synapse/workspaces/datasets@2020-12-01"
  parent_id = trimprefix(data.azurerm_synapse_workspace.example.connectivity_endpoints.dev, "https://")
  name      = "example-dataset"
  body = {
    properties = {
      type = "AzureBlob",
      typeProperties = {
        folderPath = {
          value = "@dataset().MyFolderPath"
          type  = "Expression"
        }
        fileName = {
          value = "@dataset().MyFileName"
          type  = "Expression"
        }
        format = {
          type = "TextFormat"
        }
      }
      parameters = {
        MyFolderPath = {
          type = "String"
        }
        MyFileName = {
          type = "String"
        }
      }
    }
  }
}

실행 전 사용 예제

AzAPI의 기본 제공 실행 전 유효성 검사로 인해 terraform plan 동안 다음 코드 조각 오류가 발생합니다.

provider "azapi" {
  enable_preflight = true
}
resource "azapi_resource" "vnet" {
  type      = "Microsoft.Network/virtualNetworks@2024-01-01"
  parent_id = azapi_resource.resourceGroup.id
  name      = "example-vnet"
  location  = "westus"
  body = {
    properties = {
      addressSpace = {
        addressPrefixes = [
          "10.0.0.0/160", # preflight will throw an error here
        ]
      }
    }
  }
}

Preflight는 공급자 플래그 뒤에 숨겨져 있지만, plan 단계에서 오류를 발생시키는 데 도움이 됩니다.

데이터 원본

AzAPI 공급자는 다음과 같은 다양한 유용한 데이터 원본을 지원합니다.

데이터 원본 이름 설명
azapi_resource Azure(컨트롤 플레인) 리소스(API)에서 정보를 읽는 데 사용됩니다.
   예제 사용 사례:
      새 미리 보기 서비스
      기존 서비스에 추가된 새 기능
      현재 다루지 않는 기존 기능/서비스
azapi_client_config 구독 ID 및 테넌트 ID와 같은 클라이언트 정보에 액세스합니다.
azapi_resource_action 리소스의 수명 주기를 관리하지 않고 리소스에서 단일 읽기 작업을 수행하는 데 사용됩니다.
   예제 사용 사례:
      키 목록
      VM의 읽기 상태
azapi_data_plane_resource Azure 데이터 평면 리소스의 특정 하위 집합 액세스하는 데 사용됩니다.
   예제 사용 사례:
      KeyVault 인증서 연락처
      Synapse 작업 영역 라이브러리
azapi_resource_id 구독 ID, 부모 ID, 리소스 그룹 이름 및 리소스 이름과 같은 정보를 출력하는 기능을 사용하여 리소스의 리소스 ID에 액세스합니다.
azapi_resource_list 지정된 부모 리소스 ID 아래에 모든 리소스를 나열합니다.
   예제 사용 사례:
      구독/리소스 그룹 아래의 리소스
      가상 네트워크 아래의 서브넷

AzAPI 공급자를 사용한 인증

AzAPI 공급자는 AzureRM 공급자와 동일한 인증 방법을 사용하도록 설정합니다. 인증 옵션에 대한 자세한 내용은 Azure에 Terraform 인증을 참조하세요.

AzAPI 공급자의 환경 및 수명 주기

이 섹션에서는 AzAPI 공급자를 사용하는 데 도움이 되는 몇 가지 도구에 대해 설명합니다.

VS Code 확장 및 언어 서버

AzAPI VS Code 확장다음과 같은 이점을 통해 풍부한 제작 환경을 제공합니다.

  • 사용 가능한 모든 리소스 종류 및 API 버전을 나열합니다. 사용 가능한 모든 리소스 종류 나열
  • 모든 리소스에 대해 허용되는 속성 및 값의 자동 완성입니다. 허용되는 속성 나열
  • 속성을 마우스로 가리킬 때 힌트를 표시합니다. 속성을 마우스로 가리킬 때 힌트 표시
  • 구문 유효성 검사 구문 유효성 검사
  • 코드 샘플을 사용하여 자동 완성 코드 샘플을 사용하여 자동 완성

aztfmigrate 마이그레이션 도구

aztfmigrate 도구 AzAPI와 AzureRM 공급자 간에 기존 리소스를 마이그레이션할 수 있도록 설계되었습니다.

aztfmigrate 계획 및 마이그레이션의 두 가지 모드가 있습니다.

  • 계획은 마이그레이션할 수 있는 AzAPI 리소스를 표시합니다.
  • AzAPI 리소스를 HCL 파일과 상태 모두에서 AzureRM 리소스로 마이그레이션합니다.

aztfmigrate 마이그레이션 후에 Terraform 구성 및 상태가 실제 상태에 맞춰지도록 합니다. 마이그레이션을 완료한 후 실행 terraform plan 하여 상태 업데이트의 유효성을 검사하여 변경된 내용이 없는지 확인할 수 있습니다.

인프라에 대한 세분화된 컨트롤

AzAPI의 주요 이점 중 하나는 올바른 디자인 패턴에 맞게 구성을 미세 조정하는 기능입니다. 이 작업을 수행할 수 있는 방법에는 여러 가지가 있습니다.

공급자 함수

AzAPI(v2.0 이상)에는 다음과 같은 다양한 공급자 함수가있습니다.

함수 이름 설명
build_resource_id 부모 ID, 리소스 종류 및 리소스 이름이 지정된 Azure 리소스 ID를 생성합니다.
특정 범위 내에서 최상위 및 중첩된 리소스에 대한 리소스 ID를 만드는 데 유용합니다.
extension_resource_id 기본 리소스 ID, 리소스 종류 및 추가 리소스 이름이 지정된 Azure 확장 리소스 ID를 생성합니다.
management_group_resource_id 관리 그룹 이름, 리소스 종류 및 리소스 이름을 지정하여 Azure 관리 그룹 범위 리소스 ID를 생성합니다.
parse_resource_id 이 함수는 Azure 리소스 ID 및 리소스 유형을 사용하고 ID를 구독 ID, 리소스 그룹 이름, 공급자 네임스페이스 및 기타 부분과 같은 개별 구성 요소로 구문 분석합니다.
resource_group_resource_id 구독 ID, 리소스 그룹 이름, 리소스 종류 및 리소스 이름을 지정하여 Azure 리소스 그룹 범위 리소스 ID를 생성합니다.
subscription_resource_id 구독 ID, 리소스 종류 및 리소스 이름이 지정된 Azure 구독 범위 리소스 ID를 생성합니다.
tenant_resource_id 리소스 종류 및 리소스 이름을 지정하여 Azure 테넌트 범위 리소스 ID를 생성합니다.

retry 블록을 사용하여 사용자 정의 다시 시도 가능한 오류

AzAPI 공급자는 retry 블록을 통해 예상되는 경우에 오류를 처리할 수 있습니다. 예를 들어 리소스 만들기 시간 제한 문제가 발생할 수 있는 경우 다음 코드 블록이 도움이 될 수 있습니다.

resource "azapi_resource" "example" {
    # usual properties
    retry {
        interval_seconds     = 5
        randomization_factor = 0.5 # adds randomization to retry pattern
        multiplier           = 2 # if try fails, multiplies time between next try by this much
        error_message_regex  = ["ResourceNotFound"]
    }
    timeouts {
        create = "10m"
}

리소스 교체를 위한 트리거

AzAPI 공급자를 사용하면 리소스 교체를 위한 매개 변수를 구성할 수 있습니다.

replace_triggers_external_values

값이 변경되면 리소스를 바꿉니다. 예를 들어 SKU 또는 영역 변수를 수정해야 하는 경우 이 리소스가 다시 만들어집니다.

resource "azapi_resource" "example" {
  name      = var.name
  type      = "Microsoft.Network/publicIPAddresses@2023-11-01"
  parent_id = "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/example"
  body      = properties = {
    sku   = var.sku
    zones = var.zones
  }
  replace_triggers_external_values = [
    var.sku,
    var.zones,
  ]
}

이 작업은 정의의 속성이 변경되는 경우 정책 할당과 같은 광범위한 리소스 집합에서 작동할 수 있습니다.

replace_triggers_refs

참조된 값이 변경되면 리소스를 바꿉니다. 예를 들어 SKU 이름 또는 계층이 수정된 경우 이 리소스가 다시 만들어집니다.

resource "azapi_resource" "example" {
  type      = "Microsoft.Relay/namespaces@2021-11-01"
  parent_id = azurerm_resource_group.example.id
  name      = "xxx"
  location  = "westus"
  body = {
    properties = {
    }
    sku = {
      name = "Standard"
      tier = "Standard"
    }
  }

  replace_triggers_refs = ["sku"]
}

다른 리소스의 SKU가 변경될 경우 교체가 트리거되지 않습니다.

다음 단계