🧩

【初心者向け】Terraformのresourceブロックを理解する:Azureストレージアカウントを例に

2024/09/03に公開

概要

Terraform勉強中です。Terraformの全要素を取り上げると、記事が長くなり過ぎてしまうので、今回はresourcevariableに焦点を当てて記事を書いていきます。

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プロバイダーのドキュメントで、各リソースの識別子を確認できます。

https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs

例えば、Azureのストレージアカウントの場合、識別子はazurerm_storage_accountになります。

他にも、代表的なAzureリソースの識別子を挙げておきます。

②リソース名を表す名前

②は、そのリソースを表す任意の名前です。これは同じTerraformファイル内で同じ種類のリソースを区別するために使用されます。

例えば、以下は2つの異なるストレージアカウントを作成する例です。

// 同じ種類のリソース(ストレージアカウント)でも区別が付くように、異なる名前を付ける
resource "azurerm_storage_account" "sample_storage_account1" {
    name = ...略
    ...略
}

resource "azurerm_storage_account" "sample_storage_account2" {
    name = ...略
    ...略
}

このように、sample_storage_account1sample_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ストレージアカウントの場合は、以下のドキュメントを参考に設定値を決めていきます。

https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/storage_account

variableブロック

上で挙げたサンプルコード内でvar.****という記述が登場しましたので、variableブロックについても触れておきます。

https://developer.hashicorp.com/terraform/language/values/variables

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
storage_account/variable.tf
variable "resource_group_name" {
  type    = string
}

variable "location" {
  type    = string
  default = "Japan East"
}

variable "storage_account_name" {
  type    = string
}
storage_account/main.tf
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で定義した変数を利用可能です。

最後に

以上です。

この記事では、resourcevariableのみに絞って整理しました。他にもTerraformの入門記事を書いていきたいなと思います。

Discussion