APC 技術ブログ

株式会社エーピーコミュニケーションズの技術ブログです。

株式会社 エーピーコミュニケーションズの技術ブログです。

Terraform CloudでAzure IaC入門

はじめに

こんにちは、ACS事業部の吉川です。
Infrastrucure as Codeのツールとしてデファクトとなっている Terraform ですが、クラウド版が存在することをご存知でしょうか?

cloud.hashicorp.com

Terraform Cloudを使うことで、

  • 実行環境の統一
  • Stateファイルの一元管理
  • 実行履歴の可視化

といったメリットがあります。特にチームでTerraformを利用していく上でとても便利なサービスです。

本記事ではTerraform Cloudを使い始めるところから、Azureにリソースを作成するまでの手順を解説します。

Gitリポジトリの準備

Terraform Cloudを使う上で必ずしも必須ではないのですが、バージョン管理システムで差分管理するメリットは大きいのでGitリポジトリを作っておきましょう。
今回はGitHub上にPrivateリポジトリとして terraform-cloud-sample という名前のリポジトリを作成しました。
後ほどTerraform Cloudと連携させる際にリポジトリが作成直後の空の状態だとエラーとなってしまいます。そのためREADMEファイルだけ追加した状態としました。

今回の例ではGitHubを利用しますが、

  • GitLab
  • BitBacket
  • Azure Repos

にも対応しています。

アカウント作成

Terraform Cloudを使うにあたり、まずはアカウント作成が必要です。
Terraform Cloudにはいくつかの料金プランがありますが、「ちょっと触ってみよう」というのであればFreeプランで始めてみるのがよいでしょう。5人のユーザーまで無料で使えます。

www.hashicorp.com

アカウント作成は以下からできます。入力項目は、

  • 使いたいユーザー名
  • パスワード
  • メールアドレス

の3つだけです。

app.terraform.io

アカウント作成すると入力したメールアドレスに確認用メールが届きます。

文中にある clicking on this link のリンクを辿ってサインインすればOKです。

アカウント作成以降は以下のリンクからサインインできます。

app.terraform.io

Organization の作成

アカウント作成後の初回サインイン時は以下の Getting Started メニューが表示されます。

今回は真ん中の Start from scratch から始めます。
メニューをクリックするとOrganization作成画面に遷移します。Organizationの名前とメールアドレスを入力して作成しましょう。なおOrganizationはTerraform Cloud内でユニークな名前を付ける必要があります。

Workspace の作成

Organization を作成したら次は Workspaceを作成します。
Workspaceにはいくつかタイプがありますが、バージョン管理のリポジトリと組み合わせて使うのが一般的でしょう。Version control workflow を選択します。

次の画面で連携するリポジトリを選択します。今回はGitHubを使いますので GitHub を選択し、GitHub.com をクリックします。

その後GitHubの認証を行う画面が表示され、ポチポチと進めていくとリポジトリを選択するメニューが表示されます。冒頭で作成したGitHubリポジトリを選択しましょう。

最後に、Workspaceの名前とDescriptionを入力する画面が表示されます。入力してCreate workspace ボタンをクリックすることでWorkspaceの作成が完了します。

Azureの認証設定

Terraform CloudからAzureにリソースを作成するためには、サービスプリンシパルの設定が必要です。
つい先日、Terraform CloudのOpenID Connect(OIDC)対応がベータ扱いで開始されるとの報がありました。

www.hashicorp.com

developer.hashicorp.com

パスワード管理の煩雑さを考えると今後はコチラが主流になっていくでしょう。せっかくなので今回はこのOIDC方式で設定していきます。

下記のコマンドでサービスプリンシパルの作成とロールの設定を行います。
ここではサブスクリプションの共同作成者ロールを割り当てていますが、必要なシーンに合わせ適宜権限は調整してください。

# アプリケーションの作成
APP_ID=$(az ad app create --display-name tfcloud-test --query "appId" -o tsv)

# サービスプリンシパルの作成
TFC_AZURE_RUN_CLIENT_ID=$(az ad sp create --id $APP_ID --query appId -o tsv)

# サブスクリプション/テナントIDの取得
ARM_SUBSCRIPTION_ID=$(az account show --query id -o tsv)
ARM_TENANT_ID=$(az account show --query tenantId -o tsv)

# サブスクリプションに対する共同作成者ロールの割り当て
az role assignment create --assignee $TFC_AZURE_RUN_CLIENT_ID \
  --role contributor --subscription $ARM_SUBSCRIPTION_ID

