練習 - 佈建 Azure 資源

已完成

在本練習中,您將設定自動化工作流程來佈建您的 Terraform 資源。

存取範例應用程式

在本練習中,您將從範本建立 GitHub 存放庫,其中包含 Terraform 佈建的所有程式碼。

  1. 在 GitHub 上,前往存放庫的主頁面:

    https://github.com/MicrosoftDocs/mslearn-java-petclinic-simplified
    
  2. 在檔案清單上方,選取 [使用此範本],然後選取 [建立新的存放庫]

    螢幕擷取畫面顯示在 mslearn-java-petclinic-simplified 主頁面上的 [使用此範本] 按鈕。

  3. 在 [存放庫名稱] 方塊中,輸入存放庫的唯一名稱。 請務必遵循 GitHub 存放庫的命名慣例。

  4. 確定已選取 [私人] 選項,然後選取 [建立存放庫]

    螢幕擷取畫面顯示 [從中建立新的存放庫...] 頁面上的 [從範本建立存放庫] 按鈕。

工作流程

在您已建立的存放庫專案目錄中,您將會看到一個名為 terraform 的目錄,其中有一個名為 main.tf 的檔案。

讓我們看看幾個您可能會用來定義模組設定的區段:

  • 提供者:Terraform 組態檔會以提供者的規格開始。 若您使用的是 Azure,請在供應者區塊中指定 Azure 提供者 (azurerm)。
  • Terraform:您正在使用的 Terraform 版本。
  • 資料:從現有的服務取得資料。
  • 區域變數:使用函數和運算式產生新的變數。
  • 資源:描述資源和相依性。
  • 模組:重複使用性和複雜性的抽象層。

若要佈建應用程式和資料庫,我們只需要包含提供者資源區段。

接著,開啟 main.tf 檔案,並檢查大綱和註解:

provider "azurerm" {
  version = "=2.20.0"
  features {}
}

# Creates a resource group
resource "azurerm_resource_group" "main" {
  name     = var.resource_group
  location = var.location

  tags = {
    "Terraform" = "true"
  }
}

resource "random_password" "password" {
  length = 32
  special = true
  override_special = "_%@"
}

# Creates a MySQL server
resource "azurerm_mysql_server" "main" {
  name                              = "${azurerm_resource_group.main.name}-mysql-server"
  location                          = azurerm_resource_group.main.location
  resource_group_name               = azurerm_resource_group.main.name

  administrator_login               = "petclinic"
  administrator_login_password      = random_password.password.result

  sku_name   = "B_Gen5_1"
  storage_mb = 5120
  version    = "5.7"
  auto_grow_enabled                 = true
  backup_retention_days             = 7
  geo_redundant_backup_enabled      = false
  infrastructure_encryption_enabled = false
  public_network_access_enabled     = true
  ssl_enforcement_enabled           = true
  ssl_minimal_tls_version_enforced  = "TLS1_2"
}

# The database that your application will use
resource "azurerm_mysql_database" "main" {
  name                = "${azurerm_resource_group.main.name}_mysql_db"
  resource_group_name = azurerm_resource_group.main.name
  server_name         = azurerm_mysql_server.main.name
  charset             = "utf8"
  collation           = "utf8_unicode_ci"
}

# Enables the 'Allow access to Azure services' check box
resource "azurerm_mysql_firewall_rule" "main" {
  name                = "${azurerm_resource_group.main.name}-mysql-firewall"
  resource_group_name = azurerm_resource_group.main.name
  server_name         = azurerm_mysql_server.main.name
  start_ip_address    = "0.0.0.0"
  end_ip_address      = "0.0.0.0"
}

# Creates the plan that the service uses
resource "azurerm_app_service_plan" "main" {
  name                = "${var.application_name}-plan"
  location            = azurerm_resource_group.main.location
  resource_group_name = azurerm_resource_group.main.name
  kind                = "Linux"
  reserved            = true

  sku {
    tier = "PremiumV2"
    size = "P1v2"
  }
}

