はじめに
Azureポータルでリソースを作っているとこんなことを思う事があります。
・手順をメモしていても、もう一度同じ構成で作る自信がない
・設定項目をテキストベースで検索したり比較したりしたい
・いつ何を変更したか履歴を残したい
・誰がやっても同じものができるような仕組みが欲しい
・開発、ステージング、本番と全く同じ構成を作る仕組みが欲しい
これらを実現するにはAzureポータルだけでは難しくコードベースの環境構築(Infrastructure as Code)を行なっていく必要があります。
想定する読者
・Azureポータルからリソースを作る事ができる
・Infrastructure as Codeって興味あるけど難しそうと思っている
AzureでもARMテンプレートというコードベースでリソース管理ができる機能がありますが今回はTerraformを使っていきたいと思います。
Terraformをインストールする
以下のリンクから、自分のOSを選択してインストールを行います。
https://developer.hashicorp.com/terraform/downloads
バージョン確認を行い以下のような表示がされていればインストール完了です
teraffromtarou@MacBook-Pro terraform % terraform -v
Terraform v1.3.4
on darwin_arm64
Your version of Terraform is out of date! The latest version
is 1.3.6. You can update by downloading from https://www.terraform.io/downloads.html
※2022/12/13現在terraform最新はバージョンは1.3.6です
Terraformに必要な最小構成のファイル
terraform (作業ディレクトリ)
∟ main.tf (tfファイル)
∟ terraform.tfstate (tfstateファイル) <= 自動で生成されます。
terraform (作業ディレクトリ)
Terraformを実行するためのディレクトリを作成します。
main.tf (tfファイル)
作成/管理したいリソースを記述するファイルです。
terraform { # terraformの設定
backend "local" {} # localのtfstateファイルを読み込みます。
required_version = "1.3.4" # Terraformのバージョンを指定
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = "3.34.0" # hashicorpのバージョンを指定
}
}
}
provider "azurerm" { # providerの設定、awsなどを使う場合はここを変更
features {}
}
resource "azurerm_resource_group" "resource-group" { # 作成するリソースの種類とtfファイル上での名前を指定
location = "japaneast" # ロケーションの指定
name = "**********" # リソースの名前を指定 ※サブスクリプション毎にユニークな値で指定する
tags = { # タグの指定、複数指定可能
ENVIRONMENT = "dev"
}
}
※実際に実行する場合はname = "**********" の部分を重複しないリソースグループ名に変更して下さい。※2022/12/13現在hashicorp/azurerm最新はバージョンは3.35.0です
terraform.tfstate (tfstateファイル)
tfファイルでリソースを作成すると自動的に生成されるファイルです。
terraformは実行される度にtfstateファイルを確認し、tfファイルと差分があればその分をリソースに反映します。
Terraformでリソースを作成する
今回は一番シンプルなリソースという事でリソースグループを作成してみます。
Azureへのログイン
az login
terraromからAzureリソースを操作するために、Azureにログインしておく必要があります。コマンドを実行するとブラウザから認証用ページが開くので実行するとコード側でログインユーザの情報が表示されます。
browser is available or if the web browser fails to open, use device code flow with `az login --use-device-code`.
[
{
"cloudName": "AzureCloud",
"homeTenantId": "fasdfasdfasdfasdfasdfasdfasf",
"id": "asdfasdfasdfasdfasdfasdfa",
"isDefault": true,
"managedByTenants": [],
"name": "Microsoft Azure スポンサー プラン",
"state": "Enabled",
"tenantId": "adfasdfasdfasdfasdfad",
"user": {
"name": "asdasdfasdfasdfasdfadsf",
"type": "user"
}
}
]
作業ディレクトリの初期化
terraform init
tfファイルに記述してあるterraformとproviderの部分を読み込みこんで作業ディレクトリを初期化します。初回、もしくはこれらの設定が変更された場合は都度実行が必要になります。
変更内容の確認
terraform plan
tfファイルに記述してあるリソースと、tfstateファイルの差分を確認し表示します。確認のコマンドなので実際にリソースの作成や変更は行いません。
リソースの作成
terraform apply
tfファイルに記述してあるリソースと、tfstateファイルの差分を確認し表示したのち、実際にリソースの作成や変更を行うコマンドです。差分の確認後、実行する場合は明示的に「yes」と入力後Enterで実行されます。
Azureポータルで確認
実際に作成されたかどうかAzureポータルでも確認してみましょう。
Terraformでリソースを変更する
tfファイルを変更して作成したリソースグループのタグ情報を変更してみましょう。
tfファイルの修正
タグの値を変更します。
terraform {
backend "local" {}
required_version = "1.3.4"
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = "3.34.0"
}
}
}
provider "azurerm" {
features {}
}
resource "azurerm_resource_group" "resource-group" {
location = "japaneast"
name = "**********"
tags = {
ENVIRONMENT = "prod" # <= devからprodに変更
}
}
変更内容の確認
terraform plan
terraformとprovider部分に変更はないためterraform initは必要ありません。tfファイルに記述してあるリソースと、tfstateファイルの差分が表示されます。
リソースの変更
terraform apply
terraform planと同じ差分が表示され明示的に「yes」と入力後Enterでタグの値が変更されます。
Azureポータルで確認
実際にタグが修正されたかどうかAzureポータルでも確認してみましょう。
後片付け
terraform destroy
検証用で作ったリソースについてはこのコマンドを実行してリソースの削除をしておきましょう。
まとめ
今回はterraformを使ってAzureリソースグループの作成やタグの変更を行いました。次回はAzureVMの作成や変更を行なっていきます。