🔰

【優しいTerraform入門 #1】Terraformの環境構築 for Azure

2024/02/12に公開

■前提条件

  • [必須] Azureサブスクリプションを利用できること
  • [必須] ローカルPCに Azure CLI をインストールしていること
  • [任意(Mac/Linux)] ローカルPCに Homebrew をインストールしていること

■Terraformの開発環境を構築しよう

Mac/Linux(Amazon Linux3)の環境設定の手順を紹介します。

※Windows環境の設定方法は、手動でインストールするパターンとChocolateyを使用するパターンがあります。セットアップ後、PATH環境変数を通してどのディレクトリでもterraformコマンドを利用できるようにしましょう!

Chocolateyによるインストール方法
choco install terraform

1.Terraformをインストールする

【公式】手動でインストールする方法もあります。実際の開発では、Terraformのバージョンを固定して管理することもあるため、バージョン管理ツールをインストールすることを推奨します。

Terraformの バージョン管理ツール(tfenv) をインストールします。

brew install tfenv

利用可能のTerraformバージョンを取得します。執筆段階では、1.7.3が最新版でした。

tfenv list-remote

Terraform(1.7.3)をインストールします。この状態ではまだ使用できません。

tfenv install 1.7.3

念の為、ローカルPC上で使用できるTerraformのバージョンを確認します。

tfenv list

Terraform(1.7.3)を使用するように切り替えます。

tfenv use 1.7.3

tfenv use を実行後、下記のような結果になっていればOKです!

2.サービスプリンシパルを発行する

Azureポータルサイトにアクセスし、Microsoft Entra IDコンソールからアプリケーションの登録を行います。

sp_for_terraform と名付けたサービスプリンシパルを作成します。

クライアントIDをメモします(後で使用します)。次にクライアントシークレットを発行していきます。

適当な説明文と有効期限を設定して、発行します。発行後のクライアントシークレットもメモします。

3.サービスプリンシパルにAzureロールを付与する

リソースを構築したいサブスクリプションのコンソールの「アクセス制御(IAM)」にアクセスし、サービスプリンシパルに共同作成者のAzureロールを付与します。キーコンテナに証明書追加やAKSクラスタへのアクセス付与などは専用のAzureロールが必要になるため、適宜 追加しましょう!

■TerraformでAzureリソースを構築しよう

1.Azureの資格情報をTerraformに設定する

設定する方法は、下記の3パターンあります。
① ローカルPCの環境変数に登録する
② tfvarsファイルにハードコーディングする
③ terraform コマンド時に指定する
本ブログでは②を紹介します(ブログで表現しやすいため😅)。

<任意の名前>.tfvars というファイルを作成します。下記のコードをコピペして、必要な値を設定します。

param.tfvars
provider_credentials = {
  subscription_id  = "<構築したい先のサブスクリプションID>"
  tenant_id        = "<Microsoft Entra ID>"
  sp_client_id     = "<クライアントID>"
  sp_client_secret = "<クライアントシークレット>"
}

設定後は、下記のようになります。

2.Terraformファイルを作成する

本ブログではストレージアカウントを作成するTerraformファイルを紹介します。
<任意の名前>.tfvars と同じ階層にmain.tfvariables.tfを作成します。

main.tf
provider "azurerm" {
  subscription_id = var.provider_credentials.subscription_id
  tenant_id       = var.provider_credentials.tenant_id
  client_id       = var.provider_credentials.sp_client_id
  client_secret   = var.provider_credentials.sp_client_secret
  features {}
}

locals {
  resource_group_name       = "rg-techblog"
  storage_account_diag_name = "satbdiag20240212"
}

resource "azurerm_resource_group" "je" {
  name     = local.resource_group_name
  location = var.location
}

# 診断ログの保管ストレージ
resource "azurerm_storage_account" "diag" {
  name                     = local.storage_account_diag_name
  resource_group_name      = azurerm_resource_group.je.name
  location                 = azurerm_resource_group.je.location
  account_tier             = "Standard"
  account_replication_type = "LRS"
}
variables.tf
variable "provider_credentials" {
  type = object({
    subscription_id  = string
    tenant_id        = string
    sp_client_id     = string
    sp_client_secret = string
  })
}

variable "location" {
  type    = string
  default = "japaneast"
}

3.Terraformでリソースを作成する

Terraformプロバイダを初期化(init)します。

terraform init

構築されるリソース情報の計画(plan)を実行します。

terraform plan -var-file=<任意の名前>.tfvars

リソース構築(apply)します。

terraform apply -var-file=<任意の名前>.tfvars

planと同じ結果が表示された後、リソース構築の確認を求められます。yesと入力し、実行してみます。

Plan: 2 to add, 0 to change, 0 to destroy.
Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.
Enter a value:

1~2分ぐらいで構築できるはず。成功後、下記の表示を確認します。

Apply complete! Resources: 2 added, 0 changed, 0 destroyed.

4.構築されたリソースを確認する

リソースグループとストレージアカウントを確認します。

5.構築されたリソースを削除する

削除する方法は、下記の2パターンあります。
① Terraformコマンドから削除する
② Azureポータルサイトから手動で削除する
本ブログでは①を紹介します。

リソースを削除します。

terraform destroy -var-file=<任意の名前>.tfvars

リソース削除の確認を求められます。yesと入力し、削除を行います。

Plan: 0 to add, 0 to change, 2 to destroy.
Do you really want to destroy all resources?
Terraform will destroy all your managed infrastructure, as shown above.
There is no undo. Only 'yes' will be accepted to confirm.
Enter a value: yes

成功後、下記の表示を確認します。

Destroy complete! Resources: 2 destroyed.

アクティビティログを確認すると、Terraformの操作アクションが記録されていますね!

Discussion