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

2021-05-10Azure,Others,Resource Group,Terraform

Azureを対象に、Terraformのインストールからリソースのデプロイおよび削除までの一連の操作手順をまとめました。

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

※本記事ではWindows 10環境でTerraformの動作を確認しています。
※Terraformのバージョンはv1.5.7を利用しています。

スポンサーリンク

Windows環境にerraformをインストールする手順

Terraformとは?

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

Terraform(HashiCorp公式サイト)

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

Providers

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

Terraform Cloud

Windows環境でのTerraform インストール手順

Windows環境へTerraformをインストールします。

Terraformのインストール手順

HashiCorp社のTerraformのサイトを表示します。

Terraform(HashiCorp)

Downloadのリンクを選択します。

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

Terraformダウンロードページ

WindowsのAMD64をクリックすると、ダウンロードが開始されます。

※通常はAMD64を選択します。32bit版を利用したい場合は386選択します。

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

※記事記載時点での最新バージョンです。

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

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

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

TerraformインストールディレクトリへのPATHを設定

Terraformはコマンドラインで実行します。
TerraformのインストールディレクトリをPATHに設定します。
インストールディレクトリは、Terraform.exeがあるディレクトリになります。

TerraformのPATHを設定

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

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

 

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

TerraformへのPATH設定を行います。
“システム環境変数"の中から"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では、Terraformの拡張機能が提供されています。
拡張機能をインストールしておくと、作業がより便利になります。

拡張機能をインストール

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

Visual Studio Codeのインストール手順は、こちらで紹介しています。

—広告—

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

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

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

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

terraform init

Terraform利用開始時に実行するコマンドがinitです。
ワークスペースを初期化する必須のコマンドです。
プロバイダーやモジュールの追加・変更があった場合にも再実行が必要です。
initを実行すると、.terraformというディレクトリが作成され、その内部にリソースのデプロイ時に必要なファイルがダウンロードされます。

terraform validate

Terraformの構文チェックを行うコマンドがvalidateです。
構文チェックのみを行い、変更されるリソースの情報などは表示されません。

※terraform planでも構文エラーがあればエラーが表示されます。

terraform plan

リソースのデプロイ計画を確認するコマンドがplanです。
terraform applyを実行した際に発生する変更内容を事前に確認できます。
新規作成されるリソース、変更されるリソース、削除されるリソースが一覧で表示されます。
事前確認のみを行い、実際のリソースのデプロイや変更は行いません。

terraform apply

リソースデプロイを実行するコマンドがapplyです。
リソースブロックで指定した設定内容に基づいてリソースを作成・変更・削除します。
terraform applyの実行時には、自動的に計画が表示され、ユーザーが内容を確認したうえで実行することになります。
terraform applyを実行した際は、planの処理が実行されます。
terraform destroy ソース削除を実行するコマンドがdestroyです。
リソースブロックで管理しているリソースを削除します。
terraform destroyを実行すると、削除計画(plan)が表示され、実行前に内容を確認できます。
削除はユーザーの確認後に行われます。

※実際の運用では様々なコマンドやオプションが利用されます。今回は基本的な利用方法に絞り、最低限必要なコマンドと主なオプションのみを利用しています。

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

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

    • Block Type:そのブロックが何を表すかを指定
    • Block Labels:ブロックの追加情報(名前やタイプ)を指定
    • Arguments:ブロック内で設定するパラメータや値を記述

各プロバイダーごとにリソースの作成方法が定義されています。
Azureであれば、Azure Providerに詳細なリソース定義方法が記載されています。

Azure Provider

リソースグループの作成方法についても、Azure Providerのドキュメントに記載があります。

azurerm_resource_group

リソースの記述例

Block typeがresourceとなっています。
作成するリソースを定義するブロックであることを示しています。
Block Labelsが"azurerm_resource_group" “demo"となっています。
“azurerm_resource_group"はAzureのリソースグループを定義するリソースタイプであることを示しています。
“demo"は、このリソースのローカル名です。
Argumentsは、リソースの属性や設定値を指定します。

—広告—

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

T最低限必要なブロック構成

