Young Leaves

Mac OS にTerraform をインストールしAzure 用の設定をする

今回はMac OS でパブリッククラウドなどのプロビジョニングツール・Terraform のインストール方法からTerraform でAzure リソースをプロビジョニングするための各種準備を行う方法について説明します。

実行環境

Terraform

1.6.6

Azure CLI

2.50.0

前提条件

  • Mac PC にHomebrew がインストールされていること
  • Azure アカウント、Terraform 用のサブスクリプションがあること
  • ローカルPC にAzure CLI がインストールされていること

Terraform とは

Terraform by HashiCorp

Terraform はHashiCorp が提供しているドメイン特化言語のプロビジョニングツールです。設定管理ツールやプロビジョニングツールには汎用言語とドメイン特化言語があり、汎用言語はChef やPulumi のようにプログラミング言語をベースに設定やリソースを定定義し、ドメイン特化言語はYAML ファイルや独自の言語を使って設定やリソースを定義します。Terraform はHCL (Hashicorp Configuration Language) という独自の言語を利用したドメイン特化言語のツールとなります。Terraform はAWS、Azure、GCP などのパブリッククラウドリソースから仮想マシン、コンテナなどのプロビジョニングと幅広い分野で利用できるため、多くの開発者が利用しています。

Terraform はローカルPC などにTerraform をインストールし、コマンド操作を行うことで拡張子・tf ファイルに定義され内容に沿ってリソースのプロビジョニングを行います。ローカルPC 上でのインストールを行いたくない、共同でTerraform を利用したいなどの場合は、クラウド上からTerraform を実行できるマネージドサービス・Terraform Cloud もあります。

What is Terraform Cloud?

Terraform のインストール・アップデート

Mac OS ではHomebrew を利用しTerraform をインストールできるため、Homebrew からTerraform の最新版をインストールします。

# HomebrewからTerraformをインストールする
brew tap hashicorp/tap
brew install hashicorp/tap/terraform

Terraform のインストール後、バージョンが最新ではない場合はHomebrew のパッケージを最新バージョンにアップデートし、Terraform の最新版をインストールします。インストール段階で既に最新バージョンであればこの手順はスキップします。

# Homebrewをアップデートする
brew update

# Terraformを最新バージョンにアップデートする
brew upgrade hashicorp/tap/terraform

Terraform のインストールを確認するため、CLI からterraform コマンドのバージョン確認コマンドを実行します。コマンド実行後、Terraform のバージョンが表示されることを確認します。

# Terraformのバージョンを表示する
terraform --version
hogehoge@machost ~ % terraform --version
Terraform v1.6.6
on darwin_amd64

tfenv などを使い複数のTerraform バージョンをインストールしている場合、terraform コマンドが存在しないエラーが発生することがあります。その場合はbrew link terraform コマンドでterraform コマンドの実行場所を設定すると解消されることがあります。terraform コマンドの配置場所やリンクに問題ない場合は環境変数・PATH が正しく設定されているかを確認します。

Terraform インストール後、タブ補完をしてくれるオートコンプリートパッケージをインストールします。今回はZsh での設定方法とします。

# Terraformのオートコンプリートパッケージをインストールする
terraform -install-autocomplete

Zsh で補完機能の初期設定が行われていない場合は以下コマンドを実行し初期化および有効化をします。

# Zshの補完機能を初期化する
# 安全でないディレクトリを無視するかどうかを聞かれるため「y」を入力する
autoload -Uz compinit && compinit -u
complete -C /usr/local/bin/terraform terraform

ただし、autoload コマンドはシェルを閉じると再度実行が必要なため、.zprofile にこちらのコマンドを追記しシェル起動時に実行されるようにしておくと便利です。

# Autocomplete configuration
autoload -Uz compinit && compinit -u

パッケージのインストールおよび補完機能の設定後はシェルの再起動を行い、terraform コマンドのタブ補完が行えることを確認します。

hogehoge@machost ~ % terraform <ここでタブを押す>
apply         get           metadata      show          version
console       graph         output        state         workspace
destroy       import        plan          taint
env           init          providers     test
fmt           login         push          untaint
force-unlock  logout        refresh       validate

Azure サブスクリプションID の確認

Terraform の準備完了後、Azure リソースのプロビジョニングを行う準備をします。今回はサブスクリプションに対しTerraform の実行を行うため、事前にAzure CLI でコマンドを実行しサブスクリプションID を取得します。