# Creates the service definition
resource "azurerm_app_service" "main" {
  name                = var.application_name
  location            = azurerm_resource_group.main.location
  resource_group_name = azurerm_resource_group.main.name
  app_service_plan_id = azurerm_app_service_plan.main.id
  https_only          = true

  site_config {
    always_on        = true
    linux_fx_version = "JAVA|8-jre8"
  }

  # Contains application-specific environment variables
  app_settings = {
    "WEBSITES_ENABLE_APP_SERVICE_STORAGE" = "false"

    "SPRING_PROFILES_ACTIVE"     = "mysql"
    "SPRING_DATASOURCE_URL"      = "jdbc:mysql://${azurerm_mysql_server.main.fqdn}:3306/${azurerm_mysql_database.main.name}?useUnicode=true&characterEncoding=utf8&useSSL=true&useLegacyDatetimeCode=false&serverTimezone=UTC"
    "SPRING_DATASOURCE_USERNAME" = "${azurerm_mysql_server.main.administrator_login}@${azurerm_mysql_server.main.name}"
    "SPRING_DATASOURCE_PASSWORD" = azurerm_mysql_server.main.administrator_login_password
  }
}

使用 Terraform 設定您的 GitHub Actions 工作流程

讓我們將您的 GitHub 工作流程存取權提供給您的 Azure 帳戶。

在 Azure CLI 中,執行下列命令來建立服務主體:

重要

以您要使用的服務主體名稱取代 <yourServicePrincipalName>

az ad sp create-for-rbac --name "<yourServicePrincipalName>" --role contributor --scopes /subscriptions/<subscriptionId> --sdk-auth

上述命令會傳回下列 JSON。 複製這些位址,以便在下個步驟中使用:

{
  "clientId": "XXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXXX",
  "clientSecret": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
  "subscriptionId": "XXXXXXXXX-XXXXX-XXXX-XXXX-XXXXXXXXXXXXX",
  "tenantId": "XXXXXXXX-XXXXX-XXXX-XXXX-XXXXXXXXXXX",
  ...
}

GitHub 祕密

您的 GitHub 存放庫有一個稱為 [秘密] 的功能,您可以儲存 Terraform 用來驗證 Azure 的敏感性資訊。

當您在上個步驟中建立必要的識別碼和密碼之後,本單元中的下個步驟是將它們新增至 GitHub 專案中的 [秘密] 存放區。

針對此練習,您需要儲存下列秘密:

  • AZURE_CLIENT_ID
  • AZURE_CLIENT_SECRET
  • AZURE_SUBSCRIPTION_ID
  • AZURE_TENANT_ID

若要儲存秘密,請移至您 GitHub 存放庫的分支,並選取 [設定],然後在左窗格中選取 [秘密和變數] 並選取 [動作]

使用建立「服務主體」時所傳回的值,建立四個秘密。

請務必儲存沒有引號 (" ") 的秘密,如下列螢幕擷取畫面所示:

螢幕擷取畫面顯示 [GitHub 設定] 下 [秘密] 窗格的已儲存秘密。

工作流程檔案

在您的專案目錄中有一個名為 .github/workflows 的目錄,其中有個名為 main.yml 的檔案。

main.yml 檔案是 GitHub 工作流程。 它會使用您已設定的秘密,將應用程式部署至您的 Azure 訂閱。

main.yml工作流程檔案中,您會發現下列內容:

name: TERRAFORM

on:
  push:
    branches: [ main ]
    paths:
    - 'terraform/**'
  pull_request:
    branches: [ main ]
    paths:
    - 'terraform/**'

  workflow_dispatch:
jobs:
  terraform:
    runs-on: ubuntu-latest

    env:
      ARM_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID }}
      ARM_CLIENT_SECRET: ${{secrets.AZURE_CLIENT_SECRET}}
      ARM_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
      ARM_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }}

    defaults:
      run:
        working-directory: ./terraform
    steps:
      - uses: actions/checkout@v2

      - name: Setup Terraform
        uses: hashicorp/setup-terraform@v1

      - name: Terraform Init
        run: terraform init

      - name: Terraform Plan
        run: terraform plan

      - name: Terraform Apply
        run: terraform apply -auto-approve

