【超ざっくり】TerraformでAzureのリソースグループを作成してみた

# はじめに
TerraformでAzureのリソースグループを作成してみました。
本記事では必要な部分だけを**超ざっくり**まとめています。
おおまかな手順やAzure上の事前準備（サービスプリンシパルの作成など）は過去記事をご参照ください。

https://qiita.com/Katsuya_T/items/4f2adb369562419da8b0

https://qiita.com/Katsuya_T/items/7f0d75f1a10272b62202

# 目次
- [1. Terraformのダウンロード](#Terraformのダウンロード)
- [2. Terraformコードファイルの作成](#Terraformコードファイルの作成)
- [3. リソースグループ作成](#リソースグループ作成)

# Terraformのダウンロード
公式サイトからTerraformをダウンロードします。

https://www.terraform.io/

本記事ではCドライブ直下にTerraformフォルダを作成し、ダウンロードしました。
試しにダウンロードしたTerraformのバージョンを確認してみます。
```
C:\Terraform>terraform -version

Terraform v1.7.3
on windows_386
+ provider registry.terraform.io/hashicorp/azurerm v2.99.0
```

# Terraformコードファイルの作成
次にTerraformコードファイルを作成していきます。
作成するファイルは3つです。
* 全体の処理を記述したファイル（XXX.tf）
* 変数の設定値を記述したファイル（XXX.tfvars）
* 変数の型を記述したファイル（XXX_variables.tf）

今回は東日本と西日本にリソースグループを作成していきます。
それぞれのコードは以下の通りです。
※.tfvarsファイル以外はコピペで利用できます！
```hcl:CreateRG.tf
terraform {
  required_providers { //プロバイダーを指定(今回はAzure)
    azurerm = {
      source = "hashicorp/azurerm"
      version = "~>2.0"
    }
  }
}

provider "azurerm" {  //サービスプリンシパルを利用するための資格情報
  features {}
  subscription_id   = var.azurerm_subscription_id
  tenant_id         = var.azurerm_tenant_id
  client_id         = var.azurerm_client_id
  client_secret     = var.azurerm_client_secret
}

resource "azurerm_resource_group" "RG1" { //リソースグループの作成
  name     = var.azurerm_RG1_name
  location = var.azurerm_RG2_location
}

resource "azurerm_resource_group" "RG2" { //リソースグループの作成
  name     = var.azurerm_RG2_name
  location = var.azurerm_RG2_location
}
```

```hcl:CreateRG.tfvars
azurerm_subscription_id = "{サブスクリプションIDを入力}"
azurerm_tenant_id       = "{テナントIDを入力}"
azurerm_client_id       = "{クライアントIDを入力}"
azurerm_client_secret   = "{クライアントシークレットを入力}"

azurerm_RG1_name     = "TestRG1"
azurerm_RG1_location = "Japan East"

azurerm_RG2_name     = "TestRG2"
azurerm_RG2_location = "Japan West"
```

```hcl:CreateRG_variables.tf
variable "azurerm_subscription_id" {
  type = string
}
variable "azurerm_tenant_id" {
  type = string
}
variable "azurerm_client_id" {
  type = string
}
variable "azurerm_client_secret" {
  type = string
}

variable "azurerm_RG1_name" {
  type = string
}
variable "azurerm_RG1_location" {
  type  = string
}

variable "azurerm_RG2_name" {
  type = string
}
variable "azurerm_RG2_location" {
  type  = string
}
```

# リソースグループ作成
準備が整ったので、リソースグループを作成していきます。
実行するコマンドは以下の通りです。
* terraform init &emsp;&ensp;&ensp;&ensp;    Terraformの初期化
* terraform validate &ensp; 構文エラーなど基本的な構成チェック
* terraform plan &emsp;&ensp;&ensp; リソース作成前の事前検証
* terraform apply &ensp;&ensp;&thinsp;&nbsp; リソース作成

最初は terraform init コマンドを実行します。
このコマンドでTerraformの初期化を行います。
```
C:\Terraform>terraform init

Initializing the backend...

Initializing provider plugins...
- Reusing previous version of hashicorp/azurerm from the dependency lock file
- Using previously-installed hashicorp/azurerm v2.99.0

Terraform has been successfully initialized!

You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.

If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.
```

次に terraform validate コマンドを実行します。
このコマンドで作成したファイルの構文エラーなどをチェックします。
```
C:\Terraform>terraform validate
Success! The configuration is valid.
```

次に terraform plan コマンドを実行します。
このコマンドでリソースグループ作成前の事前検証を行います。
また、ここではコマンドオプション( -var-file )を使用して、変数の設定値を記述したファイル( .tfvars )を指定します。
```
C:\Terraform>terraform plan -var-file="CreateRG.tfvars"
azurerm_resource_group.RG2: Refreshing state... [id=/subscriptions/{サブスクリプションID}/resourceGroups/TestRG2]
azurerm_resource_group.RG1: Refreshing state... [id=/subscriptions/{サブスクリプションID}/resourceGroups/TestRG1]

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.RG1 will be created
  + resource "azurerm_resource_group" "RG1" {
      + id       = (known after apply)
      + location = "japaneast"
      + name     = "TestRG1"
    }

  # azurerm_resource_group.RG2 will be created
  + resource "azurerm_resource_group" "RG2" {
      + id       = (known after apply)
      + location = "japanwest"
      + name     = "TestRG2"
    }

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

───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────

Note: You didn't use the -out option to save this plan, so Terraform can't guarantee to take exactly these actions if
you run "terraform apply" now.
```
「Plan: 2 to add, 0 to change, 0 to destroy.」で
新規作成するリソースが2個、変更を加えるリソースが0個、削除するリソースが0個であることがわかります。

変更内容に問題がなければ、terraform apply コマンドを実行します。
このコマンドでリソースグループを作成していきます。
ここでもコマンドオプションで、.tfvarsファイルを指定します。
```
C:\Terraform>terraform apply -var-file="CreateRG.tfvars"
azurerm_resource_group.RG1: Refreshing state... [id=/subscriptions/{サブスクリプションID}/resourceGroups/TestRG1]
azurerm_resource_group.RG2: Refreshing state... [id=/subscriptions/{サブスクリプションID}/resourceGroups/TestRG2]

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.RG1 will be created
  + resource "azurerm_resource_group" "RG1" {
      + id       = (known after apply)
      + location = "japaneast"
      + name     = "TestRG1"
    }

  # azurerm_resource_group.RG2 will be created
  + resource "azurerm_resource_group" "RG2" {
      + id       = (known after apply)
      + location = "japanwest"
      + name     = "TestRG2"
    }

Plan: 2 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:
```
「Enter a value」と表示されたら、「yes」と入力します。
```
  Enter a value: yes

azurerm_resource_group.RG2: Creating...
azurerm_resource_group.RG1: Creating...
azurerm_resource_group.RG1: Creation complete after 1s [id=/subscriptions/{サブスクリプションID}/resourceGroups/TestRG1]
azurerm_resource_group.RG2: Creation complete after 1s [id=/subscriptions/{サブスクリプションID}/resourceGroups/TestRG2]

Apply complete! Resources: 2 added, 0 changed, 0 destroyed.
```
「Apply complete!」と表示されたら完了です。
実際にAzureポータルでリソースグループが作成されたことを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3715340/621beeea-23e3-cbe0-cdbf-8f7c1556002f.png)

東日本と西日本にリソースグループが作成されていることを確認できました！

# おわりに
TerraformでAzureのリソースグループを作成する方法についてご紹介しました。
他のリソースを作成する場合も基本的な手順は同じなので、ぜひ試してみてください！