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

2021-05-10Azure,Resource Group,Terraform

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

Terraform(HashiCorp公式サイト)

IaCはインフラの構成管理やプロビジョニングをコードを使って自動化するとか言われたりします。
IaCをシンプルに表現すると、設定ファイル作っておくと、コマンド1つでリソース作れて、何度も同じ事をAzure Portalでポチポチしなくても良くなる便利なツール。という感じになります。(省略しまくった表現です。)

初めてのTerraformと言う事でインストールからTerraformを利用したAzureリソースのデプロイから削除までを実際にやってみました。
今回はTerraform の理解を目的にしていますので、Azureリソースは一番シンプルなリソースグループを例に実施しています。
操作端末はWindows10を利用しています。

今回の作業にあたっては、こちらのサイトを参考に実施しております。

Azure 上の Terraform のドキュメント(MS社公式)
Azure Provider(HashiCorp)

※今回はすべてのファイルをローカルにおいて作業しております。tfstateファイル等はストレージアカウント等共有ディレクトリにファイルを置いて実施する事が推奨されています。ストレージアカウントへの保管についてはこちらで試しています。
※今回はTerraform v0.15.3で実施しています。

その他にもAzure+Terraformを使った構成で色々試してみてます。併せて見て頂けると幸いです。

Terraformの記事一覧

スポンサーリンク

TerraformをWindows10へインストール

Window10でTerraformを使ってみます。
Terraformをダウンロードしてパスを通す、Azure CLIのインストール等が必要になります。

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

Window10端末へのインストールですが、exeファイルのダウンロード、OSでのパス設定と簡単に出来ました。

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

インストール手順

Terraformのサイトを開きます。

Terraform(HashiCorp)

Download CLIとあるのでクリックします。

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

Terraformダウンロードページ

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

※Windows環境が32bitの場合は32bitを選択してください。

terraform_0.15.3_windows_amd64.zipというZIPファイルがダウンロードされている事が確認出来ます。

※2021年5月現在の最新バージョンになります。

ダウンロードされたZIPファイルを解凍するとTerraform.exeというファイルが出来ます。このファイルを任意のフォルダーに保管します。

今回はC:\Program Files (x86)\Terraformというディレクトリを作成しその中においてます。

WindowsでTerraformへのパスを設定

Terraformはコマンドラインで実行します。
Terraformのコマンドを認識させる為に、Windows OS上でTerraformインストールディレクトリへのパス設定を行います。

インストール手順

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

 

システムのプロパティで詳細設定が表示されます。環境変数を選択します。

環境変数でTerraformへのPath設定を行います。

ユーザーの環境変数でPathを選択、編集をクリックします。

環境変数の設定になります。Terraformのexeファイルを置いた場所をPathに追加しOKを選択します。

※今回の場合はC:\Program Files (x86)\Terraformになります。

設定完了後にWindows PowerShellを開き、terraformとコマンド入力します。

Pathが通っていると、コマンドのリストが表示されます。

これでTerraform本体のインストールは完了です。

Azure CLIをインストール

TerraformがAzureリソース操作を行う為にAzureの認証が必要になります。
今回は対話形式でのAzureの認証を行います。対話形式での認証はAzure CLIで行います。
Azure CLIのインストールについてはこちらを参照願います。

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

Visual Studio CodeにTerraformの拡張機能があります。こちらもインストールしておくと作業には便利です。

設定手順

Visual Studio Codeの拡張機能で検索欄にTerraformと入力します。

HashiCorp TerraformとAzure Terraformをインストールします。

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

Azureリソース操作する為にTerraformで必要な事

Terraformを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の基本コマンド

Teraformの基本コマンドになります。
最初にinitで初期化した後に、plan、applyを利用してデプロイを実施しています。
最後にterraform destroyで作成したリソースを削除しています。

Terraformのコマンド

terraform init

terraformを実行する為に一番最初に実行するコマンド。
ワークスペースを初期化するコマンドで必須のコマンドになります。
このコマンドを実行すると、.terraformと言うディレクトリが作成されます。その中にデプロイに必要なファイルがダウンロードされます。

実際に確認するとAzureにデプロイする為に必要となる、terraform-provider-azurerm_v2.46.0_x5.exeというファイルがダウンロードされていました。

terraform validate

Terraformの構文が正しいかのチェックを行います。
Terraform Planでも実行されます。

terraform plan

Terraformを実行した際に何がデプロイ(変更)されるのかを確認するコマンドになります。
事前の確認コマンドになります。実際のデプロイは行われません。

terraform apply

Terraformを利用してリソースをデプロイするコマンドになります。
terraform destroy Terraformを利用してリソースを削除するコマンドになります。

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

Terraformの記述方式

