はじめに(2/3)
前記事(1/3)では、Terraform のインストールから環境準備(Windows + PowerShell)、構成ファイル(provider.tf / main.tf)の作成、そしてコマンド操作(terraform init / terraform plan / terraform apply)による Resource Group の作成までを実践しました。
ここまでで、Terraform を使った Azure リソースの基本的な作成の流れや感覚を掴めているかと思います。
前記事はこちら。
記事で学べること
本シリーズは3部構成です。
引き続き、手を動かして IaC(Terraform)の理解を深めます。
- Terraform のインストールと環境準備方法(Windows + PowerShell)
- 構成ファイル(
provider.tf/main.tf)の作成方法 - Resource Group 作成までの基本操作(
terraform init/terraform plan/terraform apply)
2/3(本記事)
- 構成ファイル(
variables.tf/terraform.tfvars)を活用したコード改良 - 段階的なリソース追加(VNet・Subnet)の進め方
- Resource Group の削除操作(
terraform destroy)
3/3
- 構成ファイル(
outputs.tf)による構成情報の出力 - Azure VM を含む関連リソース作成〜削除までの一連操作
- 既存リソース(Resource Group・VNet・Subnet)の取込操作(
terraform import)
前記事の最終構成イメージ
構成イメージは以下の通りです。
作成ステップ
以降は前記事の続きで、次のステップで進めます。
6.Resource Group のコード改良
まずは、前記事で作成した Resource Group のコードを改良します。
これまでは、以下の main.tf のように、リソース名(rg-terraform)やリージョン(japaneast)といった値を直接書いていました。
resource "azurerm_resource_group" "rg_main" {
name = "rg-terraform"
location = "japaneast"
}
この書き方はシンプルですが、リソースが増えると変更箇所が分散しやすくなります。
そこで、「値の変更を一箇所にまとめられる」書き方へ改良します。
こちらは、これから改良していくコード全体を俯瞰するためのイメージ図です。
現時点では前記事との差分はありませんが、以降の作業に合わせて「編集対象ファイル」が分かるよう随時更新します。
前記事で作成した provider.tf は、そのまま使用します。1
provider.tf
# --- Terraform 全体で使用するプロバイダーを宣言 ---
terraform {
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = "~>4.0"
}
}
}
# --- ここまで ---
# --- Azure への接続設定を定義 ---
provider "azurerm" {
features {}
subscription_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
# --- ここまで ---
6-1.空ファイルを作成する
「3-3. 作業フォルダの準備」 で作成したフォルダに移動し、Terraform の構成ファイルを作成します。
前記事で作成した provider.tf と main.tf に加えて、変数を用意する variables.tf と、変数に値を入れる terraform.tfvars を新たに作成します。
PS C:\Users\<ユーザー名>> cd C:\Users\<ユーザー名>\Desktop\Terraform_Test
PS C:\Users\<ユーザー名>\Desktop\Terraform_Test> ni variables.tf -ItemType File
PS C:\Users\<ユーザー名>\Desktop\Terraform_Test> ni terraform.tfvars -ItemType File
現在の作業フォルダの例:
作業フォルダ(例:Terraform_Test)
├── provider.tf
├── main.tf
├── variables.tf #空ファイル
├── terraform.tfvars #空ファイル
├── .terraform
└── .terraform.lock.hcl
└── .terraform.tfstate
6-2.変数を用意する(variables.tf)
まずは、Resource Group に必要な値を入れるための「変数」を用意します。
Resource Group の作成には、最低限「リソース名」と「リージョン」の2つの値の指定が必要です。
これまでは main.tf に直接値を書いていましたが、ここからは値を直接書かず、「変数」経由で受け取る構成に変更します。
variables.tf は、「どんな変数(箱)を用意するか(変数名・型など)」を決めるためのファイルです。変数(箱)へ値を入れる作業は「6-3」で行います。
variables.tf を開き、以下のコードを貼り付けます。2
variable "rg_name" {
description = "リソース(Resource Group)名"
type = string
}
variable "rg_location" {
description = "リージョン"
type = string
}
| 記述箇所 | 内容 | 補足ポイント |
|---|---|---|
variable "変数名" |
値を入れるための変数の名前(任意の名称) | Resource Group の場合は、「リソース名」、「リージョン」の2つ |
description |
変数の説明文 | 動作には影響しないが、変数の用途が分かる言葉が適切 |
type |
変数として受け取る値の「型」 | Resource Group (リソース名、リージョン)の場合は、どちらも文字列として扱うため、両方とも string を指定 |
補足:type で指定できる主な型
type は、「どの値を変数にするか」を決めるものではなく、変数として受け取る値の「型」を指定するためのものです。
Terraform では、代表的に以下のような型が使われます。
| 型 | 内容 | 使用例 |
|---|---|---|
string |
文字列 | リソース名、リージョン |
number |
数値 | ポート番号、サイズ指定 |
bool |
真偽値(true / false) | 機能の有効・無効 |
list |
文字列のリスト | 複数の IP アドレス、Subnet 名 |
map |
キーと値のセット | 環境単位で異なる設定、タグ情報 |
詳細は公式ドキュメントをご覧ください。
6-3.変数に値を入れる(terraform.tfvars)
ここでは、variables.tf で用意した変数に値を入れます。
Terraform では、terraform.tfvars にまとめて記述するのが一般的です。
コード本体の main.tf を変更せずに値を差し替えられるようになります。
terraform.tfvars は、「この変数(箱)にはこの値を入れる」と決めるためのファイルです。
6-3-1.terraform.tfvars の編集
作業フォルダに作成した terraform.tfvars を開き、以下のコードを貼り付けます。
変数と値を = で結ぶだけの、シンプルな書き方をします。
rg_name = "rg-terraform"
rg_location = "japaneast"
| 記述箇所 | 入れる値 | 補足ポイント |
|---|---|---|
rg_name = "" |
rg-terraform |
作成する Resource Group 名 |
rg_location = "" |
japaneast |
Resource Group の配置するリージョン |
現在の改良対象コードの全体イメージ図:
文字(赤字)は構成ファイル間で連動(同一値)する箇所です。
6-4.変数を参照する(main.tf)
この章では、変数を参照する書き方に main.tf を編集します。
6-4-1.main.tf の編集
これまでの main.tf では、次のように値を直接書いていました。
resource "azurerm_resource_group" "rg_main" {
name = "rg-terraform"
location = "japaneast"
}
これを、変数を用意した variables.tf と、変数に値を入れた terraform.tfvars を参照するコードに改良します。
resource "azurerm_resource_group" "rg_main" {
name = var.rg_name
location = var.rg_location
}
変更点はシンプルで、以下の2点です。
- "rg-terraform" → var.rg_name
- "japaneast" → var.rg_location
var.<変数名> は、次のファイルで用意した情報を参照する仕組みです。
-
variables.tf:変数(箱) -
terraform.tfvars:変数(箱)に入れた値
本記事では学習しやすくするため、ファイル単位に役割を分けていますが、実務では規模や方針により、main.tf にまとめて書く構成が採用される場合もあります。
現在の改良対象コードのイメージ図:
文字(赤字)は構成ファイル間で連動(同一値)する箇所です。
6-5.変更内容を確認する(適用〜削除)
ここまでで、変数の用意(variables.tf)、変数への値入れ(terraform.tfvars)、変数の参照(main.tf)が完了しました。
各コードは以下の通りです。
provider.tf(プロバイダー、認証設定)
# --- Terraform 全体で使用するプロバイダーを宣言 ---
terraform {
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = "~>4.0"
}
}
}
# --- ここまで ---
# --- Azure への接続設定を定義 ---
provider "azurerm" {
features {}
subscription_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
# --- ここまで ---
provider.tf 内の subscription_id = "" の "" の中には、自身がリソースを作成するサブスクリプションの ID を指定します。
(参考:Azure サブスクリプションを検索する)
variables.tf(変数の用意)
variable "rg_name" {
description = "リソース(Resource Group)名"
type = string
}
variable "rg_location" {
description = "リージョン"
type = string
}
terraform.tfvars(変数への値入れ)
rg_name = "rg-terraform"
rg_location = "japaneast"
main.tf(変数の参照)
resource "azurerm_resource_group" "rg_main" {
name = var.rg_name
location = var.rg_location
}
実際に Terraform を実行し、適用から削除3まで問題なく動作するか確認します。
STEP①.terraform init(初期化)
1.作業フォルダ内で Terraform を使えるように、以下のコマンド(terraform init)を実行します。4
PS C:\Users\<ユーザー名>\Desktop\Terraform_Test>terraform init
2.実行結果の最後に次のようなメッセージが表示されれば成功です。
Terraform has been successfully initialized!
STEP②.terraform plan(計画)
1.構成ファイルの内容をもとに、Terraform がどのリソースを作成・変更・削除するかを確認するため、以下のコマンド(terraform plan)を実行します。
PS C:\Users\<ユーザー名>\Desktop\Terraform_Test>terraform plan
2.今回の変更は、コードの改良であり、リソース構成自体は変更していません。
そのため、実行結果の最後に次のようなメッセージが表示されれば成功です。
No changes. Your infrastructure matches the configuration.
これは、現在の Azure 環境が Terraform 構成ファイルの内容と一致していることを意味します。
STEP③.terraform apply(適用)
1.terraform plan で確認した内容をもとに、以下のコマンド(terraform apply)を実行します。
PS C:\Users\<ユーザー名>\Desktop\Terraform_Test>terraform apply
2.terraform apply を実行すると、今回の変更では新規作成や変更が発生しないため、そのまま処理が完了し、次のような結果が表示されます。
Apply complete! Resources: 0 added, 0 changed, 0 destroyed.
STEP④.terraform destroy(削除)
1.Azure 上のリソースを削除するため、以下のコマンド(terraform destroy)を実行します。
PS C:\Users\<ユーザー名>\Desktop\Terraform_Test> terraform destroy
2.実行すると、削除対象のリソース一覧とともに、次のような確認メッセージが表示されます。
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:
3.yes と入力して Enter キーを押すと、Terraform が Azure にアクセスしてリソースを削除します。完了すると次のようなメッセージが表示されます。
Destroy complete! Resources: 1 destroyed.
6章終了時点での構成イメージは以下の通りです。
terraform destroy により Resource Group を削除3しているため、Azure 環境としては前記事の「5.Resource Group の作成」を実施する直前の状態に戻ります。
本記事では Terraform を理解するための学習目的として削除操作を行っています。
terraform destroy は本番環境では慎重に扱う必要があるコマンドである点にご注意ください。
7.VNet-Subnet の作成
この章では、Resource Group に加えて VNet と Subnet を作成します。
現在の構成イメージは以下の通りで、赤枠で示した範囲の構築を行います。
作成するリソースは増えますが、Resource Group の作成手順や変数の扱いなど基本的な流れは6章で説明した内容と同じです。そのため、共通の補足説明は省略します。
7-1.作業フォルダの準備
1.デスクトップ上5に任意の名前の作業フォルダを作成します(例:Terraform_Test2)。
2.PowerShell で以下のコマンドを実行し、作業フォルダに正しく移動できていることを確認します。
PS C:\Users\<ユーザー名>> cd C:\Users\<ユーザー名>\Desktop\Terraform_Test2
PS C:\Users\<ユーザー名>\Desktop\Terraform_Test2>
7-2.Terraform 構成ファイルの作成
今回は、これまでに登場した Terraform の構成ファイルの4ファイルを作成します。
provider.tfmain.tfvariables.tfterraform.tfvars
PS C:\Users\<ユーザー名>> cd C:\Users\<ユーザー名>\Desktop\Terraform_Test2
PS C:\Users\<ユーザー名>\Desktop\Terraform_Test2> ni provider.tf -ItemType File
PS C:\Users\<ユーザー名>\Desktop\Terraform_Test2> ni main.tf -ItemType File
PS C:\Users\<ユーザー名>\Desktop\Terraform_Test2> ni variables.tf -ItemType File
PS C:\Users\<ユーザー名>\Desktop\Terraform_Test2> ni terraform.tfvars -ItemType File
現在の作業フォルダの例:
作業フォルダ(例:Terraform_Test2)
├── provider.tf
├── main.tf
├── variables.tf
└── terraform.tfvars
7-3.provider.tf の編集
provider.tf のコード内容はこれまでと同じです。
provider.tf
# --- Terraform 全体で使用するプロバイダーを宣言 ---
terraform {
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = "~>4.0"
}
}
}
# --- ここまで ---
# --- Azure への接続設定を定義 ---
provider "azurerm" {
features {}
subscription_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
# --- ここまで ---
provider.tf 内の subscription_id = "" の "" の中には、自身がリソースを作成するサブスクリプションの ID を指定します。
(参考:Azure サブスクリプションを検索する)
7-4.main.tf の編集
7-4-1.ベースコードの入手
Terraform で各リソース(今回は Resource Group・VNet・Subnet)を定義するため、公式リファレンスサイト(Terraform Registry) からベースコードを入手します。
以下の手順で入手します。
1.画面左上の検索欄に作成したい Azure リソース名を入力します(例:Subnet)。
2.「Base」>「Resources」>「azurerm_subnet」をクリックします。
3.「Example Usage」の欄の画像内の「赤枠」部分のみコピーします。
以下は、公式リファレンスのサンプルコードです。
resource "azurerm_resource_group" "example" {
name = "example-resources"
location = "West Europe"
}
resource "azurerm_virtual_network" "example" {
name = "example-vnet"
address_space = ["10.0.0.0/16"]
location = azurerm_resource_group.example.location
resource_group_name = azurerm_resource_group.example.name
}
resource "azurerm_subnet" "example" {
name = "example-subnet"
resource_group_name = azurerm_resource_group.example.name
virtual_network_name = azurerm_virtual_network.example.name
address_prefixes = ["10.0.1.0/24"]
}
Subnet を作成するためには、あらかじめ Resource Group と VNet が必要です。
そのため、Subnet のサンプルコードには、Resource Group・VNet・Subnet の定義がまとめて記載されています。
本記事では、この Subnet のサンプルコードをベースコード6として利用します。
7-4-2.コードの書き換え
1.サンプルコードを今回の Azure 環境に合わせて次のように編集します。
# =====================
# ブロック1.Resource Group
# =====================
resource "azurerm_resource_group" "rg_main" {
name = "rg-terraform"
location = "japaneast"
}
# =====================
# ブロック2.VNet
# =====================
resource "azurerm_virtual_network" "vnet_main" {
name = "vnet-terraform"
address_space = ["192.168.1.0/24"]
location = azurerm_resource_group.rg_main.location
resource_group_name = azurerm_resource_group.rg_main.name
}
# =====================
# ブロック3.Subnet
# =====================
resource "azurerm_subnet" "subnet_main" {
name = "snet-terraform"
resource_group_name = azurerm_resource_group.rg_main.name
virtual_network_name = azurerm_virtual_network.vnet_main.name
address_prefixes = ["192.168.1.0/25"]
}
| ブロック No | 記述箇所 | カテゴリ | 内容 | 補足ポイント |
|---|---|---|---|---|
| 1 | resource "azurerm_resource_group" "rg_main" |
リソースの種類・識別名 | Azure 上に Resource Group を作成するリソース定義 | ・azurerm_resource_group:リソースの種類(固定)・ "rg_main":Terraform 内での識別名(同一構成内で一意) |
| 1 | name |
属性名 | 作成する Resource Group 名 | Azure Portal での「リソース名」に相当 |
| 1 | location |
属性名 | Resource Group の配置するリージョン | Azure Portal での「リージョン」に相当 |
| 2 | resource "azurerm_virtual_network" "vnet_main" |
リソースの種類・識別名 | Azure 上に VNet を作成するリソース定義 | ・azurerm_virtual_network:リソースの種類(固定)・ "vnet_main":Terraform 内の識別名(同一構成内で一意) |
| 2 | name |
属性名 | 作成する VNet 名 | Azure Portal での「リソース名」に相当 |
| 2 | address_space |
属性名 | VNet に割り当てるアドレス空間 | Azure Portal での「VNet のアドレス空間」に相当 |
| 2 | location |
属性名 | VNet の配置するリージョン | Resource Group のリージョンを参照 |
| 2 | resource_group_name |
属性名 | VNet の配置する Resource Group 名 | Resource Group 名を参照 |
| 3 | resource "azurerm_subnet" "subnet_main" |
リソースの種類・識別名 | Azure 上の VNet に Subnet を作成するリソース定義 | ・azurerm_subnet:リソースの種類(固定)・ "subnet_main":Terraform 内での識別名(同一構成内で一意) |
| 3 | name |
属性名 | 作成する Subnet 名 | Azure Portal での「Subnet 名」に相当 |
| 3 | resource_group_name |
属性名 | VNet(Subnet)の配置する Resource Group 名 | VNet(Subnet)と同じ Resource Group 名を参照 |
| 3 | virtual_network_name |
属性名 | Subnet の配置する VNet 名 | VNet 名を参照 |
| 3 | address_prefixes |
属性名 | Subnet に割り当てるアドレス空間 | Azure Portal での「Subnet のアドレス空間」に相当 |
Terraform では、他のリソースの値を リソースの種類.識別名.属性名 の形式で参照します。
主な参照例は以下の通りです。
-
azurerm_resource_group.rg_main.location:Resource Group のリージョン -
azurerm_resource_group.rg_main.name:Resource Group 名 -
azurerm_virtual_network.vnet_main.name:VNet 名
この参照形式を用いることで、同じ値を各所に書き込まず、コード内で値を共通化できます。
この章では terraform init / terraform plan / terraform apply は実行しません。
もしこの段階で実行した場合、「7-6」の出力は次のようになります。
(既に Azure リソースが作成済みのため)
-
terraform init:Terraform has been successfully initialized! -
terraform plan:No changes. Your infrastructure matches the configuration. -
terraform apply:Apply complete! Resources: 0 added, 0 changed, 0 destroyed.
7-5.Resource Group・VNet・Subnet コードの改良
Resource Group・VNet・Subnet のコードを改良します。
7-5-1.変数を用意する(variables.tf)
まずは、Resource Group・VNet・Subnet に必要な値を入れるための「変数」を用意します。
7-4-2.コードの書き換えの情報から必要な変数を整理すると以下の通りです。
変数名(任意の名称)は以下のルールで命名しています。
リソースの種類(略称)_属性名(例:rg_name,rg_location,vnet_name)
どのリソースの値か識別しやすくするための運用上の工夫です。
| ブロック No | 記述箇所 | 変数の用意 (〇は必要) |
変数名 |
|---|---|---|---|
| 1 | resource "azurerm_resource_group" "rg_main" |
- | - |
| 1 | name |
○ | rg_name |
| 1 | location |
○ | rg_location |
| 2 | resource "azurerm_virtual_network" "vnet_main" |
- | - |
| 2 | name |
○ | vnet_name |
| 2 | address_space |
○ | vnet_address_space |
| 2 | location |
- | - |
| 2 | resource_group_name |
- | - |
| 3 | resource "azurerm_subnet" "subnet_main" |
- | - |
| 3 | name |
○ | subnet_name |
| 3 | resource_group_name |
- | - |
| 3 | virtual_network_name |
- | - |
| 3 | address_prefixes |
○ | subnet_address_prefixes |
variables.tf を開き、以下のコードを貼り付けます。
# =====================
# 1.Resource Group
# =====================
variable "rg_name" {
description = "Resource Group 名"
type = string
}
variable "rg_location" {
description = "リージョン"
type = string
}
# =====================
# 2.VNet
# =====================
variable "vnet_name" {
description = "VNet 名"
type = string
}
variable "vnet_address_space" {
description = "VNet のアドレス空間"
type = list(string)
}
# =====================
# 3.Subnet
# =====================
variable "subnet_name" {
description = "Subnet 名"
type = string
}
variable "subnet_address_prefixes" {
description = "Subnet のアドレス空間"
type = list(string)
}
7-5-2.変数に値を入れる(terraform.tfvars)
variables.tf で用意した変数に値を入れます。
7-5-2-1.terraform.tfvars の編集
作業フォルダに作成した terraform.tfvars を開き、以下のコードを貼り付けます。
# =====================
# ブロック1.Resource Group
# =====================
rg_name = "rg-terraform"
rg_location = "japaneast"
# =====================
# ブロック2.VNet
# =====================
vnet_name = "vnet-terraform"
vnet_address_space = ["192.168.1.0/24"]
# =====================
# ブロック3.Subnet
# =====================
subnet_name = "snet-terraform"
subnet_address_prefixes = ["192.168.1.0/25"]
| ブロック No | 記述箇所 | 入れる値 | 補足ポイント |
|---|---|---|---|
| 1 | rg_name = "" |
rg-terraform |
作成する Resource Group 名 |
| 1 | rg_location = "" |
japaneast |
Resource Group の配置するリージョン |
| 2 | vnet_name = "" |
vnet-terraform |
作成する VNet 名 |
| 2 | vnet_address_space = [] |
192.168.1.0/24 |
VNet に割り当てるアドレス空間 |
| 3 | subnet_name = "" |
snet-terraform |
作成する Subnet 名 |
| 3 | subnet_address_prefixes = [] |
192.168.1.0/25 |
Subnet に割り当てるアドレス空間 |
7-5-3.変数を参照する(main.tf)
変数を参照する書き方に main.tf を編集します。
7-5-3-1.main.tf の編集
ここまでの構成では、値を main.tf に直接書いていました。
main.tf
# =====================
# ブロック1.Resource Group
# =====================
resource "azurerm_resource_group" "rg_main" {
name = "rg-terraform"
location = "japaneast"
}
# =====================
# ブロック2.VNet
# =====================
resource "azurerm_virtual_network" "vnet_main" {
name = "vnet-terraform"
address_space = ["192.168.1.0/24"]
location = azurerm_resource_group.rg_main.location
resource_group_name = azurerm_resource_group.rg_main.name
}
# =====================
# ブロック3.Subnet
# =====================
resource "azurerm_subnet" "subnet_main" {
name = "snet-terraform"
resource_group_name = azurerm_resource_group.rg_main.name
virtual_network_name = azurerm_virtual_network.vnet_main.name
address_prefixes = ["192.168.1.0/25"]
}
これを、変数を用意した variables.tf と、変数に値を入れた terraform.tfvars を参照する構成にします。
# =====================
# ブロック1.Resource Group
# =====================
resource "azurerm_resource_group" "rg_main" {
name = var.rg_name
location = var.rg_location
}
# =====================
# ブロック2.VNet
# =====================
resource "azurerm_virtual_network" "vnet_main" {
name = var.vnet_name
address_space = var.vnet_address_space
location = azurerm_resource_group.rg_main.location
resource_group_name = azurerm_resource_group.rg_main.name
}
# =====================
# ブロック3.Subnet
# =====================
resource "azurerm_subnet" "subnet_main" {
name = var.subnet_name
resource_group_name = azurerm_resource_group.rg_main.name
virtual_network_name = azurerm_virtual_network.vnet_main.name
address_prefixes = var.subnet_address_prefixes
}
| ブロック No | リソース | 記述箇所 | 変更前 | 変更後 |
|---|---|---|---|---|
| 1 | Resource Group | name = |
"rg-terraform" |
var.rg_name |
| 1 | Resource Group | location = |
"japaneast" |
var.rg_location |
| 2 | VNet | name = |
"vnet-terraform" |
var.vnet_name |
| 2 | VNet | address_space = |
["192.168.1.0/24"] |
var.vnet_address_space |
| 3 | Subnet | name = |
"snet-terraform" |
var.subnet_name |
| 3 | Subnet | address_prefixes = |
["192.168.1.0/25"] |
var.subnet_address_prefixes |
7-6.リソースを作成してみる
ここまでで、変数の用意(variables.tf)、変数への値入れ(terraform.tfvars)、変数の参照(main.tf)が完了しました。
各コードは以下の通りです。
provider.tf(プロバイダー、認証設定)
# --- Terraform 全体で使用するプロバイダーを宣言 ---
terraform {
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = "~>4.0"
}
}
}
# --- ここまで ---
# --- Azure への接続設定を定義 ---
provider "azurerm" {
features {}
subscription_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
# --- ここまで ---
provider.tf 内の subscription_id = "" の "" の中には、自身がリソースを作成するサブスクリプションの ID を指定します。
(参考:Azure サブスクリプションを検索する)
variables.tf(変数の用意)
# =====================
# 1.Resource Group
# =====================
variable "rg_name" {
description = "RG 名"
type = string
}
variable "rg_location" {
description = "リージョン"
type = string
}
# =====================
# 2.VNet
# =====================
variable "vnet_name" {
description = "VNet 名"
type = string
}
variable "vnet_address_space" {
description = "VNet のアドレス空間"
type = list(string)
}
# =====================
# 3.Subnet
# =====================
variable "subnet_name" {
description = "Subnet 名"
type = string
}
variable "subnet_address_prefixes" {
description = "Subnet のアドレス空間"
type = list(string)
}
terraform.tfvars(変数への値入れ)
# =====================
# ブロック1.Resource Group
# =====================
rg_name = "rg-terraform"
rg_location = "japaneast"
# =====================
# ブロック2.VNet
# =====================
vnet_name = "vnet-terraform"
vnet_address_space = ["192.168.1.0/24"]
# =====================
# ブロック3.Subnet
# =====================
subnet_name = "snet-terraform"
subnet_address_prefixes = ["192.168.1.0/25"]
main.tf(変数の参照)
# =====================
# ブロック1.Resource Group
# =====================
resource "azurerm_resource_group" "rg_main" {
name = var.rg_name
location = var.rg_location
}
# =====================
# ブロック2.VNet
# =====================
resource "azurerm_virtual_network" "vnet_main" {
name = var.vnet_name
address_space = var.vnet_address_space
location = azurerm_resource_group.rg_main.location
resource_group_name = azurerm_resource_group.rg_main.name
}
# =====================
# ブロック3.Subnet
# =====================
resource "azurerm_subnet" "subnet_main" {
name = var.subnet_name
resource_group_name = azurerm_resource_group.rg_main.name
virtual_network_name = azurerm_virtual_network.vnet_main.name
address_prefixes = var.subnet_address_prefixes
}
実際に Terraform を実行し、問題なく動作するか確認します。
STEP①.terraform init(初期化)
1.作業フォルダ内で Terraform を使えるように、以下のコマンド(terraform init)を実行します。
PS C:\Users\<ユーザー名>\Desktop\Terraform_Test2> terraform init
2.実行結果の最後に次のようなメッセージが表示されれば成功です。
Terraform has been successfully initialized!
現在の作業フォルダの例:
作業フォルダ(例:Terraform_Test2)
├── provider.tf
├── main.tf
├── variables.tf
├── terraform.tfvars
├── .terraform
└── .terraform.lock.hcl
STEP②.terraform plan(計画)
1.構成ファイルの内容をもとに、Terraform がどのリソースを作成・変更・削除するかを確認するため、以下のコマンド(terraform plan)を実行します。
PS C:\Users\<ユーザー名>\Desktop\Terraform_Test2> terraform plan
2.実行結果の最後に次のようなメッセージが表示されれば成功です。
Plan: 3 to add, 0 to change, 0 to destroy.
STEP③.terraform apply(適用)
1.terraform plan で確認した内容をもとに、実際に Azure 上にリソースを作成するため、以下のコマンド(terraform apply)を実行します。
PS C:\Users\<ユーザー名>\Desktop\Terraform_Test2> terraform apply
2.実行すると次のような確認メッセージが表示されます。
Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.
Enter a value:
3.yes と入力して Enter キーを押すと、Terraform が Azure にアクセスしてリソースを作成します。完了すると次のようなメッセージが表示されます。
Apply complete! Resources: 3 added, 0 changed, 0 destroyed.
現在の作業フォルダの例:
作業フォルダ(例:Terraform_Test2)
├── provider.tf
├── main.tf
├── variables.tf
├── terraform.tfvars
├── .terraform
└── .terraform.lock.hcl
└── .terraform.tfstate
7-7.リソースを確認してみる
Azure Portal にアクセスして、リソースが正しく作成されたか確認します。
1.Azure Portal にアクセスし、サインインします。
2.サインイン後、ホーム画面の検索欄で「リソース グループ」と入力して検索するか、Azure サービス内に「リソース グループ」のアイコンがあればクリックします。
3.指定した「リソース グループ」とその配下の「VNet」が存在することを確認します。
4.「VNet」>「設定」>「アドレス空間」上に指定した Subnet のアドレス空間が作成されていることを確認します。
本記事(2/3)で構築した最終構成イメージは以下の通りです。
おわりに(2/3)
ここまでで、Terraform のコードを次の流れで整理しながら進めてきました。
- 値の直書きから変数化の変更(
variables.tf/terraform.tfvars) - 段階的なリソース追加(VNet・Subnet)の進め方
- Resource Group の削除操作(
terraform destroy)
段階的にリソース追加していく中で、「どの部分を変更し、どの部分を固定として扱うか」という視点でコードを整理していく感覚が、より具体的に掴めてきたのではないかと思います。
次回(3/3)では、outputs.tf や terraform import を活用しつつ、最終的に「Azure VM を 1 台作成する」ところまで進めていきます。
皆さん、引き続き快適な Azure ライフを!
We Are Hiring!
-
provider.tfは接続・認証設定の構成ファイルであり、構成変更の影響を受けないためそのまま使用します。 ↩ -
説明を簡潔にするため、メモ帳への貼り付け手順は以降の章で省略します。
操作に不安がある場合は、前記事をご確認ください。
- 参考:「5-2.main.tf の編集」 > 「5-2-2.コードの書き換え」 > 「2」 ↩ -
7章では VNet / Subnet を新規作成します。6章の Resource Group を残したまま進めると既存リソースとして扱われ、
terraform importという操作が必要になります。学習をシンプルにするため、以下の通り進めます。
- 6章:Resource Group を削除する。
- 7章:Resource Group・VNet・Subnet を新規作成する。 ↩ ↩2 -
前記事から同じ作業フォルダを継続して使用している場合、
terraform initは実行済みです。初めて作業フォルダで Terraform を扱う場合のみ実行します。なお、複数回実行しても問題ありません。 ↩ -
ファイル格納用または作業フォルダの場所は基本的に自由ですが、次の点にご注意ください。
- パスにスペースや日本語など特殊文字が多い場所はトラブルの原因になることがある。 ↩ -
今回コピーしない
delegation { ... }の部分は、特定サービス向けのオプション機能です。Subnet の基本作成には不要なため、省略します。 ↩















