Panduan Cepat: Daftar sumber daya Azure dengan penyedia AzAPI Terraform

Terraform memungkinkan definisi, pratinjau, dan penyebaran infrastruktur cloud. Dengan menggunakan Terraform, Anda membuat file konfigurasi menggunakan sintaks HCL. Sintaksis HCL memungkinkan Anda menentukan penyedia cloud - seperti Azure - dan elemen yang membentuk infrastruktur cloud Anda. Setelah membuat file konfigurasi, Anda membuat rencana eksekusi yang memungkinkan Anda mempratinjau perubahan infrastruktur sebelum disebarkan. Setelah memverifikasi perubahan, Anda menerapkan rencana eksekusi untuk menyebarkan infrastruktur.

Dalam artikel ini, Anda menggunakan sumber data azapi_resource_list untuk mencantumkan sumber daya Azure dan memfilter hasil dengan ekspresi JMESPath. Anda membuat dua akun penyimpanan, lalu menggunakan azapi_resource_list untuk mencantumkan dan mengekstrak propertinya.

  • Membuat grup sumber daya dan dua akun penyimpanan dengan penyedia AzureRM
  • Gunakan azapi_resource_list untuk mencantumkan akun penyimpanan dan mengekstrak nama dan lokasinya menggunakan JMESPath

Prasyarat

  • Langganan Azure: Jika Anda tidak memiliki langganan Azure, buat akun gratis sebelum memulai.

Saat Anda masuk ke portal Microsoft Azure dengan akun Microsoft, langganan Azure default untuk akun tersebut digunakan.

Terraform secara otomatis mengautentikasi menggunakan informasi dari langganan Azure default.

Jalankan az account show untuk memverifikasi akun Microsoft dan langganan Azure saat ini.

az account show

Setiap perubahan yang Anda buat melalui Terraform ada di langganan Azure yang ditampilkan. Jika itu yang Anda inginkan, lewati sisa artikel ini.

Mengerti response_export_values

Atribut response_export_values mengontrol properti mana yang diekstrak dari respons API dan tersedia dalam output atribut sumber data. Ini menerima daftar atau peta:

  • Daftar: Menentukan jalur JSON yang akan diekstrak. Gunakan ["*"] untuk mengekspor isi respons penuh.
  • Peta: Menggunakan ekspresi JMESPath untuk memfilter dan membentuk ulang respons. Kuncinya adalah nama hasilnya, dan nilainya adalah ekspresi JMESPath.

Formulir peta lebih disukai ketika Anda perlu mengekstrak bidang tertentu atau mengubah respons daftar, karena menghasilkan nilai output yang lebih bersih dan lebih dapat digunakan.

Menerapkan kode Terraform

  1. Buat direktori untuk menguji sampel kode Terraform dan menjadikannya direktori saat ini.

  2. Buat file bernama providers.tf dan masukkan kode berikut:

    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. Buat file bernama variables.tf dan masukkan kode berikut:

    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."
    }
    
  4. Buat file bernama main.tf dan masukkan kode berikut:

    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" {
      count                    = 2
      name                     = "st${random_string.storage_suffix.result}${count.index}"
      resource_group_name      = azurerm_resource_group.example.name
      location                 = azurerm_resource_group.example.location
      account_tier             = "Standard"
      account_replication_type = "LRS"
    }
    

Jalankan terraform init untuk menginisialisasi implementasi Terraform. Perintah ini mengunduh penyedia Azure yang diperlukan untuk mengelola sumber daya Azure Anda.

terraform init -upgrade

Poin-poin penting:

  • Parameter -upgrade meningkatkan plugin penyedia yang diperlukan ke versi terbaru yang sesuai dengan batasan versi konfigurasi.

Jalankan terraform plan untuk membuat rencana pelaksanaan.

terraform plan -out main.tfplan

Poin-poin penting:

  • Perintah terraform plan membuat rencana eksekusi, tetapi tidak menjalankannya. Sebaliknya, ini menentukan tindakan apa yang diperlukan untuk membuat konfigurasi yang ditentukan dalam file konfigurasi Anda. Pola ini memungkinkan Anda untuk memverifikasi apakah rencana eksekusi sesuai dengan harapan Anda sebelum membuat perubahan apa pun pada sumber daya aktual.
  • Parameter opsional -out memungkinkan Anda menentukan file output untuk rencana. Menggunakan parameter -out memastikan bahwa rencana yang Anda tinjau benar-benar sesuai dengan yang diterapkan.

