Terraformを本気で使う。Azureで【CI/CDお試し編】
はじめに
前回の記事でTerraform Cloudのサインアップを行い、クライアントPCからCLIを使ってAzureリソースをデプロイする流れをお試ししました。
今回はAzure DevOpsのRepos(Git)上に置いたtfファイルの更新時に自動でAzureにデプロイする流れをお試しします。
構成パターン
僕の考えた構成パターンとしては以下の3つがあります。
PATTERN 1:Terraform Cloudを使わない
よくある(?)構成ですかね。
Statesをこの場合ではAzure Storage Accountに保持するイメージです。
資格情報や接続情報、TerraformのVariablesなどの管理は以下になるでしょう。
- Azure DevOps
- Azure資格情報(Service Connection)
- State管理用Storage Accountの接続情報
- Terraform Variables
PATTERN 2:Terraform Cloudでパイプラインを回す
Azure DevOpsはRepos(Git)しか使わない。別にGutHubでもよいですが。
Repositoryの更新をTerraform Cloudが検知して、HCP TerraformがAzureにデプロイを行います。
資格情報や接続情報、TerraformのVariablesなどの管理は以下になるでしょう。
- Azure DevOps
- 特になし
- Terraform Cloud
- Azure資格情報(Organization)
- Repos(Git)接続情報(VCS)
- Terraform Variables(Workspace)
PATTERN 3:Azure DevOpsでパイプラインを回す
Azure DevOpsのPipelineの機能をフルで利用できる構成です。
ただし、StateはTerraform Cloud側に持つため途中CLIで叩いてもよろしくやってくれそう。
資格情報や接続情報、TerraformのVariablesなどの管理は以下になるでしょう。
- Azure DevOps
- Terraform Cloud APIキー、organization、workspace名など
- Terraform Cloud
- Azure資格情報(Organization)
- Terraform Variables(Workspace)
お試しする
今回は一番手軽そうな「PATTERN 2:Terraform Cloudでパイプラインを回す」をお試しします。
Terraform CloudのOrganization, Workspaceの設定(VariablesやAzure資格情報含む)は前回の記事で設定したものを引き続き使います。
Reposにファイルを準備する
前回の記事で作成したtfファイル類を、新規に作成したAzure DevOpsのReposの/templateディレクトリ内に放り込みます。(tagsを追加してみました)
terraform {
cloud {
organization = "組織名"
hostname = "app.terraform.io"
workspaces {
name = "ワークスペース名"
}
}
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = "=4.1.0"
}
}
}
provider "azurerm" {
features {}
}
variable "resource_group_name" {
type = string
}
variable "location" {
type = string
}
resource "azurerm_resource_group" "main" {
name = var.resource_group_name
location = var.location
tags = {
"Environment" = "test"
"Author" = "ktkr"
}
}
Azure DevOpsのアプリケーションIDを払い出し
Terraform CloudポータルのOrganizationの設定から「VCS Providers」から「Add VCS Provider」を選択します。
その後「Azure DevOps」のプルダウンから今回はSaaSサービスとなる「Azure DevOps Services」を選択します。
画面の指示通りなのですが、このページにあるAzure DevOpsのリンクをクリックすると、サインイン後にAPIキーの作成タブが開きます。
https://aex.dev.azure.com/app/register?mkt=en-US
Azure DevOps側の画面キャプチャがなくて恐縮ですが、Terraform Cloudポータル側に表示されている必須項目をそのままAzure DevOps側にコピペして、App IDとClient Secretを取得します。
再びTerraform Cloud側のName(任意の文字列), App ID, Client Secretを設定することで完了です。
無事VCS Providersに目的のAzure DevOpsが追加されました。
WorkspaceにVCSを設定
目的のワークスペース(前回作成したTerraform Cloudのワークスペース)の「Settings」「Virsion Control」を開き、以下の項目を設定します。
- VCS
- Organizationの設定で追加したAzure DevOpsのVCSプロバイダを設定
- Terraform Working Directory
- リポジトリでtfファイル類を置いたディレクトリ(/template)
- Auto Apply
- 今回は全てチェック
- Automatic Run Triggering
- 今回はなんでもApplyするよう「Always trigger runs」を設定
本来は特定のブランチやタグの指定など細かく要件に合わせて設定していくことになるでしょうが、今はお試しなので。。。
tfファイルの変更とトリガー確認
では、いつものVS Codeでtfファイルを変更してReposにpushしてみます。
tagに1行追加してみました。
Reposにpushして、ワークスペースの「Runs」を確認するとCurrent Runでterraform plan, applyが実行されました。
「States」のChange in this versionを確認すると、変更された部分がわかりやすく表示されますね!
もちろんAzureインフラ側の構成も変更されました。
おわりに
「PATTERN 3:Azure DevOpsでパイプラインを回す」の場合でも、Azure DevOps側のシークレットにTerraform CloudのAPIキーなどの情報を設定して、DevOpsパイプラインからはTerraformが提供しているモジュールを使えばそれほど難しくなく実現できると思います。
また機会があればこちらも試してみたいと思います。
以上です。
Discussion