練習 - 佈建 Azure 資源
在本練習中,您將設定自動化工作流程來佈建您的 Terraform 資源。
存取範例應用程式
在本練習中,您將從範本建立 GitHub 存放庫,其中包含 Terraform 佈建的所有程式碼。
在 GitHub 上,前往存放庫的主頁面:
https://github.com/MicrosoftDocs/mslearn-java-petclinic-simplified
在檔案清單上方,選取 [使用此範本],然後選取 [建立新的存放庫]。
在 [存放庫名稱] 方塊中,輸入存放庫的唯一名稱。 請務必遵循 GitHub 存放庫的命名慣例。
確定已選取 [私人] 選項,然後選取 [建立存放庫]。
工作流程
在您已建立的存放庫專案目錄中,您將會看到一個名為 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/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 動作:
在內建的 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" }
認可您的變更。
驗證 GitHub Actions 組建
在您的存放庫中,選取 [動作],然後在左窗格中選取 TERRAFORM 工作流程。
在步驟清單中,確認已觸發 Terraform Init、Terraform Plan 和 Terraform Validate。
在步驟清單中展開 Terraform Apply,並確認:
Terraform 已建立資源並顯示 Azure 執行個體 URL。
您的 Azure 應用程式執行個體已可公開使用。
下一步
在下個練習中,您將使用 GitHub Actions 部署 Spring Boot 範例應用程式。
設定您的應用程式名稱和 Azure 資源群組
在您的 GitHub 存放庫中,執行下列動作以編輯您的 Azure 資源名稱:
在內建的 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" }
認可您的變更
建立 Azure Pipeline 以佈建您的 Terraform 資源
在我們的 Azure DevOps 專案中,我們會建立兩個不同的佈建管線,以加以組建與部署。 佈建管線會建立 Azure 資源,並在稍後透過組建與部署管線發行。
讓我們來建立第一個佈建管線:
選擇您的組織,然後選取 [新增專案]。
指定下列參數。
參數 描述 專案名稱 必要 描述 選擇性 能見度 選擇 [私人] 進階 版本控制 選擇 GIT 工作項目流程 選擇 [基本]。 選取 [建立專案] 以建立專案,並開啟歡迎頁面。
設定您的 Azure 管線服務連線
授予您的 Azure 管線存取您 Azure 帳戶的權限。
在 Azure DevOps 中,從專案設定頁面開啟 [服務連線] 頁面
選擇 [建立服務連線] 並選取 [Azure Resource Manager],然後選取 [下一步]。
選取 [服務主體 (自動)],然後選取 [下一步]。
指定下列參數。
參數 描述 範圍層級 選取 Azure 訂閱 訂用帳戶 選取您的現有 Azure 訂閱 資源群組 保留空白可讓使用者存取訂閱中定義的所有資源 連線名稱 必要。 您將在工作屬性中用來參考此服務連線的名稱。 此名稱不是您 Azure 訂閱的名稱。 選取 [儲存] 以建立連線。
建立 [佈建管線]
重要
本課程模組的必要條件需要您安裝 Terraform Azure Pipelines 擴充功能。 如果您尚未安裝,您的管線將不會執行。
設定您的專案和 Azure 的連線之後,您將必須建立 Azure Pipeline 來佈建您的 Terraform 資源。
在 Azure DevOps 中,移至您的專案,選取左側功能表中的 [管線],然後選取 [建立管線]。
- 在 [連線] 索引標籤上,選取 "GitHub" (YAML 檔案)。
- 如果系統提示您授權 GitHub 存取權,請輸入您的 [GitHub 認證],並使用所要求的許可權核准 Azure Pipelines 的存取權。
- 在 [選取] 索引標籤上,選取包含您 [範本] 的 [GitHub 存放庫]。
- 選取 [庫存] 索引標籤上的 [設定管線]。
- 在 [設定] 索引標籤上,選取以使用 [現有的 Azure Pipelines YAML 檔]。
- 在路徑中,選取 "/azuredevops/provision.yml"
- 選取 [繼續] 以前往 [檢閱] 索引標籤並檢閱您的管線。
在 [檢查您的管線 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 工作流程命令:init 或 apply
- backendAzure:用來儲存共用狀態的小組環境所需的必要欄位。
在您儲存並執行管線之前,我們需要新增要繫結至您服務連線的變數:
- 選取 [變數] (右上方),然後新增名為 "serviceConnection" 的變數,其值會是您服務連線的名稱。
- 選取 [確定] (右下角) 以儲存變數。
最後,選取 [執行] (右上角) 儲存並執行管線
監看管線執行
從 [作業] 追蹤組建程序的每個步驟。
當管線執行時,請監看您的第一個 Terraform init 階段,然後是您的第二個 apply 階段,從藍色 (執行) 移至綠色 (完成)。 您可以選取要監看管線運作的階段。
提示
檢查您的電子郵件。 您可能已收到組建通知,其中包含您的執行結果。 您可以使用這些通知,來瞭解每個組建是成功或失敗。
下一步
在下個練習中,您將使用 Azure Pipelines 來組建與部署您的 Spring Boot 範例應用程式。