Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Dalam panduan memulai cepat ini, Anda menggunakan Terraform untuk penyebaran Azure Firewall dengan beberapa alamat IP publik dari rentang alamat IP publik. Firewall yang disebarkan memiliki koleksi aturan NAT yang memungkinkan koneksi RDP ke dua mesin virtual Windows Server 2019.
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.
Untuk informasi selengkapnya tentang Azure Firewall dengan beberapa alamat IP publik, lihat Menyebarkan Azure Firewall dengan beberapa alamat IP publik menggunakan Azure PowerShell.
Dalam artikel ini, Anda akan mempelajari cara:
- Membuat nilai acak (untuk digunakan dalam nama grup sumber daya) menggunakan random_pet
- Membuat kata sandi acak untuk VM Windows menggunakan random_password
- Membuat grup sumber daya Azure menggunakan azurerm_resource_group
- Membuat awalan IP publik Azure menggunakan azurerm_public_ip_prefix
- Membuat IP publik Azure menggunakan azurerm_public_ip
- Membuat Azure Virtual Network menggunakan azurerm_virtual_network
- Membuat subnet Azure menggunakan azurerm_subnet
- Membuat antarmuka jaringan menggunakan azurerm_network_interface
- Membuat grup keamanan jaringan (untuk berisi daftar aturan keamanan jaringan) menggunakan azurerm_network_security_group
- Membuat hubungan antara Antarmuka Jaringan dan Kelompok Keamanan Jaringan menggunakan azurerm_network_interface_security_group_association
- Membuat Komputer Virtual Windows menggunakan azurerm_windows_virtual_machine
- Membuat Kebijakan Azure Firewall menggunakan azurerm_firewall_policy
- Membuat Grup Kumpulan Aturan Kebijakan Azure Firewall menggunakan azurerm_firewall_policy_rule_collection_group
- Membuat Azure Firewall menggunakan azurerm_firewall
- Membuat tabel rute menggunakan azurerm_route_table
- Membuat hubungan antara tabel rute dan subnet menggunakan - azurerm_subnet_route_table_association
Prasyarat
Menerapkan kode Terraform
Nota
Kode sampel untuk artikel ini terletak di repositori GitHub Azure Terraform. Anda dapat melihat file log yang berisi hasil pengujian dari terraform versi saat ini dan sebelumnya.
Buat direktori untuk menguji dan menjalankan kode sampel Terraform dan menjadikannya direktori saat ini.
Buat file bernama
providers.tfdan masukkan kode berikut:terraform { required_providers { azurerm = { source = "hashicorp/azurerm" version = "~>3.0" } random = { source = "hashicorp/random" version = "~>3.0" } } } provider "azurerm" { features { virtual_machine { delete_os_disk_on_deletion = true skip_shutdown_and_force_delete = true } } }Buat file bernama
main.tfdan masukkan kode berikut:resource "random_pet" "rg_name" { prefix = var.resource_group_name_prefix } resource "random_password" "password" { count = 2 length = 20 min_lower = 1 min_upper = 1 min_numeric = 1 min_special = 1 special = true } resource "azurerm_resource_group" "rg" { name = random_pet.rg_name.id location = var.resource_group_location } resource "azurerm_public_ip_prefix" "pip_prefix" { name = "pip-prefix" location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name sku = "Standard" prefix_length = 31 } resource "azurerm_public_ip" "pip_azfw" { name = "pip-azfw" location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name sku = "Standard" allocation_method = "Static" public_ip_prefix_id = azurerm_public_ip_prefix.pip_prefix.id } resource "azurerm_public_ip" "pip_azfw_2" { name = "pip-azfw-1" location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name sku = "Standard" allocation_method = "Static" public_ip_prefix_id = azurerm_public_ip_prefix.pip_prefix.id } resource "azurerm_virtual_network" "azfw_vnet" { name = "azfw-vnet" location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name address_space = ["10.10.0.0/16"] } resource "azurerm_subnet" "azfw_subnet" { name = "AzureFirewallSubnet" resource_group_name = azurerm_resource_group.rg.name virtual_network_name = azurerm_virtual_network.azfw_vnet.name address_prefixes = ["10.10.0.0/26"] } resource "azurerm_subnet" "backend_subnet" { name = "subnet-backend" resource_group_name = azurerm_resource_group.rg.name virtual_network_name = azurerm_virtual_network.azfw_vnet.name address_prefixes = ["10.10.1.0/24"] } resource "azurerm_network_interface" "backend_nic" { count = 2 name = "nic-backend-${count.index + 1}" location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name ip_configuration { name = "ipconfig-backend-${count.index + 1}" subnet_id = azurerm_subnet.backend_subnet.id private_ip_address_allocation = "Dynamic" } } resource "azurerm_network_security_group" "backend_nsg" { name = "nsg-backend" location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name security_rule { name = "RDP" priority = 300 direction = "Inbound" access = "Allow" protocol = "Tcp" source_port_range = "*" destination_port_range = "3389" source_address_prefix = "*" destination_address_prefix = "*" } } resource "azurerm_network_interface_security_group_association" "vm_backend_nsg_association" { count = 2 network_interface_id = azurerm_network_interface.backend_nic[count.index].id network_security_group_id = azurerm_network_security_group.backend_nsg.id } resource "azurerm_windows_virtual_machine" "vm_backend" { count = 2 name = "vm-backend-${count.index + 1}" resource_group_name = azurerm_resource_group.rg.name location = azurerm_resource_group.rg.location size = var.virtual_machine_size admin_username = var.admin_username admin_password = random_password.password[count.index].result network_interface_ids = [azurerm_network_interface.backend_nic[count.index].id] os_disk { caching = "ReadWrite" storage_account_type = "Standard_LRS" } source_image_reference { publisher = "MicrosoftWindowsServer" offer = "WindowsServer" sku = "2019-Datacenter" version = "latest" } } resource "azurerm_firewall_policy" "azfw_policy" { name = "azfw-policy" resource_group_name = azurerm_resource_group.rg.name location = azurerm_resource_group.rg.location sku = var.firewall_sku_tier threat_intelligence_mode = "Alert" } resource "azurerm_firewall_policy_rule_collection_group" "policy_rule_collection_group" { name = "RuleCollectionGroup" firewall_policy_id = azurerm_firewall_policy.azfw_policy.id priority = 300 application_rule_collection { name = "web" priority = 100 action = "Allow" rule { name = "wan-address" protocols { type = "Http" port = 80 } protocols { type = "Https" port = 443 } destination_fqdns = ["getmywanip.com"] source_addresses = ["*"] } rule { name = "google" protocols { type = "Http" port = 80 } protocols { type = "Https" port = 443 } destination_fqdns = ["www.google.com"] source_addresses = ["10.10.1.0/24"] } rule { name = "wupdate" protocols { type = "Http" port = 80 } protocols { type = "Https" port = 443 } destination_fqdn_tags = ["WindowsUpdate"] source_addresses = ["*"] } } nat_rule_collection { name = "Coll-01" action = "Dnat" priority = 200 rule { name = "rdp-01" protocols = ["TCP"] translated_address = "10.10.1.4" translated_port = "3389" source_addresses = ["*"] destination_address = azurerm_public_ip.pip_azfw.ip_address destination_ports = ["3389"] } rule { name = "rdp-02" protocols = ["TCP"] translated_address = "10.10.1.5" translated_port = "3389" source_addresses = ["*"] destination_address = azurerm_public_ip.pip_azfw.ip_address destination_ports = ["3389"] } } } resource "azurerm_firewall" "fw" { name = "azfw" location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name sku_name = "AZFW_VNet" sku_tier = var.firewall_sku_tier ip_configuration { name = "azfw-ipconfig" subnet_id = azurerm_subnet.azfw_subnet.id public_ip_address_id = azurerm_public_ip.pip_azfw.id } ip_configuration { name = "azfw-ipconfig-2" public_ip_address_id = azurerm_public_ip.pip_azfw_2.id } firewall_policy_id = azurerm_firewall_policy.azfw_policy.id } resource "azurerm_route_table" "rt" { name = "rt-azfw-eus" location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name disable_bgp_route_propagation = false route { name = "azfw" address_prefix = "0.0.0.0/0" next_hop_type = "VirtualAppliance" next_hop_in_ip_address = "10.10.0.4" } } resource "azurerm_subnet_route_table_association" "jump_subnet_rt_association" { subnet_id = azurerm_subnet.backend_subnet.id route_table_id = azurerm_route_table.rt.id }Buat file bernama
variables.tfdan masukkan kode berikut:variable "resource_group_location" { type = string description = "Location for all resources." default = "eastus" } variable "resource_group_name_prefix" { type = string description = "Prefix for the Resource Group Name that's combined with a random id so name is unique in your Azure subcription." default = "rg" } variable "firewall_sku_tier" { type = string description = "Firewall SKU." default = "Premium" # Valid values are Standard and Premium validation { condition = contains(["Standard", "Premium"], var.firewall_sku_tier) error_message = "The SKU must be one of the following: Standard, Premium" } } variable "virtual_machine_size" { type = string description = "Size of the virtual machine." default = "Standard_D2_v3" } variable "admin_username" { type = string description = "Value of the admin username." default = "azureuser" }Buat file bernama
outputs.tfdan masukkan kode berikut:output "resource_group_name" { value = azurerm_resource_group.rg.name } output "backend_admin_password" { sensitive = true value = azurerm_windows_virtual_machine.vm_backend[*].admin_password }
Menginisialisasi 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-poin penting:
- Parameter
-upgrademeningkatkan plugin penyedia yang diperlukan ke versi terbaru yang sesuai dengan batasan versi konfigurasi.
Buat rencana pelaksanaan Terraform
Jalankan terraform plan untuk membuat rencana eksekusi.
terraform plan -out main.tfplan
Poin-poin penting:
- Perintah
terraform planmembuat 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
-outopsional memungkinkan Anda menentukan file output untuk rencana. Menggunakan parameter-outmemastikan bahwa rencana yang Anda tinjau benar-benar sesuai dengan yang diterapkan.
Terapkan rencana pelaksanaan Terraform
Jalankan terraform apply untuk menerapkan rencana pelaksanaan ke infrastruktur cloud Anda.
terraform apply main.tfplan
Poin-poin penting:
- Contoh perintah
terraform applymengasumsikan 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 applytanpa parameter apa pun.
Memverifikasi hasilnya
Dapatkan nama grup sumber daya Azure.
resource_group_name=$(terraform output -raw resource_group_name)Jalankan az network ip-group list untuk menampilkan dua Grup IP baru.
az network ip-group list --resource-group $resource_group_name
Membersihkan sumber daya
Saat Anda tidak lagi memerlukan sumber daya yang dibuat melalui Terraform, lakukan langkah-langkah berikut:
Jalankan terraform plan dan tentukan
destroyparameter.terraform plan -destroy -out main.destroy.tfplanPoin-poin penting:
- Perintah
terraform planmembuat 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
-outopsional memungkinkan Anda menentukan file output untuk rencana. Menggunakan parameter-outmemastikan bahwa rencana yang Anda tinjau benar-benar sesuai dengan yang diterapkan.
- Perintah
Jalankan terraform apply untuk mengaplikasikan rencana eksekusi.
terraform apply main.destroy.tfplan
Memecahkan masalah Terraform di Azure
Memecahkan masalah umum saat menggunakan Terraform di Azure