作成が終わったらTerraform Cloud側に変数を登録していきます。必要な変数は以下の4つです。

変数名
TFC_AZURE_PROVIDER_AUTH true
TFC_AZURE_RUN_CLIENT_ID (サービスプリンシパルのクライアントID)
ARM_SUBSCRIPTION_ID (AzureのサブスクリプションID)
ARM_TENANT_ID (AzureのテナントID)

変数の設定はWorkspaceの Variables から行います。

変数のカテゴリーは Environment variable を選択し、ID系の登録の際は値を Sensitive としておくとよいでしょう。

最後にサービスプリンシパルにフェデレーション資格情報を登録します。
Azure ADの アプリの登録 から作成したサービスプリンシパルを選択し、証明書とシークレット メニューの フェデレーション資格情報 タブで 資格情報の追加 をクリックします。

以下の値を設定します。

項目名 設定値
フェデレーション資格情報のシナリオ その他の発行者
発行者 https://app.terraform.io
サブジェクト識別子 organization:<Organization名>:project:<Project名>:workspace:<Workspace名>:run_phase:
名前 <自由>

このフェデレーション資格情報は、terraform plan 用と terraform apply 用の2つ登録が必要です。
サブジェクト識別子のrun_phase の値をそれぞれ plan apply と変えて2つ登録を行います。

以上でTerraform CloudがAzure上にリソースを作成するための権限設定は完了です。

Plan と Apply

それでは実際にTerraform CloudからAzureリソースを作成してみましょう。
Terraform公式ドキュメントのサンプルを参考に、以下のようなコードを準備しました。

# Configure the Azure provider
terraform {
  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = "~> 3.25.0"
    }
  }

  required_version = ">= 1.1.0"
}

provider "azurerm" {
  features {}
}

resource "azurerm_resource_group" "rg" {
  name     = "rg-sample"
  location = "japaneast"
}

rg-sample という名前のリソースグループを東日本リージョンに作成するだけのシンプルなコードです。
これをGitHubのリポジトリにPushし、Terraform Cloud側のWorkspaceの画面で Start new plan をクリックします。

terraform plan がTerraform Cloud上で実行されました。出力結果を見て問題なければ、下部の Confirm & Apply をクリックしましょう。

その後terraform applyも動き出し、

Azure上にリソースグループが作成されます。

初回は手動でPlanを実行しましたが、以降はGitHubへのPushをトリガーに自動でPlanが走ります。
先ほどのコードにVNet作成の記述を追加しましょう。

# Configure the Azure provider
terraform {
  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = "~> 3.25.0"
    }
  }

  required_version = ">= 1.1.0"
}

provider "azurerm" {
  features {}
}

resource "azurerm_resource_group" "rg" {
  name     = "rg-sample"
  location = "japaneast"
}

resource "azurerm_virtual_network" "vnet" {
  name                = "vnet-sample"
  location            = azurerm_resource_group.rg.location
  resource_group_name = azurerm_resource_group.rg.name
  address_space       = ["10.0.0.0/16"]

  subnet {
    name           = "snet-sample"
    address_prefix = "10.0.0.0/24"
  }
}

GitHubへのPushをトリガーにして、自動でPlanが実行されています。

もしApplyまで自動で行いたい場合は、WorkspaceのSettingにて Apply MethodAuto apply に変更しましょう。

こうするとGitHubへのPushをトリガーにして、リソースの作成/変更が一気に行われます。

おわりに

Terraform Cloudのアカウント解説から実際の利用までを解説しました。
本記事で紹介している範囲であれば無料で利用可能ですので、実際に触ってみていただければと思います。

HashiCorpの有償機能を利用したいということであれば、弊社からご案内することも可能です。

www.ap-com.co.jp

お気軽にお問い合わせください。

私達ACS事業部はAzure・AKSなどのクラウドネイティブ技術を活用した内製化のご支援をしております。Terraform × Azureも得意分野です。

www.ap-com.co.jp

また、一緒に働いていただける仲間も募集中です!
今年もまだまだ組織規模拡大中なので、ご興味持っていただけましたらぜひお声がけください。

www.ap-com.co.jp

本記事の投稿者: 吉川 俊甫
AKS/ACAをメインにインフラ系のご支援を担当しています。 Shunsuke Yoshikawa - Credly