Azureで初めてのTerraform(インストール、デプロイ、削除)

2021-05-10Azure,Resource Group,Terraform

Azureを対象にTerraformのインストールからリソースのデプロイから削除までの一連の操作手順について纏めてみました。

    • WindowsへのTerraformインストール
    • Terraformの構成ファイル説明
    • Terraformの基本コマンドの説明
    • リソースグループを例にデプロイから削除までの一連の手順を確認
    • tfstateファイルの確認

※Windows10を利用しています。Terraformはv1.5.7を利用しています。

Terraform関連で実施した内容はこちらに纏めています。
併せて見て頂けると幸いです。

Terraformの記事一覧

※2023年9月に加筆修正しています。Terraformのバージョンも新しくしています。

スポンサーリンク

WindowsにTerraformをインストール

Terraformとは?

TerraformとはHashiCorp社が提供するIaC(Infrastructure as Code)ツールになります。
コードを利用してAzureなどのパブリッククラウドのリソースをデプロイする事が出来ます。

Terraform(HashiCorp公式サイト)

AWS、Azure、GCP、OCI多くのパブリッククラウドだけではなくDockerなど多くのプロバイダーに対応しています。

Providers

Terraformはクラウド版としても提供されています。

Terraform Cloud

Terraformをダウンロードしてインストール

Window10端末へTerraformをインストールします。

※Terraformにはクラウド版もあります。

Terraformインストール

HashiCorp社のTerraformを表示します。

Terraform(HashiCorp)

Downloadを選択します。

Terraformのダウンロードページが表示されます。

Terraformダウンロードページ

WindowsのAMD64(64bit版)をクリックするとダウンロードが開始されます。

※Windows環境が32bitの場合は386を選択します。

ZIPファイル(terraform_1.5.7_windows_amd64.zip)がダウンロードされています。

※2023年9月24日現在の最新バージョンになります。

Zipファイルを解凍します。
ファイル保存先は任意です。

※解凍先をC:\Program Files\Terraform-1_5_7としています。

解凍先ディレクトリ内にTerraform.exeというファイルが出来ます。

TerraformのPATH設定

Terraformはコマンドラインで実行します。
TerraformインストールディレクトリへのPATH設定します。

PATH設定

検索バーでシステムの詳細設定と入力します。
システムの詳細設定の表示メニューを選択します。

※コントロールパネル>システム>詳細情報で右側にあるシステムの詳細設定からも表示出来ます。

 

システムのプロパティで詳細設定タブを選択します。
環境変数を選択します。

TerraformへのPATH設定を行います。
システム環境変数で編集を選択します。

新規を選択し環境変数を追加します。
PATHにはTerraformの解凍先(terraform.exeファイルがある場所)を指定します。
OKを選択します。

※今回の場合はC:\Program Files\Terraform-1_5_7になります。

PowerShellでterraform -vとコマンド入力するとTerraformのバージョンが表示されます。
terraform -helpとコマンド入力するとTerraformで利用できるコマンドの説明が表示されます。

表示されればTerraformのインストールは完了しています。

Azure CLIをインストール

Terraformを使ってAzureリソース操作を行う為にはAzureへのサインイン(認証)が必要です。
対話形式での認証を行う場合はAzure CLIを利用します。
Azure CLIのインストールについてはこちらを参照願います。

Visual Studio CodeでTerraformのファイルを扱う

Visual Studio Code(VSCode)ではTerraformの拡張機能が提供されています。
拡張機能をインストールしておくと作業が便利になります。

拡張機能追加

左側のメニューで拡張機能を選択します。
検索欄にTerraformと入力します。
HashiCorp TerraformとAzure Terraformを選択しインストールします。

Visual Studio Code(VSCode)自体のインストールはこちらを参照ください。

—–

Terraformの基本コマンドやファイルの記述方式

基本コマンド(初期化、計画、デプロイ、削除)

Teraformを使ってリソース操作する場合の大きな流れは、初期化、デプロイ(構文チェック、計画、デプロイ)、削除になります。

  • 初期化:initでTerraform初期化して必要なモジュールをダウンロード
  • デプロイ:planでリソースデプロイ計画確認、applyでAzureリソースをデプロイ
  • 削除:destroyで作成したAzureリソースを削除
