【初心者向け】Terraformのresourceブロックを理解する:Azureストレージアカウントを例に
概要
Terraform勉強中です。Terraformの全要素を取り上げると、記事が長くなり過ぎてしまうので、今回はresource
とvariable
に焦点を当てて記事を書いていきます。
Azure Storageアカウントを定義するresourceブロックのサンプル
Terraformにおいて、resource
ブロックはクラウドリソースを定義する役割を持ちます。
以下は、Azureのリソースグループ
、ストレージアカウント
、Blobコンテナ
を定義するTerraformコードのサンプルです。
// Azureのリソースグループの定義
resource "azurerm_resource_group" "rg" {
name = var.resource_group_name
location = var.location
}
// Azureのストレージアカウントの定義
resource "azurerm_storage_account" "sample_storage_account" {
name = var.storage_account_name
resource_group_name = var.resource_group_name
location = var.location
account_tier = "Standard"
account_replication_type = "LRS"
}
// AzureのBlobコンテナの定義
resource "azurerm_storage_container" "sample_blob_container" {
name = var.container_name
storage_account_name = azurerm_storage_account.sample_storage_account.name
container_access_type = "private"
}
resourceブロックの基本
Terraformでは、クラウド上で作成・管理したいリソースを、resource
ブロックを使って宣言します。
resource
ブロックの書き方は以下の通りです。
resource "①リソースを表す識別子" "②リソース名を表す名前" {
③各種プロパティの指定
name = ...略
...略
}
①リソースを表す識別子
①は、作成するリソースの種類を表す識別子です。作成したいリソースごとに用意された識別子がありますので、その識別子を指定します。当然ですが、任意の名前を付けることはできません。
Azureの場合はTerraformのazurermプロバイダーのドキュメントで、各リソースの識別子を確認できます。
例えば、Azureのストレージアカウントの場合、識別子はazurerm_storage_account
になります。
他にも、代表的なAzureリソースの識別子を挙げておきます。
- 仮想マシン:azurerm_virtual_machine
- 仮想ネットワーク(VNet):azurerm_virtual_network
- App Service:azurerm_app_service
- Key Vault:azurerm_key_vault
②リソース名を表す名前
②は、そのリソースを表す任意の名前です。これは同じTerraformファイル内で同じ種類のリソースを区別するために使用されます。
例えば、以下は2つの異なるストレージアカウントを作成する例です。
// 同じ種類のリソース(ストレージアカウント)でも区別が付くように、異なる名前を付ける
resource "azurerm_storage_account" "sample_storage_account1" {
name = ...略
...略
}
resource "azurerm_storage_account" "sample_storage_account2" {
name = ...略
...略
}
このように、sample_storage_account1
とsample_storage_account2
という名前を付けることで、同じTerraformファイル内で複数のストレージアカウントを区別できます。
また、これらのリソース名(②)は、他のリソースから参照するための識別子としても機能します。例えば、以下では、Blobコンテナの定義の中で、リソース名のsample_storage_account1
を参照しています。
resource "azurerm_storage_container" "sample_blob_container" {
name = ...略
// sample_storage_account1.nameを参照している
storage_account_name = azurerm_storage_account.sample_storage_account1.name
}
③各種プロパティの指定
resource
ブロック内の{}
の中には、リソースの設定を示すプロパティを記述します。
当たり前ですが、各種リソースごとにプロパティは異なります。各リソースごとにドキュメントが用意されていますので、そちらを参照しつつ必要なプロパティを埋めていきます。
resource "azurerm_storage_account" "sample_storage_account" {
// リソース名
name = var.storage_account_name
// リソースグループ
resource_group_name = var.resource_group_name
// リージョン
location = var.location
// パフォーマンス(Standard or Premium)
account_tier = "Standard"
// 冗長性(LRS、GRS、ZRSなど)
account_replication_type = "LRS"
}
例えば、Azureストレージアカウントの場合は、以下のドキュメントを参考に設定値を決めていきます。
variableブロック
上で挙げたサンプルコード内でvar.****
という記述が登場しましたので、variable
ブロックについても触れておきます。
resource
ブロック内の各種プロパティは、直接値を指定することもできますが、変数を使って指定することもできます。
// 直接値を指定する形
resource "azurerm_storage_account" "sample_storage_account" {
name = "testname"
resource_group_name = "testrg"
location = "Japan East"
}
// 変数を使う形
resource "azurerm_storage_account" "sample_storage_account" {
name = var.storage_account_name
resource_group_name = var.resource_group_name
location = var.location
}
変数を使う場合は、事前にvariable
ブロックで変数を定義しておく必要があります。variable
ブロックで定義した変数は、var.***
という形で使うことができます。
以下は、ストレージアカウントのリソースを定義する例で、variable
ブロックで定義した変数を利用しています。
variable "resource_group_name" {
type = string
}
variable "location" {
type = string
default = "Japan East"
}
variable "storage_account_name" {
type = string
}
// variableブロックで定義した変数をresourceブロック内で使用している例
resource "azurerm_storage_account" "sample_storage_account" {
name = var.storage_account_name
resource_group_name = var.resource_group_name
location = var.location
}
なお、定義されていない変数を使おうとすると、No declaration found for "var.resource_group_name"Terraform
のようなエラーが出ます。
variableを別ファイルに分割する
上で挙げたサンプルでは、変数を使うファイルと同じファイル内で変数定義していますが、変数定義は別ファイルに分割することも可能です。
以下は、そのサンプルコードとディレクトリ構成です。
terraform-sample
├── modules
│ └── storage_account
│ ├── main.tf
│ └── variables.tf
variable "resource_group_name" {
type = string
}
variable "location" {
type = string
default = "Japan East"
}
variable "storage_account_name" {
type = string
}
resource "azurerm_storage_account" "sample_storage_account" {
name = var.storage_account_name
resource_group_name = var.resource_group_name
location = var.location
}
同一ディレクトリ内であれば、どのファイルからでもvariable
ブロックで定義した変数を使うことができます。この例で言うと、main.tf
は、同一ディレクトリにあるvariables.tf
で定義した変数を利用可能です。
最後に
以上です。
この記事では、resource
とvariable
のみに絞って整理しました。他にもTerraformの入門記事を書いていきたいなと思います。
Discussion