# Azureアカウントにログインする
az login

# Azure サブスクリプションのID を確認する
# 出力されたサブスクリプションIDを控える
az account show -n [Subscription名] --query "id" -o tsv

サービスプリンシパルの作成

Terraform からAzure に接続するにはサービスプリンシパルを作成し、サービスプリンシパルの内容を環境変数として設定します。Subscription_id は先程控えたサブスクリプションID の値を入力します。サービスプリンシパル作成後のappId、password、tenant の値を控えます。

# サービスプリンシパルを作成する
az ad sp create-for-rbac -n TerraformDemo --role="Contributor" --scopes="/subscriptions/[SubscriptionのID]"
{
  "appId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "displayName": "TerraformDemo",
  "password": "-Tf8Q~QEgtPtpSvzDeoQtlLffeQKIntLD9v8aaC",
  "tenant": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}

今回は環境構築用にContributor の権限を付与していますが、実務などで利用する場合は適切な権限に絞ったロールを与えるようにします。サービスプリンシパル作成後、サービスプリンシパル作成時に控えた値を環境変数として設定します。Zshの場合は「.zprofile」、Bashの場合は「.bash_profile」に登録します。

# Terraform service principal configuration
export ARM_CLIENT_ID="[appIdの値]"
export ARM_CLIENT_SECRET="[passwordの値]"
export ARM_SUBSCRIPTION_ID=[SubscriptionのID]"
export ARM_TENANT_ID="[tennantの値]"

設定後、.zprofile を再読込します。

# .zprofileを再読込する
source ~/.zprofile

動作確認

環境設定後、TerraformでAzure リソースを作成できるか確認します。

# 動作確認用のディレクトリを作成し移動する
mkdir terraform_demo && cd terraform_demo

ディレクトリ作成後、main.tf を作成し以下内容を記載します。

# Azure Providerを設定する
terraform {
  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = "~> 3.0.2"
    }
  }

  required_version = ">= 1.1.0"
}

provider "azurerm" {
  features {}
}

resource "azurerm_resource_group" "rg" {
  name     = "terraformdemorg"
  location = "japaneast"
}

main.tf 作成後、Terraform の構成を初期化します。

# Terraformの構成を初期化する
terraform init

Terraform 構成の初期化後、構文のフォーマット、構文チェックをします。構文チェックで「Success! The configuration is valid.」と表示されることを確認します。

# Terraformの構文のフォーマットをする
terraform fmt

# Terraformの構文チェックをする
## 「Success! The configuration is valid.」と表示されること
terraform validate

Terraform の構文チェックで問題なければ、Terraform の構成を適用します。適用時に確認の入力を求められるため、問題なければ「yes」を入力します。

# Terraformの構成を適用する
# 実行して良いか問われるため、問題なければ「yes」を入力する
terraform apply

実行後、Azure リソースを確認します。

# リソースグループを確認する
# リソースグループ名・terraformdemorgが表示され、リージョンがjapaneastであること
az group show -n terraformdemorg -o table

Terraform は構成を承認するとterraform.tfstate に状態を書き込みます。Terraform のstate 状態を確認するにはterraform show コマンドで確認できます。状態ファイルはリソースの状態によって変更されるため、Git などでバージョン管理を行う場合は「.gitignore」に「.terraform」「.tfstate」「tfstate.backup」を設定します。

# Terraformの状態を検査する
terraform show

動作確認後、Terraformで作成したリソースを破棄します。リソースの破棄はterraform destroy コマンドで行います。破棄時に確認の入力を求められるため、問題なければ「yes」を入力します。

# Terraformのリソースを破棄する
# 実行して良いか問われるため、問題なければ「yes」を入力する
terraform destroy

VSCode の拡張機能・Azure Terraform

Azure Terraform

Visual Studio Code の拡張機能・Azure Terraform を利用すると、Visual Studio Code 上からAzure CloudShell を利用しリモートでTerraform の実行を行うことができます。設定方法については以下ドキュメントを参照してください。

Azure Terraform Visual Studio Code 拡張機能のインストール

まとめ

  • Terraform はHashiCorp が提供しているドメイン特化言語のプロビジョニングツール、HCL という独自言語を使って定義する
  • Mac OS はHomebrew を使ってTerraform の最新版をインストールできる
  • Terraform でAzure リソースを作成するためにはサービスプリンシパルを作成し設定する必要がある

参考資料