Hızlı Başlangıç: Terraform kullanarak Azure NAT Ağ Geçidi oluşturma
Terraform kullanarak Azure NAT Gateway'i kullanmaya başlayın. Bu Terraform dosyası bir sanal ağ, nat ağ geçidi kaynağı ve Ubuntu sanal makinesi dağıtır. Ubuntu sanal makinesi NAT ağ geçidi kaynağıyla ilişkili bir alt ağa dağıtılır.
Betik ayrıca rastgele bir SSH ortak anahtarı oluşturur ve güvenli erişim için sanal makineyle ilişkilendirir. Ortak anahtar, betik yürütmesinin sonunda çıkarılır.
Betik, AzureRM sağlayıcısına ek olarak Random ve AzAPI sağlayıcılarını kullanır. Rastgele sağlayıcı, kaynak grubu ve SSH anahtarı için benzersiz bir ad oluşturmak için kullanılır. AzAPI sağlayıcısı SSH ortak anahtarını oluşturmak için kullanılır.
Ortak anahtarda olduğu gibi, betik çalıştırıldığında oluşturulan kaynak grubunun, sanal ağın, alt ağın ve NAT ağ geçidinin adları yazdırılır.
Terraform , bulut altyapısının tanımlanmasını, önizlemesini ve dağıtımını sağlar. Terraform kullanarak HCL söz dizimlerini kullanarak yapılandırma dosyaları oluşturursunuz. HCL söz dizimi, Azure gibi bulut sağlayıcısını ve bulut altyapınızı oluşturan öğeleri belirtmenize olanak tanır. Yapılandırma dosyalarınızı oluşturduktan sonra, altyapı değişikliklerinizin dağıtılmadan önce önizlemesini görüntülemenizi sağlayan bir yürütme planı oluşturursunuz. Değişiklikleri doğruladıktan sonra, altyapıyı dağıtmak için yürütme planını uygularsınız.
Önkoşullar
Etkin aboneliği olan bir Azure hesabı. Ücretsiz bir hesap oluşturabilirsiniz.
Terraform’u yükleyin ve yapılandırın.
Terraform kodunu uygulama
Not
Bu makalenin örnek kodu Azure Terraform GitHub deposunda bulunur.
Azure kaynaklarını yönetmek için Terraform'un nasıl kullanılacağını gösteren diğer makalelere ve örnek koda bakın
Örnek Terraform kodunu test edip çalıştırmak ve geçerli dizin yapmak için bir dizin oluşturun.
adlı
main.tf
bir dosya oluşturun ve aşağıdaki kodu ekleyin:# Resource Group resource "azurerm_resource_group" "rg" { location = var.resource_group_location name = "${random_pet.prefix.id}-rg" } # Virtual Network resource "azurerm_virtual_network" "my_terraform_network" { name = "${random_pet.prefix.id}-vnet" address_space = ["10.0.0.0/16"] location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name } # Subnet 1 resource "azurerm_subnet" "my_terraform_subnet_1" { name = "subnet-1" resource_group_name = azurerm_resource_group.rg.name virtual_network_name = azurerm_virtual_network.my_terraform_network.name address_prefixes = ["10.0.0.0/24"] } # Public IP address for NAT gateway resource "azurerm_public_ip" "my_public_ip" { name = "public-ip-nat" location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name allocation_method = "Static" sku = "Standard" } # NAT Gateway resource "azurerm_nat_gateway" "my_nat_gateway" { name = "nat-gateway" location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name } # Associate NAT Gateway with Public IP resource "azurerm_nat_gateway_public_ip_association" "example" { nat_gateway_id = azurerm_nat_gateway.my_nat_gateway.id public_ip_address_id = azurerm_public_ip.my_public_ip.id } # Associate NAT Gateway with Subnet resource "azurerm_subnet_nat_gateway_association" "example" { subnet_id = azurerm_subnet.my_terraform_subnet_1.id nat_gateway_id = azurerm_nat_gateway.my_nat_gateway.id } # Create public IP for virtual machine resource "azurerm_public_ip" "my_public_ip_vm" { name = "public-ip-vm" location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name allocation_method = "Static" sku = "Standard" } # Create Network Security Group and rule resource "azurerm_network_security_group" "my_terraform_nsg" { name = "nsg-1" location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name security_rule { name = "SSH" priority = 1001 direction = "Inbound" access = "Allow" protocol = "Tcp" source_port_range = "*" destination_port_range = "22" source_address_prefix = "*" destination_address_prefix = "*" } } # Create network interface resource "azurerm_network_interface" "my_terraform_nic" { name = "nic-1" location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name ip_configuration { name = "my_nic_configuration" subnet_id = azurerm_subnet.my_terraform_subnet_1.id private_ip_address_allocation = "Dynamic" public_ip_address_id = azurerm_public_ip.my_public_ip_vm.id } } # Connect the security group to the network interface resource "azurerm_network_interface_security_group_association" "example" { network_interface_id = azurerm_network_interface.my_terraform_nic.id network_security_group_id = azurerm_network_security_group.my_terraform_nsg.id } # Generate random text for a unique storage account name resource "random_id" "random_id" { keepers = { # Generate a new ID only when a new resource group is defined resource_group = azurerm_resource_group.rg.name } byte_length = 8 } # Create storage account for boot diagnostics resource "azurerm_storage_account" "my_storage_account" { name = "diag${random_id.random_id.hex}" location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name account_tier = "Standard" account_replication_type = "LRS" } # Create virtual machine resource "azurerm_linux_virtual_machine" "my_terraform_vm" { name = "vm-1" location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name network_interface_ids = [azurerm_network_interface.my_terraform_nic.id] size = "Standard_DS1_v2" os_disk { name = "myOsDisk" caching = "ReadWrite" storage_account_type = "Premium_LRS" } source_image_reference { publisher = "Canonical" offer = "0001-com-ubuntu-server-jammy" sku = "22_04-lts-gen2" version = "latest" } computer_name = "hostname" admin_username = var.username admin_ssh_key { username = var.username public_key = azapi_resource_action.ssh_public_key_gen.output.publicKey } boot_diagnostics { storage_account_uri = azurerm_storage_account.my_storage_account.primary_blob_endpoint } } resource "random_pet" "prefix" { prefix = var.resource_group_name_prefix length = 1 }
adlı
outputs.tf
bir dosya oluşturun ve aşağıdaki kodu ekleyin:output "resource_group_name" { description = "The name of the created resource group." value = azurerm_resource_group.rg.name } output "virtual_network_name" { description = "The name of the created virtual network." value = azurerm_virtual_network.my_terraform_network.name } output "subnet_name_1" { description = "The name of the created subnet 1." value = azurerm_subnet.my_terraform_subnet_1.name } output "nat_gateway"{ description = "The name of the created NAT gateway." value = azurerm_nat_gateway.my_nat_gateway.id }
adlı
providers.tf
bir dosya oluşturun ve aşağıdaki kodu ekleyin:terraform { required_providers { azapi = { source = "azure/azapi" version = "~>1.5" } azurerm = { source = "hashicorp/azurerm" version = "~>3.0" } random = { source = "hashicorp/random" version = "~>3.0" } } } provider "azurerm" { features {} }
adlı
ssh.tf
bir dosya oluşturun ve aşağıdaki kodu ekleyin:resource "random_pet" "ssh_key_name" { prefix = "ssh" separator = "" } resource "azapi_resource_action" "ssh_public_key_gen" { type = "Microsoft.Compute/sshPublicKeys@2022-11-01" resource_id = azapi_resource.ssh_public_key.id action = "generateKeyPair" method = "POST" response_export_values = ["publicKey", "privateKey"] } resource "azapi_resource" "ssh_public_key" { type = "Microsoft.Compute/sshPublicKeys@2022-11-01" name = random_pet.ssh_key_name.id location = azurerm_resource_group.rg.location parent_id = azurerm_resource_group.rg.id } output "key_data" { value = azapi_resource_action.ssh_public_key_gen.output.publicKey }
adlı
variables.tf
bir dosya oluşturun ve aşağıdaki kodu ekleyin: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 ID so name is unique in your Azure subscription." } variable "username" { type = string description = "The username for the local account that will be created on the new VM." default = "azureuser" }
Terraform'u başlatma
Terraform dağıtımını başlatmak için terraform init komutunu çalıştırın. Bu komut, Azure kaynaklarınızı yönetmek için gereken Azure sağlayıcısını indirir.
terraform init -upgrade
Önemli noktalar:
-upgrade
parametresi, gerekli sağlayıcı eklentilerini yapılandırmanın sürüm kısıtlamalarına uygun en yeni sürüme yükseltir.
Terraform yürütme planı oluşturma
Terraform planını çalıştırarak yürütme planı oluşturun.
terraform plan -out main.tfplan
Önemli noktalar:
- komutu
terraform plan
bir yürütme planı oluşturur ancak yürütmez. Bunun yerine, yapılandırma dosyalarınızda belirtilen yapılandırmayı oluşturmak için hangi eylemlerin gerekli olduğunu belirler. Bu düzen, gerçek kaynaklarda değişiklik yapmadan önce yürütme planının beklentilerinizle eşleşip eşleşmediğini doğrulamanızı sağlar. - İsteğe bağlı
-out
parametresi, plan için bir çıkış dosyası belirtmenize olanak tanır. parametresinin-out
kullanılması, gözden geçirdiğiniz planın tam olarak uygulanan plan olmasını sağlar.
Terraform yürütme planı uygulama
Yürütme planını bulut altyapınıza uygulamak için terraform apply komutunu çalıştırın.
terraform apply main.tfplan
Önemli noktalar:
- Örnek
terraform apply
komut, daha önce komutunu çalıştırdığınızıterraform plan -out main.tfplan
varsayar. - parametresi için
-out
farklı bir dosya adı belirttiyseniz, çağrısındaterraform apply
aynı dosya adını kullanın. - parametresini
-out
kullanmadıysanız, parametresiz olarak çağırınterraform apply
.
Sonuçları doğrulama
- Azure kaynak grubu adını alın.
resource_group_name=$(terraform output -raw resource_group_name)
- NAT ağ geçidi kimliğini alın.
nat_gateway=$(terraform output -raw nat_gateway)
- NAT ağ geçidi hakkındaki ayrıntıları görüntülemek için az network nat gateway show komutunu çalıştırın.
az network nat gateway show \
--resource-group $resource_group_name \
--ids $nat_gateway
Kaynakları temizleme
Terraform aracılığıyla oluşturulan kaynaklara artık ihtiyacınız kalmadığında aşağıdaki adımları uygulayın:
terraform planını çalıştırın ve bayrağını
destroy
belirtin.terraform plan -destroy -out main.destroy.tfplan
Önemli noktalar:
- komutu
terraform plan
bir yürütme planı oluşturur ancak yürütmez. Bunun yerine, yapılandırma dosyalarınızda belirtilen yapılandırmayı oluşturmak için hangi eylemlerin gerekli olduğunu belirler. Bu düzen, gerçek kaynaklarda değişiklik yapmadan önce yürütme planının beklentilerinizle eşleşip eşleşmediğini doğrulamanızı sağlar. - İsteğe bağlı
-out
parametresi, plan için bir çıkış dosyası belirtmenize olanak tanır. parametresinin-out
kullanılması, gözden geçirdiğiniz planın tam olarak uygulanan plan olmasını sağlar.
- komutu
Yürütme planını uygulamak için terraform apply komutunu çalıştırın.
terraform apply main.destroy.tfplan
Azure'da Terraform sorunlarını giderme
Azure'da Terraform kullanırken karşılaşılan yaygın sorunları giderme.