基本コマンド

terraform init

Terraform利用開始時に実行するコマンドです。
ワークスペースを初期化するコマンドで必須のコマンドになります。
プロバイダーやリソースの種類が増えた場合にも実行が必要です。
.terraformと言うディレクトリが作成されます。
.terraformディレクトリ内にリソースデプロイ時に必要なファイルがダウンロードされます。

terraform validate

Terraformの構文チェックのコマンドです。
terraform planでも実行されます。

terraform plan

リソースデプロイ計画確認コマンドです。
terraform apply実行時の変更内容を確認するコマンドです。
新規デプロイされるリソース、変更されるリソース、削除されるリソースが表示されます。
事前の確認のみとなりリソースのデプロイ自体は行われません。

terraform apply

Terraformのリソースデプロイ実行コマンドです。
リソースブロックに指定した設定内容に基づきリソースをデプロイします。
リソースデプロイ前にterraform planも実行されます。
terraform destroy Terraformのリソース削除コマンドです。
リソースブロックに指定した設定内容に基づきリソースを削除します。
リソース削除前にterraform planも実行されます。

※実際の運用上で利用するコマンドは様々あります。今回はオプションを含めて最低限の利用にしております。

tfファイルの記述方式(HCL形式)

Terraformでデプロイするリソースの情報はtfファイルに記載します。
独自 DSL である HCL 形式(HashiCorp Configuration Language=HashiCorp 構成言語)にて記載します。
Block単位で定義します。

      • Block Type:そのブロックが何を指すのかと言う意味
      • Block Labels:ブロックの定義
      • Arguments:定義された値

各プロバイダー単位でリソースの作成方法は定義されています。
Azureの場合はAzure Providerに記載されています。

Azure Provider

リソースグループの場合に関する書き方についても記載があります。

azurerm_resource_group

リソースの記述例

Block typeがresourceとなっています。
これは作成するリソースを定義するブロックであることを示しています。
Block Labelsが"azurerm_resource_group" “test-rg"となっています。
“azurerm_resource_group"はAzureのリソースグループの定義と言う事を示しています。
“demo"と言う名前で呼び出すよう定義しています。
Argumentsはリソースの値になります。

—–

Terraformを使ってリソースグループをデプロイ

必要なブロック構成について

最低限必要なTerraform ブロック構成は3つに分けられます。
Azureリソースグループを例に記載します。

    • Terraform Block
      • Terraform自体の動作を指定するブロックです
      • Terraform自体で使用するバージョン等を記載します
    • Provider Block
      • 使用するプロバイダーを指定します
      • 今回の場合はAzureを指定しています。
    • Resource Block
      • 実際に作成するリソースを定義します
      • 今回の場合はリソースグループ名やリージョン等を定義します

リソースグループデプロイ用のTerraform構成ファイル

リソースグループをデプロイする場合の構成ファイルです。
今回は1つのファイルにすべて纏めています。

    • terraform Blockについてはこちらを参照しています。
    • provider Blockについてはこちらを参照しています。
    • resource Block自体の解説についてはこちら。Azureリソースについてはこちらを参照しています。

ファイルの拡張子は.tfとします。
Terraformはコマンド実行ディレクトリの拡張子が.tfのファイルを読み込んで実行します。

今回はC:\Program Files\Terraform-1_5_7配下にtestというディレクトリを作成して保管しています。
ファイル名はrg.tfとしています。

※Terraformの管理ディレクトリはterraform.exeの保管先と関係なく任意で指定可能です。
※今回はazurermのバージョンを3.74にしています。バージョンは対象のリソースに合わせて指定します。

リソースグループの例

terraform Blockでrequired_versionとrequired_providersを指定します。

provider Blockでazurermの情報を指定します。
今回は未指定ですがデプロイするデフォルトリージョンやタグ等も指定出来ます。

resource Blockでデプロイすリソースを規定します。
今回はAzureリソースグループのリソースを指定しています。
name、locationにデプロイするリソースグループの設定を記載します。

