👋

Terraformを本気で使う。Azureで【CI/CDお試し編】

2024/10/11に公開

はじめに

前回の記事でTerraform Cloudのサインアップを行い、クライアントPCからCLIを使ってAzureリソースをデプロイする流れをお試ししました。

https://zenn.dev/yotan/articles/09ddfbf6db24d1

今回はAzure DevOpsのRepos(Git)上に置いたtfファイルの更新時に自動でAzureにデプロイする流れをお試しします。

構成パターン

僕の考えた構成パターンとしては以下の3つがあります。

PATTERN 1:Terraform Cloudを使わない

img

よくある(?)構成ですかね。

Statesをこの場合ではAzure Storage Accountに保持するイメージです。

資格情報や接続情報、TerraformのVariablesなどの管理は以下になるでしょう。

  • Azure DevOps
    • Azure資格情報(Service Connection)
    • State管理用Storage Accountの接続情報
    • Terraform Variables

PATTERN 2:Terraform Cloudでパイプラインを回す

img

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でパイプラインを回す

img

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資格情報含む)は前回の記事で設定したものを引き続き使います。

https://zenn.dev/yotan/articles/09ddfbf6db24d1

Reposにファイルを準備する

前回の記事で作成したtfファイル類を、新規に作成したAzure DevOpsのReposの/templateディレクトリ内に放り込みます。(tagsを追加してみました)

template/providers.tf
terraform {
  cloud {
    organization = "組織名"
    hostname     = "app.terraform.io"
    workspaces {
      name = "ワークスペース名"
    }
  }
  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = "=4.1.0"
    }
  }
}

provider "azurerm" {
  features {}
}
template/variables.tf
variable "resource_group_name" {
  type = string
}

variable "location" {
  type = string
}
template/azuresource.tf
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」を選択します。

img

画面の指示通りなのですが、このページにあるAzure DevOpsのリンクをクリックすると、サインイン後にAPIキーの作成タブが開きます。

https://aex.dev.azure.com/app/register?mkt=en-US

img

Azure DevOps側の画面キャプチャがなくて恐縮ですが、Terraform Cloudポータル側に表示されている必須項目をそのままAzure DevOps側にコピペして、App IDとClient Secretを取得します。

再びTerraform Cloud側のName(任意の文字列), App ID, Client Secretを設定することで完了です。

img

無事VCS Providersに目的のAzure DevOpsが追加されました。

img

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」を設定

img

本来は特定のブランチやタグの指定など細かく要件に合わせて設定していくことになるでしょうが、今はお試しなので。。。

tfファイルの変更とトリガー確認

では、いつものVS Codeでtfファイルを変更してReposにpushしてみます。

tagに1行追加してみました。

img

Reposにpushして、ワークスペースの「Runs」を確認するとCurrent Runでterraform plan, applyが実行されました。

img

「States」のChange in this versionを確認すると、変更された部分がわかりやすく表示されますね!

img

もちろんAzureインフラ側の構成も変更されました。

img

おわりに

「PATTERN 3:Azure DevOpsでパイプラインを回す」の場合でも、Azure DevOps側のシークレットにTerraform CloudのAPIキーなどの情報を設定して、DevOpsパイプラインからはTerraformが提供しているモジュールを使えばそれほど難しくなく実現できると思います。

また機会があればこちらも試してみたいと思います。

以上です。

Discussion