演習 - Azure リソースをプロビジョニングする
この演習では、Terraform リソースをプロビジョニングする自動ワークフローを構成します。
サンプル アプリケーションにアクセスする
この演習では、テンプレートから GitHub リポジトリを作成します。そこには Terraform のプロビジョニング用のすべてのコードが含まれます。
GitHub で、リポジトリのメイン ページに移動します。
https://github.com/MicrosoftDocs/mslearn-java-petclinic-simplified
ファイルの一覧の上にある [ このテンプレートを使用する] を選択し、[ 新しいリポジトリの作成] を選択します。
[ リポジトリ名 ] ボックスに、リポジトリの一意の名前を入力します。 GitHub リポジトリの名前付け規則に従ってください。
[プライベート] オプションが選択されていることを確認し、[リポジトリの作成] を選択します。
ワークフロー
作成したリポジトリのプロジェクト ディレクトリ内に、 terraform という名前のディレクトリと、その中に main.tf という名前のファイルが表示されます。
モジュールの構成を定義するために使用する可能性のあるいくつかのセクションを見てみましょう。
- プロバイダー: Terraform 構成ファイルは、プロバイダーの仕様で始まります。 Azure を使用する場合は、provider ブロックで 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 への認証に使用される機密情報を格納できます。
前の手順で必要な ID とシークレットを作成したら、このユニットの次の手順は、それらを GitHub プロジェクトのシークレット ストアに追加することです。
この演習では、次のシークレットを格納する必要があります。
AZURE_CLIENT_ID
AZURE_CLIENT_SECRET
AZURE_SUBSCRIPTION_ID
AZURE_TENANT_ID
シークレットを格納するには、フォークした GitHub リポジトリに移動し 、[設定] を選択し、[ シークレットと変数] を選択してから、左側のウィンドウで [アクション] を選択します。
サービス プリンシパルの作成時に返された値を使用して、4 つのシークレットを作成します。
次のスクリーンショットに示すように、必ず引用符 (" ") を付けずにシークレットを格納してください。
ワークフロー ファイル
プロジェクト ディレクトリ内には .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
このワークフローにより、次の操作が実行されます。
- 構成が正しい形式になっているかどうかが確認されます。
- すべての pull request に対してプランが生成されます。
- 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" }
変更をコミットする
Terraform リソースをプロビジョニングするための Azure パイプラインを作成する
Azure DevOps プロジェクトで、プロビジョニングと、ビルドおよびデプロイ用に 2 つの異なるパイプラインを作成します。 プロビジョニング パイプラインにより、後でビルドおよびデプロイのパイプラインを介してリリースされる Azure リソースが作成されます。
最初のプロビジョニング パイプラインを作成しましょう。
組織を選択し、[ 新しいプロジェクト] を選択します。
次のパラメーターを指定します。
パラメーター 説明 プロジェクト名 必須 説明 省略可能 視程 [プライベート] を選択する 上級 バージョン コントロール GIT を選択 する 作業項目プロセス [基本] を選択する [ プロジェクトの作成] を選択してプロジェクトを作成し、ウェルカム ページを開きます。
Azure パイプライン サービス接続を設定する
Azure パイプラインに Azure アカウントへのアクセスを許可しましょう。
Azure DevOps で、プロジェクト設定ページから [サービス接続 ] ページを開きます
[ サービス接続の作成 ] を選択し、[ Azure Resource Manager] を選択してから、[ 次へ] を選択します。
[ サービス プリンシパル (自動)] を選択し、[ 次へ] を選択します。
次のパラメーターを指定します。
パラメーター 説明 スコープのレベル Azure サブスクリプションを選択する サブスクリプション 既存の Azure サブスクリプションを選択します リソース グループ 空のままにして、サブスクリプション内で定義されているすべてのリソースにユーザーがアクセスできるようにします 接続名 必須。 タスクのプロパティでこのサービス接続を参照するために使用する名前。 この名前は、ご自分の Azure サブスクリプションの名前ではありません。 [保存] を選択して接続を作成します。
プロビジョニング パイプラインを作成する
重要
このモジュールの前提条件では、 Terraform Azure Pipelines 拡張機能をインストールする必要があります。 まだインストールしていない場合、パイプラインは実行されません。
プロジェクトを設定して Azure に接続した後、Azure パイプラインを作成して 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" という名前の変数を追加します。
- [ OK] (右下隅) を選択して変数を保存します。
最後に、[実行] (右上隅) を選択してパイプラインを保存して実行します
パイプラインの実行を監視する
[ジョブ] の下で、ステップごとにビルド プロセスをトレースします。
パイプラインが実行されたら、Terraform の 1 番目の init ステージ、次に 2 番目の apply ステージが、青 (実行中) から緑 (完了) に移行するのを監視します。 ステージを選択して、パイプラインの動作を監視することができます。
ヒント
メールを確認します。 実行の結果が記載されたビルド通知を既に受信している可能性があります。 これらの通知を使用して、各ビルドの成功または失敗を知ることができます。
次のステップ
次の演習では、Azure Pipelines を使用して、サンプルの Spring Boot アプリケーションをビルドしてデプロイします。