terraformでworkspace名を使って複数環境を作る
2020-06-29
azblob://2022/11/11/eyecatch/2020-06-29-create-multiple-environments-using-workspace-name-with-terraform-000.jpg

名古屋事業所の松枝です。
以前の記事で、workspaceを使って複数環境作るということを書きました。
今回は具体的にどう作ればよいかを簡単に紹介します。

workspaceとは?

https://www.terraform.io/docs/state/workspaces.html
上記に説明があります。
terraformの実行状態を保管するデータに名前を付けて、別々で管理するイメージですね。

workspaceには名前を付けることができ、特に指定せずに使っている場合は default という名前のworkspaceが使われている状態です。

workspaceを使う

terraform workspace new 01 のように書くと、01 という名前のworkspaceができ、それを使用している状態になります。

また、現在選択しているworkspaceをtfファイルから参照することができます。terraform.workspace という変数にworkspace名が入ってます。
これを参照すれば、workspace名に基づいたコードが書けるわけです。

workspace名を制限する

ということで、リソース名を生み出すコードで terraform.worspace を参照してあげれば良いよね以上終了なブログになってしまうんですが、もう少し考えてみました。

例えばチーム編成が流動的な場合、不意にノウハウがチームから消失することがあります。
(自動化しておけ、と言われると辛い)
terraformを作った人間が想定したworkspace名以外のものを使われると困るケースがあります。
例えばAzureのストレージアカウントの名前にworkspace名をそのまま使用している場合、長い名前を使われると24文字制限に引っかかるリスクがあります。

こうしたことを防ぐため、workspace名を制限する方法を考えました。
下記のコードを見てください。

provider "azurerm" {
  version = "~>2.10.0"
  features {}
}

locals {
  config = {
    "01" = { revision = "01" }
    "02" = { revision = "02" }
  }
  revision            = local.config[terraform.workspace]["revision"]
  resource_group_name = "rg${local.revision}"
}

resource "azurerm_resource_group" "example" {
  name     = local.resource_group_name
  location = "japaneast"
}

ローカル変数 revision の値を作成する処理にご注目ください。
ローカル変数 config に入っている revision の値を terraform.workspace を使って引用しているのですが、この例ではworkspace名が "01" か "02" の場合しか動かず、それ以外のworkspace名が指定された場合、terraform planの時点でエラーになります。

これで、意図しないworkspace名を使用されずに済みますね。

上記のterraformコードは普通に動くので、az loginして作業可能なサブスクリプションに az account set した状態で下記を試してみてください。

  • workspaceの設定をしない状態だとエラーになる
  • 「01」という名前のworkspaceを使用した状態だとリソースグループ rg01 が作られる
  • 「02」という名前のworkspaceを使用した状態だとリソースグループ rg02 が作られる
  • 「03」という名前のworkspaceを使用した状態だとエラーになる

まとめ

workspaceを使って効率的に安全に環境構築しましょう!