Terraform Randomの使い方をAzure ストレージアカウント作成で学んでみた

2021-12-18Azure,Terraform

今回はTerraform Randomを使ってAzureストレージアカウントを作成してみました。
Terraform RandomはTerraform上でランダムな値を発生させて扱えるようにするプロバイダーになります。

Random Provider(HashiCorp公式サイト)

今回はRandom Providerを使ってランダムな名前を付与したストレージアカウントを作成してみました。

過去のTerraform関連の記事はこちらに記載しております。

Terraformの記事一覧

スポンサーリンク

Terraform Randomとは

Terraform上でランダム値を発生させ扱えるようにするプロバイダーになります。
Terraform Randomを使うとTerraform上でランダムな値を発生させそれをリソース名に使ったりと言う事が出来ます。

※勝手にプロバイダー=モジュールみたいなもんと理解しています。

Terraform Randomの種類

Terraform Randomにも発生させたい値により色々な種類があります。
実際に出力値のイメージを分かりやすくするためにOutput値の結果も併せて載せています。

項目 概要 Output値

random_id

他のリソースと識別する為の一意の乱数を生成します。
結果を見て頂いても分かるように色んなタイプの変数を発生させる事が出来ます。
ramdom_id = {
“b64_std" = “4Wj831me760="
“b64_url" = “4Wj831me760"
“byte_length" = 8
“dec" = “16242510092323188653"
“hex" = “e168fcdf599eefad"
“id" = “4Wj831me760"
“keepers" = tomap(null) /* of string */
“prefix" = tostring(null)

random_integer

指定した範囲内で任意の数字を生成します。 random_integer = {
“id" = “14172"
“keepers" = tomap(null) /* of string */
“max" = 50000
“min" = 1
“result" = 14172
“seed" = tostring(null)
}
random_password Random_stringと同じですがコンソールに結果が表示されません。パスワード等の機密性高い変数を生成する場合に利用します。 random_password = <sensitive>
random_pet

ランダムなペット名を生成します。
結果名がadapted-wombatとなっている通り、本当に動物名になります。

random_pet = {
“id" = “adapted-wombat"
“keepers" = tomap(null) /* of string */
“length" = 2
“prefix" = tostring(null)
“separator" = “-“
}

random_shuffle

定義したリストの値の中から任意の値を生成します。
サンプルもそうですがランダムなリージョンなどを選択させる場合などに利用します。

random_shuffle = {
“id" = “-“
“input" = tolist([
“eastus",
“eastus2",
“westus",
“westus2",
“westus3",
])
“keepers" = tomap(null) /* of string */
“result" = tolist([
“westus2",
])
“result_count" = 1
“seed" = tostring(null)
}

random_string

英数字(オプションを使うと特殊文字)のランダム順列を生成します。一意のIDの場合はrandom_id、機密性が必要な場合はrandom_passwordを使用して下さいとの案内があります。

random_string = {
“id" = “EETJZR22HaDMNHtc"
“keepers" = tomap(null) /* of string */
“length" = 16
“lower" = true
“min_lower" = 0
“min_numeric" = 0
“min_special" = 0
“min_upper" = 0
“number" = true
“override_special" = “/@£$"
“result" = “EETJZR22HaDMNHtc"
“special" = true
“upper" = true
}

random_uuid

uuidを生成します。
一意のUUID形式の文字列が必要な場合に利用します。

random_uuid = {
“id" = “9256e618-acf2-b142-0fca-db9ffa4f2e1b"
“keepers" = tomap(null) /* of string */
“result" = “9256e618-acf2-b142-0fca-db9ffa4f2e1b"
}

Terraform Randomの使い方

Terraform Blockのrequired_providersでrandom providerを呼び出す事でTerraform Randomが使えます。
Resource Blockでrandomの各リソースを呼び出して定義して使います。

実際に各Random Resourceで呼び出したサンプルで確認してみます。

※なおrequired_providersに項目を追加していますのでterraform initから必要になります。

Random Resourceサンプル

random_idを例に確認してみます。

    random = {
      source = “hashicorp/random"
      version = “>= 3.0"
    }

でRandom Providerを読み込んでいます。

resource “random_id" “id-test" {
  byte_length = 8
}

で8バイトのrandom_idを生成するという定義を行っています。
またid-testと言う名前を付けて呼び出すようにしています。

output “ramdom_id" {
  value = “${random_id.id-test}"
}

Outputで実際の値を確認しています。
id-testと言う名前のrandom_idリソースを呼び出す指定にしています。

必須項目や確認出来る項目はRandom Providerで各リソースに記載があります。

terraform {
  required_version = “>= 1.0.0"
  required_providers {
    azurerm = {
      source = “hashicorp/azurerm"
      version = “1.44.0"
    }
    random = {
      source = “hashicorp/random"
      version = “>= 3.0"
    }
  }
}

provider “azurerm" {
  features {}
}

resource “random_id" “id-test" {
  byte_length = 8
}

resource “random_integer" “integer-test" {
  min = 1
  max = 50000
}

resource “random_password" “password-test" {
  length           = 16
  special          = true
  override_special = “_%@"
}