此工作流程會執行下列動作:

  • 它會檢查設定的格式是否正確。
  • 它會針對每個提取要求產生規劃內容。
  • 當您更新 terraform目錄中的檔案時,它會觸發設定。

注意

您也可以前往 [動作]、選取 [Terraform] 工作流程,然後選取 [重新執行現有的工作],來觸發 GitHub Actions 的工作流程。

觸發工作流程

接下來,在您的存放庫中,執行下列動作來觸發您的 GitHub 動作:

  1. 在內建的 GitHub 文字編輯器或您選擇的編輯器中,編輯 terraform/variables.tf,如下所示:

    a. 將 "CHANGE_ME_RESOURCE_GROUP" 變更為您的資源群組名稱。
    b. 將 "CHANGE_ME_APP_NAME" 變更為您的應用程式名稱。 請確定您的應用程式名稱是唯一的。

    variable "resource_group" {
      description = "The resource group"
      default = "CHANGE_ME_RESOURCE_GROUP"
    }
    
    variable "application_name" {
      description = "The Spring Boot application name"
      default     = "CHANGE_ME_APP_NAME"
    }
    
    variable "location" {
      description = "The Azure location where all resources in this example should be created"
      default     = "westeurope"
    }
    
  2. 認可您的變更。

驗證 GitHub Actions 組建

  1. 在您的存放庫中,選取 [動作],然後在左窗格中選取 TERRAFORM 工作流程。

  2. 在步驟清單中,確認已觸發 Terraform InitTerraform PlanTerraform Validate

    螢幕擷取畫面顯示 Terraform 工作流程執行結果。

  3. 在步驟清單中展開 Terraform Apply,並確認:

  • Terraform 已建立資源並顯示 Azure 執行個體 URL。

  • 您的 Azure 應用程式執行個體已可公開使用。

    螢幕擷取畫面顯示 Azure 應用程式執行個體已可公開使用。

下一步

在下個練習中,您將使用 GitHub Actions 部署 Spring Boot 範例應用程式。

設定您的應用程式名稱和 Azure 資源群組

在您的 GitHub 存放庫中,執行下列動作以編輯您的 Azure 資源名稱:

  1. 在內建的 GitHub 文字編輯器或您選擇的編輯器中,編輯 terraform/variables.tf,如下所示:

    a. 將 "<CHANGE_ME_RESOURCE_GROUP>" 變更為您的資源群組名稱。
    b. 將 "<CHANGE_ME_APP_NAME>" 變更為您的應用程式名稱。 請確定您的應用程式名稱是唯一的。

    variable "resource_group" {
      description = "The resource group"
      default = "<CHANGE_ME_RESOURCE_GROUP>"
    }
    
    variable "application_name" {
      description = "The Spring Boot application name"
      default     = "CHANGE_ME_APP_NAME"
    }
    
    variable "location" {
      description = "The Azure location where all resources in this example should be created"
      default     = "westeurope"
    }
    
  2. 認可您的變更

建立 Azure Pipeline 以佈建您的 Terraform 資源

在我們的 Azure DevOps 專案中,我們會建立兩個不同的佈建管線,以加以組建與部署。 佈建管線會建立 Azure 資源,並在稍後透過組建與部署管線發行。

讓我們來建立第一個佈建管線:

  1. 選擇您的組織,然後選取 [新增專案]

  2. 指定下列參數。

    參數 描述
    專案名稱 必要
    描述 選擇性
    能見度 選擇 [私人]
    進階
    版本控制 選擇 GIT
    工作項目流程 選擇 [基本]
  3. 選取 [建立專案] 以建立專案,並開啟歡迎頁面。

螢幕擷取畫面顯示新 Azure 專案表單。

設定您的 Azure 管線服務連線