terraform {
  required_version = “>= 1.5"
  required_providers {
    azurerm = {
      source  = “hashicorp/azurerm"
      version = “>=3.74.0"
    }
  }
}

provider “azurerm" {
  features {}
}

resource “azurerm_resource_group" “demo" {
  name     = “test-terraform-rg"
  location = “eastus2"
}

 

プロバイダーはazurerm

TerraformでAzureのリソースを操作する場合はazurermのプロバイダー利用します、
最新バージョンはHashiCorp社のサイトで確認出来ます。

azurerm

※最新バージョンだとエラーになるケースもあるので適時バージョンは指定するようにします。

最新バージョン

最新バージョンはHashiCorp社のサイトに記載があります。

※version = “>=3.74.0″と記載すると指定のバージョン以上が適用されます。

Azureテナントへサインイン(認証)

Terraformを使ってAzureリソースを操作する場合、Azureテナントへのサインイン(認証)が必要です。
サインイン(認証)には対話形式と非対話形式があります。

    • 対話形式ログイン画面を表示してログインする
    • 非対話形式:ログイン画面を表示せず自動ログインする

CI/CD等の場合にはサービスプリンシパル等の非対話形式のログイン方法を利用します。

認証方法

対話形式
Azure CLI(Microsoft アカウント)を使用したサインイン(認証)

Azure CLIを使用してコマンドラインで認証します。
az loginコマンドで認証します。

非対話形式
Azure サービス プリンシパルを使用したサインイン(認証)

Azureサービスプリンシパルを利用してコードの中で認証します。
非対話形式
マネージドID(Managed identities)を使用したサインイン(認証)

AzureマネージドIDを利用してコードの中でします。

※テナント内リソース(仮想マシン(Azure VM)等)からアクセスする場合にのみ使用可能です。テナント外の場合はサービスプリンシパルを利用します。

AzureマネージドIDを利用した認証はこちらを参照願います。

Azure サービスプリンシパルの作成についてはこちらを参照願います。

初期化からリソースデプロイまで

Terraformを使ってリソースグループをデプロイします。
事前にAzure CLI(az loginコマンド)を使ってAzureテナントへサインインておく必要があります。
ログイン後はコマンドを順番に実行するだけです。

※az group listと入力してリソースグループの一覧が表示されればAzure CLIを使ってログインが完了しています。
※マネージドIDを使って認証を行う方法はこちらを参照ください。

実施手順

terraform initを実行します。
実行したディレクトリに必要なTerraform モジュールがダウンロードされます。

 

 

 

PS C:\Program Files\Terraform-1_5_7\test> terraform init

Initializing the backend…

Initializing provider plugins…
– Using previously-installed hashicorp/azurerm v3.74.0

Terraform has been successfully initialized!

<以下略>

Terraform has been successfully initialized!と表示されていれば成功です。

Terraform関連のファイルがダウンロードされています。

terraform planを実行します。
実行計画が表示されます。
作成されるリソースが確認出来ます。

PS C:\Program Files\Terraform-1_5_7\test> terraform plan

terraform plan

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
+ create

Terraform will perform the following actions:

# azurerm_resource_group.demo will be created
+ resource “azurerm_resource_group" “demo" {
+ id = (known after apply)
+ location = “eastus2"
+ name = “test-terraform-rg"
}

<以下略>

terraform applyでリソースを作成します。
確認メッセージ(Enter a value:)が表示されます。
yesと入力します。

PS C:\Program Files\Terraform-1_5_7\test> terraform apply

terraform apply

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
+ create

Terraform will perform the following actions:

# azurerm_resource_group.demo will be created
+ resource “azurerm_resource_group" “demo" {
+ id = (known after apply)
+ location = “eastus2"
+ name = “test-terraform-rg"
}

 Plan: 1 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: yes

azurerm_resource_group.demo: Creating…
<中略>

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

デプロイが完了すると、Apply complete! Resources: 1 added, 0 changed, 0 destroyed.と表示されます。

リソースグループが作成されている事が確認出来ます。

作成、削除、変更されるリソースはデプロイ前に分かる