resource “random_pet" “pet-test" {
}

resource “random_shuffle" “shuffle-test" {
  input        = [“eastus", “eastus2", “westus", “westus2″,"westus3"]
  result_count = 1
}

resource “random_string" “string-test" {
  length           = 16
  special          = true
  override_special = “/@£$"
}

resource “random_uuid" “uuid-test" {
}

output “ramdom_id" {
  value = “${random_id.id-test}"
}

output “random_integer" {
  value = “${random_integer.integer-test}"
}

output “random_password" {
  value = “${random_password.password-test}"
  sensitive = true
}

output “random_pet" {
  value = “${random_pet.pet-test}"
}

output “random_shuffle"{
  value = “${random_shuffle.shuffle-test}"
}

output “random_string"{
  value = “${random_string.string-test}"
}

output “random_uuid"{
  value = “${random_uuid.uuid-test}"
}

Terraform Randomを使ってAzureストレージアカウントをデプロイ

Terraform Randomを使ってAzureストレージアカウントデプロイ

random_idを使用してストレージアカウント名を生成しています。

ストレージアカウントを作成する

ストレージアカウント作成用のtfファイルを作成しました。
リソースグループも併せてデプロイしています。

random_idの変数を定義しています。

resource “random_id" “id-test" {
  byte_length = 4
}

random_idではbyte_lengthが必須の項目になっています。(1-8で指定)
今回は4としています。

ストレージアカウントのリソースの名前の項目でrandom_id(id-test)を呼び出しています。

resource “azurerm_storage_account" “test-sa" {
  name = “sa${random_id.id-test.dec}"

今回はdecを使用するのでrandom_id.id-test.decとなります。

terraform {
  required_version = “>= 1.0.0"
  required_providers {
    azurerm = {
      source = “hashicorp/azurerm"
      version = “>= 2.0"
    }
    random = {
      source = “hashicorp/random"
      version = “>= 3.0"
    }
  }
}

provider “azurerm" {
  features {}
}

resource “azurerm_resource_group" “rg-test" {
  name = “test-rg"
  location = “East US2"
}

resource “random_id" “id-test" {
  byte_length = 4
}

resource “azurerm_storage_account" “test-sa" {
  name                     = “sa${random_id.id-test.dec}"
  resource_group_name      = azurerm_resource_group.rg-test.name
  location                 = azurerm_resource_group.rg-test.location
  account_tier             = “Standard"
  account_replication_type = “LRS"
  access_tier              = “Cool"

  tags = {
    environment = “Terraform Random Test"
  }
}

※Outputを確認した時とrequired_providersのVerはが違いますのでご注意下さい。

作成されたストレージアカウントを確認してみる

作成されたストレージアカウントを確認してみます。

作成されたストレージアカウントの確認

Azure Portalで確認してみます。
sa216174299と言う名前でストレージアカウントが作成されている事が分かります。

Teraform Showコマンドで確認してみます。
random_idで生成された値でストレージアカウントが作成されている事が分かります。

PS C:\terraform\RG> terraform show

# azurerm_storage_account.test-sa:
resource “azurerm_storage_account" “test-sa" {
    access_tier                    = “Cool"
    account_kind                   = “StorageV2"
    account_replication_type       = “LRS"
    account_tier                   = “Standard"
    name                           = “sa2161741299"

# random_id.id-test:
resource “random_id" “id-test" {
    b64_std     = “gNmN8w=="
    b64_url     = “gNmN8w"
    byte_length = 4
    dec         = “2161741299"
    hex         = “80d98df3"
    id          = “gNmN8w" 

Terraform Randomで生成した値をterraform apply -replaceを使って更新

Terraform Randomで生成した値リソースは意図的に再生成しない限り同じ値のままになります。
いくつか方法がありますが、terraform apply -replace(Terraformv0.15.2以降(それ以前はtaint))で置き換える事が出来ます。

※コマンドの解説は公式サイトを参照ください。コマンドの実行にあたっては十分注意して下さい。

terraform apply -replaceを実行してみる

terraform apply -replaceを実行してみます。
今回はuuid-testと言う名前で生成したrandom_uuidリソースを対象に実行しています。

結果を確認するとid=c721bf56-6364-79f8-9626-3e0445ac95a1が削除され、id=fb48e05a-665b-945c-2db1-1d7d8fdddc91が新規にに生成されている事が分かりました。

PS C:\terraform\RG> terraform apply -replace="random_uuid.uuid-test"

random_uuid.uuid-test: Destroying… [id=c721bf56-6364-79f8-9626-3e0445ac95a1]
random_uuid.uuid-test: Destruction complete after 0s
random_uuid.uuid-test: Creating…
random_uuid.uuid-test: Creation complete after 0s [id=fb48e05a-665b-945c-2db1-1d7d8fdddc91]

 最後に

Terraform Randomには色々なリソースがあり、多種多様なランダム値を簡単に生成できる事が分かりました。
ストレージアカウント作成時にrandom_idを利用していますが、random_stringを利用しても作成(オプションの指定が必要)が可能です。
引き続き色々試してみたい所です。

過去のTerraform関連の記事はこちらに記載しております。

Terraformの記事一覧