次の方法で共有


クイックスタート: Azure Application Gateway で Web トラフィックを転送する - Terraform

このクイックスタートでは、Terraform を使用して Azure Application Gateway を作成します。 その後、アプリケーション ゲートウェイをテストし、それが正常に動作することを確認します。 この例では、Standard v2 SKU が使用されています。

Terraform を使用すると、クラウド インフラストラクチャの定義、プレビュー、デプロイが可能になります。 Terraform を使用して、 HCL 構文を使用して構成ファイルを作成します。 HCL 構文を使用すると、クラウド プロバイダー (Azure など) とクラウド インフラストラクチャを構成する要素を指定できます。 構成ファイルを作成したら、インフラストラクチャの変更をデプロイする前にプレビューできる 実行プラン を作成します。 変更を確認したら、実行プランを適用してインフラストラクチャをデプロイします。

クイック スタートのセットアップの概念図。

Application Gateway フロントエンドでデュアルスタック IP アドレスがサポートされるようになりました (プレビュー)。 2 つの IPv4 アドレス (パブリックとプライベート) と 2 つの IPv6 アドレス (パブリックとプライベート) という最大 4 つのフロントエンド IP アドレスを作成できるようになりました。

前提条件

Terraform コードを実装する

  1. サンプルの Terraform コードをテストするディレクトリを作成し、それを現在のディレクトリにします。

  2. 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 {}
    }
    
  3. 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
    
    }
    

ヒント

NameTier および resource\applicationGateWay\main\sku パラメーターの値を変更して、別の SKU を使用できます。 (例: Basic)。

  1. 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"
    }
    
  2. 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 プランを実行して実行プランを作成します。

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 を呼び出します。

結果を確認する

  1. 実行プランを適用すると、Terraform によってフロントエンド パブリック IP アドレスが表示されます。 画面をクリアした場合は、次の Terraform コマンドを使用してその値を取得できます。

    echo $(terraform output -raw gateway_frontend_ip)
    
  2. そのパブリック IP アドレスを Web ブラウザーのアドレス バーに貼り付けます。 ブラウザーを更新して、仮想マシンの名前を確認します。 有効な応答によって、アプリケーション ゲートウェイが正常に作成されたことが確認され、それによりバックエンドに接続できます。

リソースをクリーンアップする

Terraform を使用して作成されたリソースが不要になったら、次の手順を実行します。

  1. terraform プランを実行し、destroy フラグを指定します。

    terraform plan -destroy -out main.destroy.tfplan
    

    重要なポイント:

    • terraform plan コマンドは実行プランを作成しますが、実行しません。 代わりに、構成ファイルで指定された構成を作成するために必要なアクションが決まります。 このパターンを使用すると、実際のリソースに変更を加える前に、実行プランが期待と一致するかどうかを確認できます。
    • 省略可能な -out パラメーターを使用すると、プランの出力ファイルを指定できます。 -out パラメーターを使用すると、確認したプランが適用される内容であることが保証されます。
  2. terraform apply を実行して実行プランを適用します。

    terraform apply main.destroy.tfplan
    

Azure での Terraform のトラブルシューティング

Azure で Terraform を使用するときの一般的な問題のトラブルシューティング

次のステップ