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

2021-05-10Azure,Resource Group,Terraform

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

Terraform(HashiCorp公式サイト)

IaCをざっくり一言で表現すると、”事前に設定ファイル作っておくと、コマンド1つでパブリッククラウドやSaaSのリソースが何度でも作れて同じ事をしなくても良くなる便利ツール。”という感じになります。

今回は初めての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インストールディレクトリへのパス設定を行います。

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自体のインストールはこちらを参照ください。

Terraformを使ってAzureリソース操作する為の事前準備

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でTerraform初期化(必要なモジュールをダウンロード)します。
Terraform初期化後にplan、applyを利用してAzureリソースをデプロイします。
最後にdestroyで作成したAzureリソースを削除します。

基本コマンド

terraform init

Terraform利用時、一番最初に実行するコマンドです。
ワークスペースを初期化するコマンドで必須のコマンドになります。
このコマンドを実行すると.terraformと言うディレクトリが作成されます。
.terraformディレクトリ内にTerraformを使ってリソースをデプロイする場合に必要なファイルがダウンロードされます。

※確認するとterraform-provider-azurerm_v2.46.0_x5.exeというファイルがダウンロードされていました。

terraform validate

Terraformの構文チェックのコマンドです。
terraform planでも実行されますので、個別に実行する事は少ないかもです。

terraform plan

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

terraform apply

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

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

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でAzureのリソースを扱う場合のプロバイダー(required_providers)はazurermになります。
azurermの最新バージョン等は公式サイトを確認します。

azurerm(Hashi Corp)

リソースグループの例

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コマンド)を使ってAzureテナントへサインインておく必要があります。
ログイン後はコマンドを順番に実行するだけです。

※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の記事一覧