Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
W tym szybkim przewodniku użyjesz narzędzia Terraform do wdrożenia usługi Azure Firewall w trzech strefach dostępności.
Narzędzie Terraform umożliwia definiowanie, wyświetlanie wersji zapoznawczej i wdrażanie infrastruktury chmury. Za pomocą narzędzia Terraform tworzysz pliki konfiguracji przy użyciu składni HCL. Składnia listy HCL umożliwia określenie dostawcy chmury — takiego jak platforma Azure — oraz elementów tworzących infrastrukturę chmury. Po utworzeniu plików konfiguracji utworzysz plan wykonywania , który umożliwia wyświetlenie podglądu zmian infrastruktury przed ich wdrożeniem. Po zweryfikowaniu zmian należy zastosować plan wykonywania w celu wdrożenia infrastruktury.
Konfiguracja narzędzia Terraform tworzy testowe środowisko sieciowe z zaporą. Sieć ma jedną sieć wirtualną z trzema podsieciami: AzureFirewallSubnet, subnet-server i subnet-jump. Podsieci serwer-podsieć i podsieć-przesiadka mają po jednej dwurdzeniowej maszynie wirtualnej na Windows Server.
Zapora znajduje się w podsieci AzureFirewallSubnet i ma kolekcję reguł aplikacji, z jedną regułą umożliwiającą dostęp do www.microsoft.com.
Ruch sieciowy z tras zdefiniowanych przez użytkownika z podsiec serwera przechodzi przez zaporę, w której stosowane są reguły zapory.
Aby uzyskać więcej informacji na temat usługi Azure Firewall, zobacz Wdrażanie i konfigurowanie usługi Azure Firewall przy użyciu witryny Azure Portal.
Z tego artykułu dowiesz się, jak wykonywać następujące działania:
- Utwórz wartość losową (do użycia w nazwie grupy zasobów) przy użyciu random_pet
- Tworzenie grupy zasobów platformy Azure przy użyciu azurerm_resource_group
- Tworzenie sieci wirtualnej platformy Azure przy użyciu azurerm_virtual_network
- Tworzenie trzech podsieci platformy Azure przy użyciu azurerm_subnet
- Tworzenie publicznego adresu IP platformy Azure przy użyciu azurerm_public_ip
- Tworzenie zasad usługi Azure Firewall przy użyciu azurerm_firewall_policy
- Tworzenie grupy kolekcji reguł zasad usługi Azure Firewall przy użyciu azurerm_firewall_policy_rule_collection_group
- Tworzenie usługi Azure Firewall przy użyciu azurerm_firewall
- Tworzenie interfejsu sieciowego przy użyciu azurerm_network_interface
- Utwórz sieciową grupę zabezpieczeń (zawierającą listę reguł zabezpieczeń sieci) przy użyciu azurerm_network_security_group
- Tworzenie skojarzenia między interfejsem sieciowym a sieciową grupą zabezpieczeń przy użyciu — azurerm_network_interface_security_group_association
- Tworzenie tabeli tras przy użyciu azurerm_route_table
- Tworzenie skojarzenia między tabelą tras a podsiecią przy użyciu — azurerm_subnet_route_table_association
- Utwórz losowy ciąg znaków (do użycia jako nazwę przechowywania) przy użyciu random_string
- Tworzenie konta magazynu przy użyciu azurerm_storage_account
- Tworzenie losowego hasła dla maszyny wirtualnej z systemem Windows przy użyciu random_password
- Tworzenie maszyny wirtualnej platformy Azure z systemem Windows przy użyciu azurerm_windows_virtual_machine
Wymagania wstępne
Implementowanie kodu narzędzia Terraform
Uwaga
Przykładowy kod tego artykułu znajduje się w repozytorium GitHub programu Azure Terraform. Możesz wyświetlić plik dziennika zawierający wyniki testu z bieżących i poprzednich wersji programu Terraform.
Zobacz więcej artykułów i przykładowego kodu pokazującego, jak zarządzać zasobami platformy Azure za pomocą narzędzia Terraform
Utwórz katalog, w którym chcesz przetestować przykładowy kod narzędzia Terraform i ustawić go jako bieżący katalog.
Utwórz plik o nazwie
providers.tfi wstaw następujący kod:terraform { required_providers { azurerm = { source = "hashicorp/azurerm" version = "~>3.0" } random = { source = "hashicorp/random" version = "~>3.0" } } } provider "azurerm" { features {} }Utwórz plik o nazwie
main.tfi wstaw następujący kod:resource "random_pet" "rg_name" { prefix = var.resource_group_name_prefix } resource "random_string" "storage_account_name" { length = 8 lower = true numeric = false special = false upper = false } resource "random_password" "password" { 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" "pip_azfw" { name = "pip-azfw" location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name allocation_method = "Static" sku = "Standard" zones = ["1", "2", "3"] } resource "azurerm_storage_account" "sa" { name = random_string.storage_account_name.result resource_group_name = azurerm_resource_group.rg.name location = azurerm_resource_group.rg.location account_tier = "Standard" account_replication_type = "LRS" account_kind = "StorageV2" } 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" "server_subnet" { name = "subnet-server" 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_subnet" "jump_subnet" { name = "subnet-jump" resource_group_name = azurerm_resource_group.rg.name virtual_network_name = azurerm_virtual_network.azfw_vnet.name address_prefixes = ["10.10.2.0/24"] } resource "azurerm_public_ip" "vm_jump_pip" { name = "pip-jump" location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name allocation_method = "Static" sku = "Standard" } resource "azurerm_network_interface" "vm_server_nic" { name = "nic-server" location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name ip_configuration { name = "ipconfig-workload" subnet_id = azurerm_subnet.server_subnet.id private_ip_address_allocation = "Dynamic" } } resource "azurerm_network_interface" "vm_jump_nic" { name = "nic-jump" location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name ip_configuration { name = "ipconfig-jump" subnet_id = azurerm_subnet.jump_subnet.id private_ip_address_allocation = "Dynamic" public_ip_address_id = azurerm_public_ip.vm_jump_pip.id } } resource "azurerm_network_security_group" "vm_server_nsg" { name = "nsg-server" location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name } resource "azurerm_network_security_group" "vm_jump_nsg" { name = "nsg-jump" location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name security_rule { name = "Allow-TCP" priority = 1000 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_server_nsg_association" { network_interface_id = azurerm_network_interface.vm_server_nic.id network_security_group_id = azurerm_network_security_group.vm_server_nsg.id } resource "azurerm_network_interface_security_group_association" "vm_jump_nsg_association" { network_interface_id = azurerm_network_interface.vm_jump_nic.id network_security_group_id = azurerm_network_security_group.vm_jump_nsg.id } resource "azurerm_windows_virtual_machine" "vm_server" { name = "server-vm" resource_group_name = azurerm_resource_group.rg.name location = azurerm_resource_group.rg.location computer_name = "server" size = var.virtual_machine_size admin_username = var.admin_username admin_password = random_password.password.result network_interface_ids = [azurerm_network_interface.vm_server_nic.id] os_disk { caching = "ReadWrite" storage_account_type = "Standard_LRS" disk_size_gb = "128" } source_image_reference { publisher = "MicrosoftWindowsServer" offer = "WindowsServer" sku = "2019-Datacenter" version = "latest" } boot_diagnostics { storage_account_uri = azurerm_storage_account.sa.primary_blob_endpoint } } resource "azurerm_windows_virtual_machine" "vm_jump" { name = "jump-vm" resource_group_name = azurerm_resource_group.rg.name location = azurerm_resource_group.rg.location computer_name = "jumpbox" size = var.virtual_machine_size admin_username = var.admin_username admin_password = random_password.password.result network_interface_ids = [azurerm_network_interface.vm_jump_nic.id] os_disk { caching = "ReadWrite" storage_account_type = "Standard_LRS" disk_size_gb = "128" } source_image_reference { publisher = "MicrosoftWindowsServer" offer = "WindowsServer" sku = "2019-Datacenter" version = "latest" } boot_diagnostics { storage_account_uri = azurerm_storage_account.sa.primary_blob_endpoint } } 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" "prcg" { name = "prcg" firewall_policy_id = azurerm_firewall_policy.azfw_policy.id priority = 300 application_rule_collection { name = "appRc1" priority = 101 action = "Allow" rule { name = "appRule1" protocols { type = "Http" port = 80 } protocols { type = "Https" port = 443 } destination_fqdns = ["www.microsoft.com"] source_addresses = ["10.10.1.0/24"] } } network_rule_collection { name = "netRc1" priority = 200 action = "Allow" rule { name = "netRule1" protocols = ["TCP"] source_addresses = ["10.10.1.0/24"] destination_addresses = ["*"] destination_ports = ["8000", "8999"] } } } 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 zones = ["1", "2", "3"] ip_configuration { name = "azfw-ipconfig" subnet_id = azurerm_subnet.azfw_subnet.id public_ip_address_id = azurerm_public_ip.pip_azfw.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 = "azfwDefaultRoute" address_prefix = "0.0.0.0/0" next_hop_type = "VirtualAppliance" next_hop_in_ip_address = azurerm_firewall.fw.ip_configuration[0].private_ip_address } } resource "azurerm_subnet_route_table_association" "jump_subnet_rt_association" { subnet_id = azurerm_subnet.server_subnet.id route_table_id = azurerm_route_table.rt.id }Utwórz plik o nazwie
variables.tfi wstaw następujący kod: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" }Utwórz plik o nazwie
outputs.tfi wstaw następujący kod:output "resource_group_name" { value = azurerm_resource_group.rg.name } output "firewall_name" { value = azurerm_firewall.fw.name }
Inicjowanie narzędzia Terraform
Uruchom narzędzie terraform init, aby zainicjować wdrożenie narzędzia Terraform. Polecenie to pobiera dostawcę Azure wymaganego do zarządzania zasobami Azure.
terraform init -upgrade
Kluczowe punkty:
- Parametr
-upgradeuaktualnia niezbędne wtyczki dostawcy do najnowszej wersji zgodnej z ograniczeniami wersji konfiguracji.
Tworzenie planu wykonywania narzędzia Terraform
Uruchom terraform plan , aby utworzyć plan wykonania.
terraform plan -out main.tfplan
Kluczowe punkty:
- Polecenie
terraform plantworzy plan wykonania, ale go nie wykonuje. Zamiast tego określa, jakie akcje są niezbędne do utworzenia konfiguracji określonej w plikach konfiguracji. Ten wzorzec umożliwia sprawdzenie, czy plan wykonania jest zgodny z oczekiwaniami przed wprowadzeniem jakichkolwiek zmian w rzeczywistych zasobach. - Opcjonalny parametr
-outumożliwia określenie pliku wyjściowego dla planu. Użycie parametru-outgwarantuje, że sprawdzony plan jest dokładnie tym, co jest stosowane.
Zastosowanie planu wykonawczego Terraform
Uruchom terraform apply, aby zastosować plan wykonania do swojej infrastruktury chmurowej.
terraform apply main.tfplan
Kluczowe punkty:
- Polecenie
terraform applyw przykładzie zakłada, że wcześniej uruchomionoterraform plan -out main.tfplan. - Jeśli określono inną nazwę pliku dla parametru
-out, użyj tej samej nazwy pliku w wywołaniuterraform apply. - Jeśli nie użyto parametru
-out, wywołajterraform applybez żadnych parametrów.
Weryfikowanie wyników
Pobierz nazwę grupy zasobów platformy Azure.
resource_group_name=$(terraform output -raw resource_group_name)Pobierz nazwę zapory.
firewall_name=$(terraform output -raw firewall_name)Uruchom polecenie az network firewall show przy użyciu zapytania JMESPath, aby wyświetlić strefy dostępności dla zapory.
az network firewall show --name $firewall_name --resource-group $resource_group_name --query "{Zones:zones"}
Czyszczenie zasobów
Jeśli zasoby utworzone za pomocą narzędzia Terraform nie są już potrzebne, wykonaj następujące czynności:
Uruchom terraform plan i określ flagę
destroy.terraform plan -destroy -out main.destroy.tfplanKluczowe punkty:
- Polecenie
terraform plantworzy plan wykonania, ale go nie wykonuje. Zamiast tego określa, jakie akcje są niezbędne do utworzenia konfiguracji określonej w plikach konfiguracji. Ten wzorzec umożliwia sprawdzenie, czy plan wykonania jest zgodny z oczekiwaniami przed wprowadzeniem jakichkolwiek zmian w rzeczywistych zasobach. - Opcjonalny parametr
-outumożliwia określenie pliku wyjściowego dla planu. Użycie parametru-outgwarantuje, że sprawdzony plan jest dokładnie tym, co jest stosowane.
- Polecenie
Uruchom terraform apply, aby zastosować plan wykonania.
terraform apply main.destroy.tfplan
Rozwiązywanie problemów z programem Terraform na platformie Azure
Rozwiązywanie typowych problemów podczas korzystania z narzędzia Terraform na platformie Azure
Następne kroki
Następnie możesz monitorować dzienniki usługi Azure Firewall.