Untuk menerapkan rencana eksekusi pada infrastruktur cloud Anda, jalankan terraform apply.

terraform apply main.tfplan

Poin-poin penting:

  • Contoh perintah terraform apply mengasumsikan Anda sebelumnya menjalankan terraform plan -out main.tfplan.
  • Jika Anda menentukan nama file yang berbeda untuk parameter -out, gunakan nama file yang sama dalam panggilan ke terraform apply.
  • Jika Anda tidak menggunakan parameter -out, panggil terraform apply tanpa parameter apa pun.

Mencantumkan sumber daya dengan azapi_resource_list

Sekarang setelah akun penyimpanan dibuat, tambahkan sumber data untuk mencantumkannya dan mengekstrak properti menggunakan JMESPath.

  1. Buat file bernama list_resources.tf dan masukkan kode berikut:

    data "azapi_resource_list" "storage_accounts" {
      type      = "Microsoft.Storage/storageAccounts@2023-01-01"
      parent_id = azurerm_resource_group.example.id
    
      # Use JMESPath expressions to extract specific fields from the response.
      # The API returns a list of resources in a top-level "value" array.
      response_export_values = {
        "names"     = "value[].name"
        "locations" = "value[].location"
        "skus"      = "value[].sku.name"
      }
    }
    
  2. Buat file bernama outputs.tf dan masukkan kode berikut:

    output "resource_group_name" {
      value = azurerm_resource_group.example.name
    }
    
    output "storage_account_names" {
      value = data.azapi_resource_list.storage_accounts.output.names
    }
    
    output "storage_account_locations" {
      value = data.azapi_resource_list.storage_accounts.output.locations
    }
    
    output "storage_account_skus" {
      value = data.azapi_resource_list.storage_accounts.output.skus
    }
    
  3. Jalankan terraform apply lagi untuk membuat sumber data dan mengekstrak output:

    terraform apply
    

Poin-poin penting tentang azapi_resource_list

  • Bidang type mengidentifikasi jenis sumber daya dan versi API yang akan dicantumkan.
  • Bidang parent_id mengatur cakupan: ID grup sumber daya untuk dicantumkan dalam grup sumber daya, ID langganan untuk dicantumkan di seluruh langganan, atau ID sumber daya induk untuk mencantumkan sumber daya anak (misalnya, subnet di bawah VNet).
  • Bentuk response_export_values peta menggunakan ekspresi JMESPath terhadap respons API mentah. API untuk daftar akun penyimpanan menghasilkan hasil di dalam array tingkat atas value, sehingga ekspresi dimulai dengan value[].

Mencantumkan sumber daya pada cakupan yang berbeda

parent_id menentukan cakupan daftar. Examples:

# List all storage accounts in a subscription
data "azapi_resource_list" "all_storage" {
  type      = "Microsoft.Storage/storageAccounts@2023-01-01"
  parent_id = "/subscriptions/${var.subscription_id}"
  response_export_values = {
    "names" = "value[].name"
  }
}

# List subnets in a virtual network (child resource listing)
data "azapi_resource_list" "subnets" {
  type      = "Microsoft.Network/virtualNetworks/subnets@2023-11-01"
  parent_id = azurerm_virtual_network.example.id
  response_export_values = ["*"]
}

Membersihkan sumber daya

Saat Anda tidak lagi memerlukan sumber daya yang dibuat melalui Terraform, lakukan langkah-langkah berikut:

  1. Jalankan terraform plan dan tentukan flag destroy.

    terraform plan -destroy -out main.destroy.tfplan
    

    Poin-poin penting:

    • Perintah terraform plan membuat rencana eksekusi, tetapi tidak menjalankannya. Sebaliknya, ini menentukan tindakan apa yang diperlukan untuk membuat konfigurasi yang ditentukan dalam file konfigurasi Anda. Pola ini memungkinkan Anda untuk memverifikasi apakah rencana eksekusi sesuai dengan harapan Anda sebelum membuat perubahan apa pun pada sumber daya aktual.
    • Parameter opsional -out memungkinkan Anda menentukan file output untuk rencana. Menggunakan parameter -out memastikan bahwa rencana yang Anda tinjau benar-benar sesuai dengan yang diterapkan.
  2. Jalankan terraform apply untuk menerapkan rencana pelaksanaan.

    terraform apply main.destroy.tfplan
    

Memecahkan masalah Terraform di Azure

Menangani masalah umum saat menggunakan Terraform di Azure

Langkah berikutnya