初めてのTerraform(Azureリソースグループをデプロイしてみた)

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

Terraform(HashiCorp公式サイト)

IaCはインフラの構成管理やプロビジョニングをコードを使って自動化するとか言われたりします。

これをシンプルに表現すると、設定ファイル作っておくと、コマンド1つでリソース作れて、何度も同じ事をAzure Portalでポチポチしなくても良くなる便利なツール。という感じになります。(省略しまくった表現です。)

調べているだけだとよく分からなかったので、今回は初めてのTerraformと言う事でインストールからTerraformを利用したAzureリソースグループのデプロイまでを実際にやってみました。端末はWindows10を利用しています。

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

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

Azure Provider(HashiCorp)

※今回はすべてのファイルをローカルにおいて作業しておりますが、ストレージアカウント等共有ディレクトリにファイルを置いて実施する事が推奨されています。

※Terraform v0.15.3(2021年5月時点での最新バージョン)を使用しております。

スポンサーリンク

TerraformをWindows10へインストール

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

Terraformを利用する為にはクライアント端末にインストールですが、exeファイルのダウンロード、Windows10でのパス設定と非常にシンプルになっています。

※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へのログインを行う為に、AzureCLIのインストールが必要になります。Azure CLIについてはこちらを参照願います。

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

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

設定手順

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

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

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

TerraformをAzureで利用する場合の認証について

TerraformでAzureを扱う場合の認証については以下の通りになります。CI/CD等の場合にはサービスプリンシパル等の非対話形式のログイン方法を利用します。

実施手順

Azure CLI(Microsoft アカウント)を使用した認証

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

az loginコマンドで認証します(対話形式(ログイン画面が表示されてログインする形))。

Azure サービス プリンシパルを使用した認証

Azureサービスプリンシパルを利用してコードの中で非対話形式(自動ログイン)する形式になります。
Managed identitiesを使用した認証

AzureマネージドIDを利用してコードの中で非対話形式(自動ログイン)する形式になります。

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

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

今回作成したTerraformの設定ファイル一覧

今回作成したファイルは5つになります。1つのファイルで作成する事も出来ますが、今回は何が書いているのか理解する為に分割してみました。

今回作成した5つのファイルはmain.tf、provider.tfがTerraformでAzureを利用する為のファイル、version.tfがTerraform自体の設定ファイル、resourcegroup.tf、terraform.tfvarsがリソースグループの設定ファイルと言う位置づけになります。

作成したファイル

main.tf

required_providersを指定しています。Terraformがどのプロバイダー(Azure等)を利用するのか指定します。

Provider Requirements(Terraform)

※0.13以降で登場したようです。

provider.tf

デプロイするproviderを指定しています。Azureのリソースをデプロイする事を宣言しています。

デプロイするサブスクリプションやテナントをはproviderの宣言の中で指定します。

resourcegroup.tf

デプロイするリソースの情報を指定しています。

設定値自体はterraform.tfvarsから読み込んでいます。

terraform.tfvars

設定値を記載しています。今回はリソースグループ名やデプロイするロケーションを指定しています。

※Terraformデフォルトの変数設定ファイル名がterraform.tfvarsになります。このファイル名だと変数を指定しているのはこのファイルだよとデプロイ時に指定しなくても読み込んでくれます。

version.tf Terraform自体のVersionを指定しています。Terraform自体がVerにより挙動が異なる為、このVerを使用しているよと指定します。

Terraformの設定ファイルでリソースをデプロイする為に指定する項目ですが、AzurePortalでデプロイする項目と同じ項目を指定する必要があります。

Azure Portalの画面

Terraformを使ってAzureリソースグループをデプロイする場合に、設定ファイルで指定する内容(必須)は名前、locationになるのですが、この設定値はAzure Portalで作成する場合と同じになります。

※任意の設定項目としてタグの指定も可能です。

Azureリソースグループをデプロイする為に実際に作成したファイル

今回はeastus2にtest-rgという名前で作成します。実際に作成したファイルの内容はこのような感じになります。

実際に利用したファイルはGithubにおいてあります。

作成したファイル

main.tf

 

Terraform公式ページのこちらを参照しています。

provider.tf

Terraform公式ページのこちらを参照しています。

resourcegroup.tf

Terraform公式ページのこちらを参照しています。

今回は、nameとlocationは変数化して別ファイルから読み込んでいます。

  • 変数の指定
    • variableで変数を定義
    • var.変数名で呼び出して設定値

terraform.tfvars

今回利用する変数の値を設定しています。変数名は任意です。

※リソースグループ名やデプロイするロケーションを変更する場合はこのファイルだけを修正します。

version.tf

Terraform公式ページのこちらを参照しています。

Terraformでリソースをデプロイする際に利用したコマンド

今回利用したコマンドはinit、plan、applyになります。

Terraformのコマンド

terraform init

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

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

terraform plan

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

terraform apply

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

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

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

Terraformを使ってAzureリソースグループをデプロイしてみます。コマンドを順番に実行するだけです。

※事前にAzureへログインしておく必要があります。(az group listと入力してリソースグループの一覧が表示されればログインが完了しています。)

実施手順

terraform initを実行する

 

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.

<以下略>

メッセージに作成されるリソースが表示されます。

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

今回は、1 to addなので1つのリソースグループのみが追加され、その他のリソースに影響がないことが分かります。

terraform applyを実行する。

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を使ってデプロイしたら.tfstateというファイルが出来てました

デプロイが完了するとxxx.tfstateと言うファイルが出来ています。これは何でしょうか。

一言でいうとTerraformが管理しているリソースの状態を表すファイルになります。

実際に中身を確認すると、ARMテンプレートと同じようなJSON形式のファイルが出来ています。

Terraformはこのファイルをリソースの状態と認識して、デプロイの操作等を行います。

したがって、このファイルが最新化されていないと整合性が取れない事が起こりえます。

他の方がTerraformを使って更新された時に、リソースの最新情報と実際の情報に差分が発生したりという事になります。これが共有ディレクトリを使ってねと言われる理由の1つになってたりします。

最後に

今回は一番基本的な例をやっており、説明もかなり端折っています。何となく雰囲気がこんな感じだと思って頂ければと思います。

次回はTerraformを使った仮想マシン(Azure VM)のデプロイをやっております。

リソースグループのインポートについてはこちらで試してみました。