Terraform を使用して Azure Firewall Standard を Premium に移行する

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

Terraform を使用して、クラシック ルールを使用する標準の Azure Firewall をデプロイしている場合は、Terraform 構成ファイルを変更して、ファイアウォールを Premium ファイアウォール ポリシーを使用する Azure Firewall Premium に移行できます。

この記事では、次のことについて説明します。

  • Terraform を使用して、クラシック ルールを使用する標準の Azure Firewall をデプロイする
  • ファイアウォール規則を Premium ファイアウォール ポリシーにインポートする
  • Terraform 構成ファイルを編集してファイアウォールを移行する

1. 環境を構成する

  • Azure サブスクリプション:Azure サブスクリプションをお持ちでない場合は、開始する前に無料アカウントを作成してください。

2. Terraform コードを実装する

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

  2. main.tf という名前のファイルを作成し、次のコードを挿入します。

    resource "azurerm_resource_group" "rg" {
      name     = "${random_pet.prefix.id}-rg"
      location = var.resource_group_location
    }
    
    resource "azurerm_virtual_network" "vnet" {
      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
    }
    
    resource "azurerm_subnet" "subnet" {
      name                 = "AzureFirewallSubnet"
      resource_group_name  = azurerm_resource_group.rg.name
      virtual_network_name = azurerm_virtual_network.vnet.name
      address_prefixes     = ["10.0.1.0/24"]
    }
    
    resource "azurerm_public_ip" "pip" {
      name                = "${random_pet.prefix.id}-pip"
      location            = azurerm_resource_group.rg.location
      resource_group_name = azurerm_resource_group.rg.name
      allocation_method   = "Static"
      sku                 = "Standard"
    }
    
    resource "azurerm_firewall" "main" {
      name                = "${random_pet.prefix.id}-fw"
      location            = azurerm_resource_group.rg.location
      resource_group_name = azurerm_resource_group.rg.name
      sku_name            = "AZFW_VNet"
      sku_tier            = "Standard"
    
      ip_configuration {
        name                 = "configuration"
        subnet_id            = azurerm_subnet.subnet.id
        public_ip_address_id = azurerm_public_ip.pip.id
      }
    }
    
    resource "azurerm_firewall_application_rule_collection" "app-rc" {
      name                = "${random_pet.prefix.id}-app-rc"
      azure_firewall_name = azurerm_firewall.main.name
      resource_group_name = azurerm_resource_group.rg.name
      priority            = 100
      action              = "Allow"
    
      rule {
        name = "testrule"
    
        source_addresses = [
          "10.0.0.0/16",
        ]
    
        target_fqdns = [
          "*.google.com",
        ]
    
        protocol {
          port = "443"
          type = "Https"
        }
      }
    }
    
    resource "azurerm_firewall_network_rule_collection" "net-rc" {
      name                = "${random_pet.prefix.id}-net-rc"
      azure_firewall_name = azurerm_firewall.main.name
      resource_group_name = azurerm_resource_group.rg.name
      priority            = 100
      action              = "Allow"
    
      rule {
        name = "dnsrule"
    
        source_addresses = [
          "10.0.0.0/16",
        ]
    
        destination_ports = [
          "53",
        ]
    
        destination_addresses = [
          "8.8.8.8",
          "8.8.4.4",
        ]
    
        protocols = [
          "TCP",
          "UDP",
        ]
      }
    }
    
    resource "random_pet" "prefix" {
      prefix = var.prefix
      length = 1
    }
    
  3. variables.tf という名前のファイルを作成し、次のコードを挿入します。

    variable "resource_group_location" {
      type        = string
      default     = "eastus"
      description = "Location of the resource group."
    }
    
    variable "prefix" {
      type        = string
      default     = "firewall-standard"
      description = "Prefix of the resource name"
    }
    

3. Terraform を初期化する

terraform init を実行して、Terraform のデプロイを初期化します。 このコマンドによって、Azure リソースを管理するために必要な Azure プロバイダーがダウンロードされます。

terraform init -upgrade

重要なポイント:

  • -upgrade パラメーターは、必要なプロバイダー プラグインを、構成のバージョン制約に準拠する最新バージョンにアップグレードします。

4. Terraform 実行プランを作成する

terraform plan を実行して、実行プランを作成します。

terraform plan -out main.tfplan

