分享方式:


快速入門:使用 Terraform 部署 Azure Bastion

在本快速入門中,您將瞭解如何使用 Terraform 在 Azure 入口網站 中自動部署 Azure Bastion。 若要這樣做,您會建立 Azure Bastion 主機及其對應的 Azure 資源,其中包括資源群組、虛擬網路、Azure Bastion 子網和公用 IP。 此設定可確保 Azure 服務的安全專用網環境。 下圖提供 Azure Bastion 部署的概觀:

顯示 Azure Bastion 架構的圖表。

部署 Azure Bastion 可讓您使用 RDP 和 SSH 來存取 Azure 入口網站 內的虛擬機。 此服務會直接在您的虛擬網路中布建,並支援該處的所有虛擬機,以減少對公用網路連線的暴露。 當您自動部署 Bastion 時,Bastion 會使用標準 SKU 進行部署。 若要改為使用 Bastion 開發人員進行部署,請參閱 快速入門:與 Azure Bastion 開發人員連線如需如何自定義 Azure Bastion 部署的詳細資訊,請參閱 Azure Bastion 部署指引

Terraform 可讓您定義、預覽和部署雲端基礎結構。 使用 Terraform 時,您可以使用 HCL 語法來建立設定檔。 HCL 語法可讓您指定雲端提供者 (例如 Azure) 和構成雲端基礎結構的元素。 建立設定檔之後,您可以建立執行計畫,讓您先預覽基礎結構變更,之後再部署。 驗證變更之後,您可以套用執行計畫來部署基礎結構。

  • 建立具有唯一名稱的 Azure 資源群組。
  • 建立具有指定名稱和位址的虛擬網路。
  • 在建立的虛擬網路內,特別針對 Azure Bastion 設定子網。
  • 為資源群組內的 Azure Bastion 配置靜態標準公用 IP。
  • 使用資源群組內的指定IP組態建構 Azure Bastion 主機。
  • 輸出資源群組的名稱和IP位址,加上Azure Bastion主機。

必要條件

實作 Terraform 程式碼

  1. 建立要在其中測試及執行範例 Terraform 程式代碼的目錄,並將其設為目前目錄。

  2. 建立名為 main.tf的檔案,並插入下列程序代碼:

    # Create Resource Group
    resource "random_pet" "rg_name" {
      prefix = var.resource_group_name_prefix
    }
    
    resource "azurerm_resource_group" "rg" {
      location = var.resource_group_location
      name     = random_pet.rg_name.id
    }
    
    # Create Virtual Network
    resource "azurerm_virtual_network" "vnet" {
      name                = "example-network"
      address_space       = ["10.0.0.0/16"]
      location            = azurerm_resource_group.rg.location
      resource_group_name = azurerm_resource_group.rg.name
    }
    
    # Create Subnet for Azure Bastion
    resource "azurerm_subnet" "bastion_subnet" {
      name                 = "AzureBastionSubnet"
      resource_group_name  = azurerm_resource_group.rg.name
      virtual_network_name = azurerm_virtual_network.vnet.name
      address_prefixes     = ["10.0.1.0/24"]
    }
    
    # Create Public IP for Azure Bastion
    resource "azurerm_public_ip" "bastion_pip" {
      name                = "example-pip"
      location            = azurerm_resource_group.rg.location
      resource_group_name = azurerm_resource_group.rg.name
      allocation_method   = "Static"
      sku                 = "Standard"
    }
    
    # Create Azure Bastion Host
    resource "azurerm_bastion_host" "bastion" {
      name                = "example-bastion"
      location            = azurerm_resource_group.rg.location
      resource_group_name = azurerm_resource_group.rg.name
    
      ip_configuration {
        name                 = "configuration"
        subnet_id            = azurerm_subnet.bastion_subnet.id
        public_ip_address_id = azurerm_public_ip.bastion_pip.id
      }
    }
    
  3. 建立名為 outputs.tf的檔案,並插入下列程序代碼:

    output "resource_group_name" {
      value = azurerm_resource_group.rg.name
    }
    
    output "bastion_host_name" {
      value = azurerm_bastion_host.bastion.name
    }
    
    output "bastion_host_ip" {
      value = azurerm_public_ip.bastion_pip.ip_address
    }
    
  4. 建立名為 providers.tf的檔案,並插入下列程序代碼:

    terraform {
      required_providers {
        azurerm = {
          source  = "hashicorp/azurerm"
          version = "~>3.0"
        }
        random = {
          source  = "hashicorp/random"
          version = "~>3.0"
        }
      }
    }
    
    provider "azurerm" {
      features {}
    }
    
  5. 建立名為 variables.tf的檔案,並插入下列程序代碼:

    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."
    }
    

初始化 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,不需要使用參數。

驗證結果

  1. 取得 Azure 資源群組名稱。

    resource_group_name=$(terraform output -raw resource_group_name)
    
  2. 取得 Azure Bastion 主機名。

    bastion_host_name=$(terraform output -raw bastion_host_name)
    
  3. 取得 Azure Bastion 主機 IP 位址。

    bastion_host_ip=$(terraform output -raw bastion_host_ip)
    
  4. 執行 az network bastion show 以檢視 Azure Bastion 主機。

    az network bastion show --name $bastion_host_name --resource-group $resource_group_name
    

清除資源

當您不再需要透過 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 時的常見問題進行疑難排解。

下一步

在本快速入門中,您已使用 Terraform 來建立 Azure 資源群組和其他免費的 Azure 資源,以設定 Azure Bastion 主機。 接下來,您可以探索下列資源,以深入瞭解 Azure Bastion 和 Terraform。