独自 DSL である HCL 形式(HashiCorp Configuration Language=HashiCorp 構成言語)にて記載されます。
Blockと言うかたまりで定義されます。ざっくり言うとこんな感じかなぁと思っています。

      • Block Type:そのブロックが何を指すのかと言う意味
      • Block Labels:ブロックの定義
      • Arguments:定義された値
リソースグループの例

Azure リソースグループの例です。
リソースグループの場合に関する書き方についてはAzure Provider(HashiCorp)に記載があります。

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

 

※Terraformで扱えるAzureのリソースの書き方についてはAzure Provider(HashiCorp)にて定義されています。

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

Terraformファイルで必要なブロックの構成について

最低限必要なTerraform ブロック構成を記載するとこのような感じになります。
今回はAzureリソースグループを例に記載します。

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

Azure リソースグループを作成用の構成ファイル

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

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

Terraformで利用するファイルの拡張子は.tfになります。。
Terraformはコマンド実行ディレクトリの拡張子が.tfであるファイルを読み込んで実行します。
今回はC:\Temp\terraform配下に保管します。
Terraform コマンドもC:\Temp\terraformで実行しています。

リソースグループの例

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

provider Blockでazurermの情報を指定します。今回は指定してませんが、デプロイするデフォルトリージョンやタグ等の指定を行います。

resource BlockでAzureリソースグループを指定しています。name、locationで設定値を規定しています。

 

terraform {
  required_version = “>= 0.12"
  required_providers {
    azurerm = {
      source  = “hashicorp/azurerm"
      version = “=2.46.0"
    }
  }
}

provider “azurerm" {
  features {}
}

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

 

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

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

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

実施手順

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

 

PS C:\Temp\terraform> terraform init

Initializing the backend…

Initializing provider plugins…
– Using previously-installed hashicorp/azurerm v2.46.0

Terraform has been successfully initialized!

<以下略>

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

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

PS C:\Temp\terraform> 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
+ id = (known after apply)
+ location = “eastus2"
+ name = “test-rg"
}

Plan: 1 to add, 0 to change, 0 to destroy.

<以下略>

terraform applyでリソースを作成します。
確認メッセージが表示されますのでyesを入力します。

PS C:\Temp\terraform> 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-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.

Enter a value: という確認メッセージが表示されます。作成を継続する場合はyesと入力します。(”Y”等ではなく、yesと入力する必要があります。)

Apply complete! Resources: 1 added, 0 changed, 0 destroyed.と表示され、リソース作成が成功して事がメッセージから分かります。

Azure Portalで作成後のリソース確認すると出来ている事が分かります。

Terraform Plan(Apply)実行時に作成、削除、変更されるリソースが分かる

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

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

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

Terraformを使ってデプロイしたら.tfstateというファイルが出来てました

デプロイが完了するとxxx.tfstateと言うファイルが出来ています。これは何でしょうか。
一言でいうとTerraformが管理しているリソースの状態を表すファイルになります。
実際に中身を確認すると、ARMテンプレートと同じようなJSON形式のファイルが出来ています。

Terraformはこのファイルをリソースの状態と認識してデプロイの操作等を行います。
他の方がTerraformを使って更新されたりして最新化されていないものを参照した場合は、実環境のリソースの最新情報と実際の情報に差分が発生したりという事になります。
これがtfstateファイルの保管には共有ディレクトリを使ってねと言われる理由の1つになってたりします。

Terraformを使った仮想マシンのデプロイも併せて見て頂けると大変有難いです。

Terraformを使って作成したAzureリソースグループを削除

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

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

削除手順

terraform destroyを実行します。

リソースグループのみが削除されますので、1 to destroyとなります。削除確認メッセージが表示されますのでyesと入力します。

 

PS C:\Temp\terraform>terraform destroy

Terraform will perform the following actions:

# azurerm_resource_group.demo will be destroyed
– resource “azurerm_resource_group" “demo" {
– id = “/subscriptions/サブスクリプションID/resourceGroups/test-rg" -> null
– location = “eastus2" -> null
– name = “test-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…

Destroy complete! Resources: 1 destroyed.

 

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

最後に

今回はAzureリソースのデプロイにTerraformを初めて使う想定で、Terraformの環境設定、Azureリソースグループのデプロイ、削除と言う基本的なところをやってみました。
実際に使ってみるとTerraform公式サイトでテンプレートも公開されていてAzureリソースの作成が簡単に出来る事が分かります。
事前に変更になるリソースも分かって非常に便利かと思いました。
今後もTerraformを使って色々やってみたいと思います。

Azure VM仮想マシンのデプロイや変数の利用と言ったTerraform関連の記事はこちらに記載しております。
併せて見て頂けると大変有難いです。

Terraformの記事一覧