Terraform PlanやApply実行時に変更内容に関するメッセージが表示されます。

    • to add:追加されるリソース
    • to change:変更されるリソース
    • to destroy:削除されるリソース

事前に変更内容を確認出来るので意図しないリソース削除とか防ぐ事が出来ます。

tfstateファイルとは何?

デプロイ後はxxx.tfstateと言うファイルが生成されます。
Terraform実行ディレクトリ内(C:\Program Files\Terraform-1_5_7\test)に作成されます。

これはTerraformが管理しているリソースの状態を表すファイルになります。
ファイル内を確認するとJSON形式のファイルが出来ています。

Terraformはこのファイルをリソースの状態と認識してリソースの操作を行います。
他の方が更新した場合など実環境のリソースの最新情報と実際の情報に差分が発生したりという事になります。

複数環境からTerraformを使ったリソース管理を行う場合は差分が発生しないようにtfstateファイルを共有する必要があります。
実運用環境ではtfstateファイルは共有ディレクトリなどに保管するようにします。

※デフォルトではterraform.tfstateというファイル名になります。
※リソースの差分はTerraform以外でリソース操作した場合にも発生します。

tfstateファイル

tfasteファイルが生成されています。

ファイルの内容を確認するとリソース情報が確認出来ます。

tfstateファイル等はストレージアカウント等共有ディレクトリにファイルを置いて実施する事が推奨されています。
ストレージアカウントへの保管についてはこちらで試しています。

既存のリソース情報をtfstateファイルに反映させるためにはimportコマンドを利用します。

terraform apply -refresh-onlyを利用したterraform.tfstateの更新はこちらに纏めています。

destroyコマンドでリソースグループを削除

Terraformを使ってリソースグループを削除します。
削除はterraform destroyを使います。

※削除可能なリソースはTerraform で管理されているリソース(tfstateに存在するリソース)のみになります。

削除確認

terraform destroyを実行します。tfファイルに記載のリソースが削除対象となります。
リソースグループのみなので1 to destroyとなります。
削除確認メッセージが表示されますのでyesと入力します。

 

 

PS C:\Program Files\Terraform-1_5_7\test>terraform destroy

terraform destroy
azurerm_resource_group.demo: Refreshing state… [id="リソースID"]

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
  – destroy

Terraform will perform the following actions:

  # azurerm_resource_group.demo will be destroyed
  – resource “azurerm_resource_group" “demo" {
      – id       = “/subscriptions/サブスクリプションID/resourceGroups/test-terraform-rg" -> null
      – location = “eastus2" -> null
      – name     = “test-terraform-rg" -> null
      – tags     = {} -> null
    }

Plan: 0 to add, 0 to change, 1 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

azurerm_resource_group.demo: Destroying… [id="リソースID"]
azurerm_resource_group.demo: Still destroying… [id="リソースID", 10s elapsed]
azurerm_resource_group.demo: Still destroying… [id="リソースID", 20s elapsed]
azurerm_resource_group.demo: Still destroying… [id="リソースID", 30s elapsed]
azurerm_resource_group.demo: Still destroying… [id="リソースID", 40s elapsed]
azurerm_resource_group.demo: Still destroying… [id="リソースID", 50s elapsed]
azurerm_resource_group.demo: Still destroying… [id="リソースID", 1m0s elapsed]
azurerm_resource_group.demo: Destruction complete after 1m8s

Destroy complete! Resources: 1 destroyed. 

Destroy complete! Resources: 1 destroyed.と表示されていれば成功です。

最後に

Terraformを初めて使う想定でAzureのリソースグループを例に手順を確認纏めてみました。
インストールなどの環境設定からデプロイ、削除と言う基本的なところの手順を纏めています。

Terraform公式サイトでテンプレートも公開されており、活用しながらAzureリソースの作成できます。
リソース変更内容が事前に確認出来る点も操作ミスを防ぐ意味でも良いなと思います。
今後もTerraformを使って色々やってみたいと思います。

Azure VM仮想マシンのデプロイや変数の利用と言ったTerraform関連の記事はこちらに記載しております。

その他にやっているTerraform関連の記事はこちらを参照願います。

Terraformの記事一覧

スポンサーリンク