重要なポイント:

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

5. Terraform 実行プランを適用する

terraform apply を実行して、クラウド インフラストラクチャに実行プランを適用します。

terraform apply main.tfplan

重要なポイント:

  • terraform apply コマンドの例は、以前に terraform plan -out main.tfplan が実行されたことを前提としています。
  • -out パラメーターに別のファイル名を指定した場合は、terraform apply の呼び出しで同じファイル名を使用します。
  • -out パラメーターを使用しなかった場合は、パラメーターを指定せずに terraform apply を呼び出します。

6. ファイアウォール規則を Premium ポリシーにインポートする

これで、クラシック ルールを使用する標準のファイアウォールが作成されます。 次に、Premium ファイアウォール ポリシーを作成し、ファイアウォールから規則をインポートします。

  1. Azure portal で、 [リソースの作成] を選択します。
  2. [ファイアウォール ポリシー] を検索して、選択します。
  3. [作成] を選択します
  4. [リソース グループ] で、[test-resources] を選択します。
  5. [名前] に「prem-pol」と入力します。
  6. [リージョン] で [米国東部] を選択します。
  7. [ポリシー] レベルで、[Premium] を選択します。
  8. [次へ: DNS 設定] を選択し、[ルール] ページが表示されるまで続けます。
  9. [ルール] ページで、[Azure Firewall から規則をインポート] を選択します。
  10. [testfirewall] を選択し、[インポート] を選択します。
  11. [Review + create](レビュー + 作成) を選択します。
  12. [作成] を選択します

7. Terraform 構成ファイルを編集してファイアウォールを移行する

main.tf ファイルを開いて、次の変更を加えます。

  1. 次の 'data' セクションを追加します。

    data "azurerm_firewall_policy" "prem-pol" {
      name                 = "prem-pol"
      resource_group_name  = azurerm_resource_group.rg.name
    }
    
  2. ファイアウォール リソースを変更します。

     resource "azurerm_firewall" "fw" {
         name                = "testfirewall"
         location            = azurerm_resource_group.rg.location
         resource_group_name = azurerm_resource_group.rg.name
         firewall_policy_id  = data.azurerm_firewall_policy.prem-pol.id
         sku_tier            = "Premium"
    
     ip_configuration {
         name                 = "configuration"
         subnet_id            = azurerm_subnet.subnet.id
         public_ip_address_id = azurerm_public_ip.pip.id
     }
    }
    
  3. クラシック ルール コレクションを削除します。

    resource "azurerm_firewall_application_rule_collection" "app-rc" {
      name                = "apptestcollection"
      azure_firewall_name = azurerm_firewall.fw.name
      resource_group_name = azurerm_resource_group.rg.name
      priority            = 100
      action              = "Allow"
    
      rule {
        name = "testrule"
    
        source_addresses = [
          "10.0.0.0/16",
        ]
    
        target_fqdns = [
          "*.google.com",
        ]
    
        protocol {
          port = "443"
          type = "Https"
        }
      }
    }
    
    resource "azurerm_firewall_network_rule_collection" "net-rc" {
      name                = "nettestcollection"
      azure_firewall_name = azurerm_firewall.fw.name
      resource_group_name = azurerm_resource_group.rg.name
      priority            = 100
      action              = "Allow"
    
      rule {
        name = "dnsrule"
    
        source_addresses = [
          "10.0.0.0/16",
        ]
    
        destination_ports = [
          "53",
        ]
    
        destination_addresses = [
          "8.8.8.8",
          "8.8.4.4",
        ]
    
        protocols = [
          "TCP",
          "UDP",
        ]
      }
    }
    

8. 変更した Terraform 実行プランを適用する

  1. terraform plan -out main.tfplan
  2. terraform apply main.tfplan

9. 結果を確認する

  1. [test-resources] リソース グループを選択します。
  2. [testfirewall] リソースを選択します。
  3. ファイアウォール SKU が [Premium] になっていることを確認します。
  4. ファイアウォールが [prem-pol] ファイアウォール ポリシーを使用していることを確認します。 Premium ポリシーを使用する Azure Firewall Premium。

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

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

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

    terraform plan -destroy -out main.destroy.tfplan
    

    重要なポイント:

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

    terraform apply main.destroy.tfplan
    

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

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

次のステップ