クイックスタート: Azure Application Gateway で Web トラフィックを転送する - Terraform
このクイックスタートでは、Terraform を使用して Azure Application Gateway を作成します。 次いで、アプリケーション ゲートウェイをテストし、それが正常に動作することを確認します。 この例では、Standard v2 SKU が使用されています。
Terraform を使用すると、クラウド インフラストラクチャの定義、プレビュー、およびデプロイを行うことができます。 Terraform を使用する際は、HCL 構文を使って構成ファイルを作成します。 HCL 構文では、Azure などのクラウド プロバイダーと、クラウド インフラストラクチャを構成する要素を指定できます。 構成ファイルを作成したら、"実行プラン" を作成します。これにより、インフラストラクチャの変更をデプロイ前にプレビューすることができます。 変更を確認したら、実行プランを適用してインフラストラクチャをデプロイします。
- azurerm_resource_group を使用して Azure リソース グループを作成する
- azurerm_virtual_network を使用して Azure Virtual Network を作成する
- azurerm_subnet を使用して Azure サブネットを作成する
- azurerm_public_ip を使用して Azure パブリック IP を作成する
- azurerm_application_gateway を使用して Azure Application Gateway を作成する
- azurerm_network_interface を使用して Azure ネットワーク インターフェイスを作成する
- azurerm_network_interface_application_gateway_backend_address_pool_association を使用して Azure ネットワーク インターフェイス アプリケーション ゲートウェイ バックエンド アドレス プールの関連付けを作成する
- azurerm_windows_virtual_machine を使用して Azure Windows 仮想マシンを作成する
- azurerm_virtual_machine_extension を使用して Azure 仮想マシン拡張機能を作成する
Note
Application Gateway フロントエンドでデュアルスタック IP アドレスがサポートされるようになりました (プレビュー)。 2 つの IPv4 アドレス (パブリックとプライベート) と 2 つの IPv6 アドレス (パブリックとプライベート) という最大 4 つのフロントエンド IP アドレスを作成できるようになりました。
前提条件
Terraform コードを実装する
注意
この記事のサンプル コードは、Azure Terraform GitHub リポジトリにあります。 Terraform の現在および以前のバージョンのテスト結果を含むログ ファイルを表示できます。
Terraform を使用して Azure リソースを管理する方法を示すその他の記事とサンプル コードを参照してください
サンプルの Terraform コードをテストするディレクトリを作成し、それを現在のディレクトリにします。
providers.tf
という名前のファイルを作成し、次のコードを挿入します。terraform { required_version = ">=1.2" required_providers { azurerm = { source = "hashicorp/azurerm" version = "~> 3.0" } random = { source = "hashicorp/random" version = "~> 3.0" } } } provider "azurerm" { features {} }
main.tf
という名前のファイルを作成し、次のコードを挿入します。resource "random_string" "rg" { length = 8 upper = false special = false } resource "azurerm_resource_group" "rg" { name = "101-application-gateway-${random_string.rg.result}" location = "eastus" } resource "azurerm_virtual_network" "vnet" { name = "myVNet" resource_group_name = azurerm_resource_group.rg.name location = azurerm_resource_group.rg.location address_space = ["10.21.0.0/16"] } resource "azurerm_subnet" "frontend" { name = "myAGSubnet" resource_group_name = azurerm_resource_group.rg.name virtual_network_name = azurerm_virtual_network.vnet.name address_prefixes = ["10.21.0.0/24"] } resource "azurerm_subnet" "backend" { name = "myBackendSubnet" resource_group_name = azurerm_resource_group.rg.name virtual_network_name = azurerm_virtual_network.vnet.name address_prefixes = ["10.21.1.0/24"] } resource "azurerm_public_ip" "pip" { name = "myAGPublicIPAddress" resource_group_name = azurerm_resource_group.rg.name location = azurerm_resource_group.rg.location allocation_method = "Static" sku = "Standard" } resource "azurerm_application_gateway" "main" { name = "myAppGateway" resource_group_name = azurerm_resource_group.rg.name location = azurerm_resource_group.rg.location sku { name = "Standard_v2" tier = "Standard_v2" capacity = 2 } gateway_ip_configuration { name = "my-gateway-ip-configuration" subnet_id = azurerm_subnet.frontend.id } frontend_port { name = var.frontend_port_name port = 80 } frontend_ip_configuration { name = var.frontend_ip_configuration_name public_ip_address_id = azurerm_public_ip.pip.id } backend_address_pool { name = var.backend_address_pool_name } backend_http_settings { name = var.http_setting_name cookie_based_affinity = "Disabled" port = 80 protocol = "Http" request_timeout = 60 } http_listener { name = var.listener_name frontend_ip_configuration_name = var.frontend_ip_configuration_name frontend_port_name = var.frontend_port_name protocol = "Http" } request_routing_rule { name = var.request_routing_rule_name rule_type = "Basic" http_listener_name = var.listener_name backend_address_pool_name = var.backend_address_pool_name backend_http_settings_name = var.http_setting_name priority = 1 } } resource "azurerm_network_interface" "nic" { count = 2 name = "nic-${count.index+1}" location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name ip_configuration { name = "nic-ipconfig-${count.index+1}" subnet_id = azurerm_subnet.backend.id private_ip_address_allocation = "Dynamic" } } resource "azurerm_network_interface_application_gateway_backend_address_pool_association" "nic-assoc" { count = 2 network_interface_id = azurerm_network_interface.nic[count.index].id ip_configuration_name = "nic-ipconfig-${count.index+1}" backend_address_pool_id = one(azurerm_application_gateway.main.backend_address_pool).id } resource "random_password" "password" { length = 16 special = true lower = true upper = true numeric = true } resource "azurerm_windows_virtual_machine" "vm" { count = 2 name = "myVM${count.index+1}" resource_group_name = azurerm_resource_group.rg.name location = azurerm_resource_group.rg.location size = "Standard_DS1_v2" admin_username = "azureadmin" admin_password = random_password.password.result network_interface_ids = [ azurerm_network_interface.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_virtual_machine_extension" "vm-extensions" { count = 2 name = "vm${count.index+1}-ext" virtual_machine_id = azurerm_windows_virtual_machine.vm[count.index].id publisher = "Microsoft.Compute" type = "CustomScriptExtension" type_handler_version = "1.10" settings = <<SETTINGS { "commandToExecute": "powershell Add-WindowsFeature Web-Server; powershell Add-Content -Path \"C:\\inetpub\\wwwroot\\Default.htm\" -Value $($env:computername)" } SETTINGS }
ヒント
resource\applicationGateWay\main\sku
の Name
および Tier
パラメーターの値を変更して、別の SKU を使用できます。 (例: Basic
)。
variables.tf
という名前のファイルを作成し、次のコードを挿入します。variable "backend_address_pool_name" { default = "myBackendPool" } variable "frontend_port_name" { default = "myFrontendPort" } variable "frontend_ip_configuration_name" { default = "myAGIPConfig" } variable "http_setting_name" { default = "myHTTPsetting" } variable "listener_name" { default = "myListener" } variable "request_routing_rule_name" { default = "myRoutingRule" }
outputs.tf
という名前のファイルを作成し、次のコードを挿入します。output "gateway_frontend_ip" { value = "http://${azurerm_public_ip.pip.ip_address}" }
Terraform を初期化する
terraform init を実行して、Terraform のデプロイを初期化します。 このコマンドによって、Azure リソースを管理するために必要な Azure プロバイダーがダウンロードされます。
terraform init -upgrade
重要なポイント:
-upgrade
パラメーターは、必要なプロバイダー プラグインを、構成のバージョン制約に準拠する最新バージョンにアップグレードします。
Terraform 実行プランを作成する
terraform plan を実行して、実行プランを作成します。
terraform plan -out main.tfplan
重要なポイント:
terraform plan
コマンドは、実行プランを作成しますが、実行はしません。 代わりに、構成ファイルに指定された構成を作成するために必要なアクションを決定します。 このパターンを使用すると、実際のリソースに変更を加える前に、実行プランが自分の想定と一致しているかどうかを確認できます。- 省略可能な
-out
パラメーターを使用すると、プランの出力ファイルを指定できます。-out
パラメーターを使用すると、レビューしたプランが適用内容とまったく同じであることが確実になります。
Terraform 実行プランを適用する
terraform apply を実行して、クラウド インフラストラクチャに実行プランを適用します。
terraform apply main.tfplan
重要なポイント:
terraform apply
コマンドの例は、以前にterraform plan -out main.tfplan
が実行されたことを前提としています。-out
パラメーターに別のファイル名を指定した場合は、terraform apply
の呼び出しで同じファイル名を使用します。-out
パラメーターを使用しなかった場合は、パラメーターを指定せずにterraform apply
を呼び出します。
結果を確認する
実行プランを適用すると、Terraform によってフロントエンド パブリック IP アドレスが表示されます。 画面をクリアした場合には、次の Terraform コマンドを使用してその値を取得できます。
echo $(terraform output -raw gateway_frontend_ip)
そのパブリック IP アドレスを Web ブラウザーのアドレス バーに貼り付けます。 ブラウザーを更新して、仮想マシンの名前を確認します。 有効な応答によって、アプリケーション ゲートウェイが正常に作成されたことが確認され、それによりバックエンドに接続できます。
リソースをクリーンアップする
Terraform を使用して作成したリソースが不要になった場合は、次の手順を実行します。
terraform plan を実行して、
destroy
フラグを指定します。terraform plan -destroy -out main.destroy.tfplan
重要なポイント:
terraform plan
コマンドは、実行プランを作成しますが、実行はしません。 代わりに、構成ファイルに指定された構成を作成するために必要なアクションを決定します。 このパターンを使用すると、実際のリソースに変更を加える前に、実行プランが自分の想定と一致しているかどうかを確認できます。- 省略可能な
-out
パラメーターを使用すると、プランの出力ファイルを指定できます。-out
パラメーターを使用すると、レビューしたプランが適用内容とまったく同じであることが確実になります。
terraform apply を実行して、実行プランを適用します。
terraform apply main.destroy.tfplan
Azure での Terraform のトラブルシューティング
Azure で Terraform を使用する場合の一般的な問題のトラブルシューティング