🛰️

TerraformからAzureを構築する【準備編】

タグ
TerraformAzure
公開日
目次

はじめに

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
image

tfファイルに記述してあるterraformとproviderの部分を読み込みこんで作業ディレクトリを初期化します。初回、もしくはこれらの設定が変更された場合は都度実行が必要になります。

変更内容の確認

terraform plan
image

tfファイルに記述してあるリソースと、tfstateファイルの差分を確認し表示します。確認のコマンドなので実際にリソースの作成や変更は行いません。

リソースの作成

terraform apply
image

tfファイルに記述してあるリソースと、tfstateファイルの差分を確認し表示したのち、実際にリソースの作成や変更を行うコマンドです。差分の確認後、実行する場合は明示的に「yes」と入力後Enterで実行されます。

Azureポータルで確認

実際に作成されたかどうかAzureポータルでも確認してみましょう。

image

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
image

terraformとprovider部分に変更はないためterraform initは必要ありません。tfファイルに記述してあるリソースと、tfstateファイルの差分が表示されます。

リソースの変更

terraform apply
image

terraform planと同じ差分が表示され明示的に「yes」と入力後Enterでタグの値が変更されます。

Azureポータルで確認

実際にタグが修正されたかどうかAzureポータルでも確認してみましょう。

image

後片付け

terraform destroy
image

検証用で作ったリソースについてはこのコマンドを実行してリソースの削除をしておきましょう。

まとめ

今回はterraformを使ってAzureリソースグループの作成やタグの変更を行いました。次回はAzureVMの作成や変更を行なっていきます。