最低限必要なTerraformのブロック構成は3つに分けられます。
Azureリソースグループを例にすると、このような形になります。

    • Terraform Block
      • Terraform自体の動作を指定するブロック
      • Terraformのバージョンや必要なプロバイダーのバージョンなどを記載
    • Provider Block
      • 使用するプロバイダーを指定
      • 今回の場合はAzureプロバイダー(azurerm)を指定
    • Resource Block
      • 作成するリソースを定義
      • 今回の場合はリソースグループ名やリージョンなどを定義

リソースグループをデプロイするためのTerraform構成ファイル

リソースグループをデプロイする場合の構成ファイル例です。
今回は、すべての設定を1つのファイルにまとめて記載しています。

terraform block reference
Provider Configuration
Resource Blocks

Azureのリソース設定については、こちらを参照しています。

Azure Provider

ファイルの拡張子は.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"
}

 

Azureのリソースを操作する場合のプロバイダーはazurerm

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

azurerm

※最新バージョンを使用するとエラーが発生する場合もあるようです。プロバイダーのバージョンは適宜指定するしたほうが良さそうです。

最新バージョン

最新バージョンはHashiCorp社の公式サイトに記載されています。

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

Terraformを使ってAzureリソースを操作する場合の認証方法

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

    • 対話形式:ログイン画面を表示して認証を行う方法
    • 非対話形式:ログイン画面を表示せず、自動的に認証を行う方法

CI/CDなどの場合には、サービスプリンシパルなどを利用した非対話形式の認証方法を利用します。

認証方法

対話形式
Azure CLIを使用した認証方法

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

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

Azureサービスプリンシパルを利用して、コード内で認証を行います。
非対話形式
マネージドIDを使用した認証方法

AzureマネージドIDを利用して、コード内で認証を行います。

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

マネージドIDを利用して認証する方法は、こちらで紹介しています。

Azure サービスプリンシパルの作成手順については、こちらで紹介しています。

Terraformの初期化からリソースデプロイまでの手順

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

※az group listと入力してリソースグループの一覧が表示されれば、Azure CLIによるログインが完了しています。

実施手順

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でリソースを作成します。確認メッセージが表示されるので、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はこのファイルをもとにリソースの状態を認識し、リソースの操作を行います。
他の作業者が別の環境から更新した場合など、実際のリソースとtfstateファイルの内容に差分が発生することがあります。
複数の環境からTerraformでリソース管理を行う場合は、差分が発生しないようにtfstateファイルを共有する必要があります。

実運用環境では、tfstateファイルは共有ディレクトリやリモートバックエンド(例:Azure Blob Storageなど)に保管するようにします。

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

tfstateファイルを確認

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

tfstateファイルにリソース情報が記載されていることがわかります。

tfstateファイルなどは、ストレージアカウントなどの共有ディレクトリやリモートバックエンド(例:Azure Blob Storageなど)に保管して運用することが推奨されています。
tfstateファイルをストレージアカウントに保管する手順については、こちらで紹介しています。

既存のリソース情報をtfstateファイルに反映させるためには、importコマンドを利用します。
Terraform importコマンドの利用手順については、こちらで紹介しています。

terraform apply -refresh-onlyを利用したterraform.tfstateの更新手順については、こちらで紹介しています。

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

Terraformを使って作成したリソースグループを削除します。
削除にはterraform destroyコマンドを使用します。

※削除可能なリソースは、Terraformで管理されているリソース(tfstateに存在するリソース)のみです。
※Terraformで管理されているリソースの依存関係にあるリソースは注意が必要です。関連するリソースが同時に削除される場合があります。

削除確認

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.と表示されていればリソースの削除完了です。

—広告—

最後に

Azureのリソースグループを例に、初めてTerraformを使うための手順を簡単にまとめてみましました。
インストールなどの環境設定からデプロイ、削除といった基本的な手順を整理しています。
Terraformの公式サイトでもテンプレートも公開されており、それらを活用しながらAzureリソースの作成が可能です。
リソースの変更内容を事前に確認できる点も、操作ミスを防ぐうえで便利だと感じました。

引き続き、いろいろ試してみたいと思います。

Terraformを利用して仮想マシン(Azure VM)手順については、こちらで紹介しています。

スポンサーリンク