Mulai cepat: Menggunakan Terraform untuk membuat Azure IoT Device Provisioning Service
Dalam mulai cepat ini, Anda akan mempelajari cara menyebarkan sumber daya Azure IoT Hub Device Provisioning Service (DPS) dengan kebijakan alokasi yang di-hash menggunakan Terraform.
Mulai cepat ini diuji dengan versi penyedia Terraform dan Terraform berikut:
Terraform memungkinkan definisi, pratinjau, dan penyebaran infrastruktur cloud. Menggunakan Terraform, Anda membuat file konfigurasi menggunakan sintaksis HCL. Sintaks 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 untuk melihat pratinjau perubahan infrastruktur Anda sebelum disebarkan. Setelah memverifikasi perubahan, Anda menerapkan rencana eksekusi untuk menyebarkan infrastruktur.
Dalam artikel ini, Anda akan mempelajari cara:
- Membuat Akun Penyimpanan & Kontainer Penyimpanan
- Membuat Event Hubs, Namespace, & Aturan Otorisasi
- Membuat IoT Hub
- Menautkan IoT Hub ke titik akhir Akun Penyimpanan & titik akhir Azure Event Hubs
- Membuat Kebijakan Akses Bersama IoT Hub
- Membuat Sumber Daya DPS
- Menautkan DPS & IoT Hub
Prasyarat
- Langganan Azure: Jika Anda tidak memiliki langganan Azure, buat akun gratis sebelum memulai.
Menerapkan kode Terraform
Catatan
Contoh kode dalam artikel ini terletak di repo Azure Terraform GitHub. Lihat artikel dan kode sampel lainnya yang menunjukkan cara menggunakan Terraform untuk mengelola sumber daya Azure
Buat direktori untuk menguji dan menjalankan contoh kode Terraform dan menjadikannya direktori saat ini.
Buat file bernama
providers.tf
dan masukkan kode berikut:terraform { required_version = ">=1.0" required_providers { azurerm = { source = "hashicorp/azurerm" version = ">=3.0" } random = { source = "hashicorp/random" version = "~>3.0" } } } provider "azurerm" { features {} }
Buat file bernama
main.tf
dan masukkan kode berikut: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 } # Create storage account & container resource "random_string" "sa_name" { length = 12 special = false upper = false } resource "azurerm_storage_account" "sa" { name = random_string.sa_name.id resource_group_name = azurerm_resource_group.rg.name location = azurerm_resource_group.rg.location account_tier = "Standard" account_replication_type = "LRS" } resource "azurerm_storage_container" "my_terraform_container" { name = "mycontainer" storage_account_name = azurerm_storage_account.sa.name container_access_type = "private" } # Create an Event Hub & Authorization Rule resource "random_pet" "eventhub_namespace_name" { prefix = var.eventhub_namespace_name_prefix } resource "azurerm_eventhub_namespace" "namespace" { name = random_pet.eventhub_namespace_name.id resource_group_name = azurerm_resource_group.rg.name location = azurerm_resource_group.rg.location sku = "Basic" } resource "azurerm_eventhub" "my_terraform_eventhub" { name = "myEventHub" resource_group_name = azurerm_resource_group.rg.name namespace_name = azurerm_eventhub_namespace.namespace.name partition_count = 2 message_retention = 1 } resource "azurerm_eventhub_authorization_rule" "my_terraform_authorization_rule" { resource_group_name = azurerm_resource_group.rg.name namespace_name = azurerm_eventhub_namespace.namespace.name eventhub_name = azurerm_eventhub.my_terraform_eventhub.name name = "acctest" send = true } # Create an IoT Hub resource "random_pet" "iothub_name" { prefix = var.iothub_name_prefix length = 1 } resource "azurerm_iothub" "iothub" { name = random_pet.iothub_name.id resource_group_name = azurerm_resource_group.rg.name location = azurerm_resource_group.rg.location sku { name = "S1" capacity = 1 } endpoint { type = "AzureIotHub.StorageContainer" connection_string = azurerm_storage_account.sa.primary_blob_connection_string name = "export" batch_frequency_in_seconds = 60 max_chunk_size_in_bytes = 10485760 container_name = azurerm_storage_container.my_terraform_container.name encoding = "Avro" file_name_format = "{iothub}/{partition}_{YYYY}_{MM}_{DD}_{HH}_{mm}" } endpoint { type = "AzureIotHub.EventHub" connection_string = azurerm_eventhub_authorization_rule.my_terraform_authorization_rule.primary_connection_string name = "export2" } route { name = "export" source = "DeviceMessages" condition = "true" endpoint_names = ["export"] enabled = true } route { name = "export2" source = "DeviceMessages" condition = "true" endpoint_names = ["export2"] enabled = true } enrichment { key = "tenant" value = "$twin.tags.Tenant" endpoint_names = ["export", "export2"] } cloud_to_device { max_delivery_count = 30 default_ttl = "PT1H" feedback { time_to_live = "PT1H10M" max_delivery_count = 15 lock_duration = "PT30S" } } tags = { purpose = "testing" } } #Create IoT Hub Access Policy resource "azurerm_iothub_shared_access_policy" "hub_access_policy" { name = "terraform-policy" resource_group_name = azurerm_resource_group.rg.name iothub_name = azurerm_iothub.iothub.name registry_read = true registry_write = true service_connect = true } # Create IoT Hub DPS resource "random_pet" "dps_name" { prefix = var.dps_name_prefix length = 1 } resource "azurerm_iothub_dps" "dps" { name = random_pet.dps_name.id resource_group_name = azurerm_resource_group.rg.name location = azurerm_resource_group.rg.location allocation_policy = "Hashed" sku { name = "S1" capacity = 1 } linked_hub { connection_string = azurerm_iothub_shared_access_policy.hub_access_policy.primary_connection_string location = azurerm_resource_group.rg.location allocation_weight = 150 apply_allocation_policy = true } }
Buat file bernama
variables.tf
dan masukkan kode berikut:variable "resource_group_location" { default = "eastus" description = "Location of the resource group." } variable "resource_group_name_prefix" { default = "rg" description = "Prefix of the resource group name that's combined with a random ID so name is unique in your Azure subscription." } variable "eventhub_namespace_name_prefix" { default = "namespace" description = "Prefix of the event hub namespace name that's combined with a random ID so name is unique in your Azure subscription." } variable "iothub_name_prefix" { default = "iothub" description = "Prefix of the iot hub name that's combined with a random ID so name is unique in your Azure subscription." } variable "dps_name_prefix" { default = "dps" description = "Prefix of the dps name that's combined with a random ID so name is unique in your Azure subscription." }
Buat file bernama
outputs.tf
dan masukkan kode berikut:output "azurerm_iothub_name" { value = azurerm_iothub.iothub.name } output "azurerm_iothub_dps_name" { value = azurerm_iothub_dps.dps.name } output "resource_group_name" { value = azurerm_resource_group.rg.name }
Inisialisasi Terraform
Jalankan terraform init untuk menginisialisasi penyebaran Terraform. Perintah ini mengunduh penyedia Azure yang diperlukan untuk mengelola sumber daya Azure Anda.
terraform init -upgrade
Poin utama:
- Parameter
-upgrade
meningkatkan plugin penyedia yang diperlukan ke versi terbaru yang sesuai dengan batasan versi konfigurasi.
Buat rencana eksekusi Terraform
Jalankan terraform plan untuk membuat rencana eksekusi.
terraform plan -out main.tfplan
Poin utama:
- Perintah
terraform plan
membuat rencana eksekusi, tetapi tidak menjalankannya. Perintah ini justru menentukan tindakan yang diperlukan untuk membuat konfigurasi yang ditentukan dalam file konfigurasi Anda. Pola ini memungkinkan Anda memastikan apakah rencana eksekusi telah sesuai dengan ekspektasi Anda sebelum membuat perubahan pada sumber daya aktual. - Parameter
-out
opsional memungkinkan Anda menentukan file output untuk rencana. Menggunakan parameter-out
memastikan bahwa rencana yang Anda tinjau benar-benar sesuai dengan yang diterapkan.
Terapkan rencana eksekusi Terraform
Jalankan terraform apply untuk menerapkan rencana eksekusi ke infrastruktur cloud Anda.
terraform apply main.tfplan
Poin utama:
- Contoh
terraform apply
perintah mengasumsikan Anda sebelumnya menjalankanterraform plan -out main.tfplan
. - Jika Anda menentukan nama file yang berbeda untuk parameter
-out
, gunakan nama file yang sama dalam panggilan keterraform apply
. - Jika Anda tidak menggunakan parameter
-out
, panggilterraform apply
tanpa parameter apa pun.
Memverifikasi hasil
Jalankan az iot dps show untuk menampilkan sumber daya Azure DPS.
az iot dps show \
--name <azurerm_iothub_dps_name> \
--resource-group <resource_group_name>
Poin utama:
- Nama grup sumber daya dan instans DPS ditampilkan dalam
terraform apply
output. Anda juga dapat menjalankan output terraform untuk melihat nilai output ini.
Membersihkan sumber daya
Ketika Anda tidak lagi membutuhkan sumber daya yang dibuat melalui Terraform, lakukan langkah-langkah berikut:
Jalankan terraform plan dan tentukan bendera
destroy
.terraform plan -destroy -out main.destroy.tfplan
Poin utama:
- Perintah
terraform plan
membuat rencana eksekusi, tetapi tidak menjalankannya. Perintah ini justru menentukan tindakan yang diperlukan untuk membuat konfigurasi yang ditentukan dalam file konfigurasi Anda. Pola ini memungkinkan Anda memastikan apakah rencana eksekusi telah sesuai dengan ekspektasi Anda sebelum membuat perubahan pada sumber daya aktual. - Parameter
-out
opsional memungkinkan Anda menentukan file output untuk rencana. Menggunakan parameter-out
memastikan bahwa rencana yang Anda tinjau benar-benar sesuai dengan yang diterapkan.
- Perintah
Jalankan terraform apply untuk menerapkan rencana eksekusi.
terraform apply main.destroy.tfplan
Memecahkan masalah Terraform pada Azure
Memecahkan masalah umum saat menggunakan Terraform di Azure
Langkah berikutnya
Dalam mulai cepat ini, Anda menyebarkan hub IoT dan instans Device Provisioning Service, dan menautkan dua sumber daya. Untuk mempelajari cara menggunakan penyetelan ini untuk provisikan perangkat, lanjutkan ke mulai cepat untuk membuat perangkat.