授予您的 Azure 管線存取您 Azure 帳戶的權限。

  1. 在 Azure DevOps 中,從專案設定頁面開啟 [服務連線] 頁面

  2. 選擇 [建立服務連線] 並選取 [Azure Resource Manager],然後選取 [下一步]

  3. 選取 [服務主體 (自動)],然後選取 [下一步]

  4. 指定下列參數。

    參數 描述
    範圍層級 選取 Azure 訂閱
    訂用帳戶 選取您的現有 Azure 訂閱
    資源群組 保留空白可讓使用者存取訂閱中定義的所有資源
    連線名稱 必要。 您將在工作屬性中用來參考此服務連線的名稱。 此名稱不是您 Azure 訂閱的名稱。
  5. 選取 [儲存] 以建立連線。

建立 [佈建管線]

重要

本課程模組的必要條件需要您安裝 Terraform Azure Pipelines 擴充功能。 如果您尚未安裝,您的管線將不會執行。

設定您的專案和 Azure 的連線之後,您將必須建立 Azure Pipeline 來佈建您的 Terraform 資源。

在 Azure DevOps 中,移至您的專案,選取左側功能表中的 [管線],然後選取 [建立管線]

  1. [連線] 索引標籤上,選取 "GitHub" (YAML 檔案)。
  2. 如果系統提示您授權 GitHub 存取權,請輸入您的 [GitHub 認證],並使用所要求的許可權核准 Azure Pipelines 的存取權。
  3. [選取] 索引標籤上,選取包含您 [範本] 的 [GitHub 存放庫]。
  4. 選取 [庫存] 索引標籤上的 [設定管線]
  5. [設定] 索引標籤上,選取以使用 [現有的 Azure Pipelines YAML 檔]
  6. 在路徑中,選取 "/azuredevops/provision.yml"
  7. 選取 [繼續] 以前往 [檢閱] 索引標籤並檢閱您的管線。

螢幕擷取畫面顯示新 Azure Pipeline 表單。

在 [檢查您的管線 YAML] 畫面上,檢查將用來建立管線的 Yaml 檔案。

name: Provision Resources

trigger: none

pool:
  vmImage: 'ubuntu-latest'

steps:

# Initialize the Terraform environment and bind to your Service Connection
- task: TerraformTaskV1@0
  inputs:
    provider: 'azurerm'
    command: 'init'
    workingDirectory: $(Build.Repository.LocalPath)/terraform
    backendServiceArm: $(serviceConnection)
    backendAzureRmResourceGroupName: $(serviceConnection)
    backendAzureRmStorageAccountName: $(serviceConnection)
    backendAzureRmContainerName: 'tfstate'
    backendAzureRmKey: 'tf/terraform.tfstate'

# Apply the Terraform config and deploy to Azure
- task: TerraformTaskV1@0
  inputs:
    provider: 'azurerm'
    command: 'apply'
    workingDirectory: $(Build.Repository.LocalPath)/terraform
    backendAzureRmContainerName: 'tfstate'
    backendAzureRmKey: 'tf/terraform.tfstate'
    environmentServiceNameAzureRM: $(serviceConnection)

讓我們看看在設定中使用的幾個欄位:

  • serviceConnection:您先前設定的 Azure PipeLine 服務連線
  • 命令:您的 Terraform 工作流程命令:initapply
  • backendAzure:用來儲存共用狀態的小組環境所需的必要欄位。

在您儲存並執行管線之前,我們需要新增要繫結至您服務連線的變數:

  1. 選取 [變數] (右上方),然後新增名為 "serviceConnection" 的變數,其值會是您服務連線的名稱。
  2. 選取 [確定] (右下角) 以儲存變數。

顯示新 [服務主體] 變數的螢幕擷取畫面。

最後,選取 [執行] (右上角) 儲存並執行管線

監看管線執行

從 [作業] 追蹤組建程序的每個步驟。

當管線執行時,請監看您的第一個 Terraform init 階段,然後是您的第二個 apply 階段,從藍色 (執行) 移至綠色 (完成)。 您可以選取要監看管線運作的階段。

螢幕擷取畫面顯示新的 Azure Pipeline 執行。

提示

檢查您的電子郵件。 您可能已收到組建通知,其中包含您的執行結果。 您可以使用這些通知,來瞭解每個組建是成功或失敗。

下一步

在下個練習中,您將使用 Azure Pipelines 來組建與部署您的 Spring Boot 範例應用程式。