tahoku80のブログ

常体と敬体が入り混じるソフトウェアデベロッパーブログ

Terraformでtemplatefileを利用してcustom_dataにbase64encodeしたcloud-configファイルを渡す

はじめに

紹介するコードで実現できることはタイトルの通り。

templatefileとbase64encodeを併用しているサンプルがあまり見当たらなかったので、自分が書いたものを載せておく。

結論

コードのサンプルは以下。関連する箇所のみ抜粋してある。[...]は中略箇所を表す。

main.tf

resource "azurerm_linux_virtual_machine" "mylinuxvm" {
  custom_data = base64encode(templatefile("./files/cloud-config.cfg", { computer_name = local.computer_name }))

  [...]

}

locals.tf

locals {
  computer_name  = "mycomputername"
}

files/cloud-config.cfg

#cloud-config
runcmd:
 - hostnamectl set-hostname ${computer_name}

provider.tf

terraform {
  required_version = "~> 1.1.6"

  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = "=2.97.0"
    }
  }
}

  backend "azurerm" {
  [...]
  }

provider "azurerm" {
  features {}
}

補足

custom_dataにcloud-configファイルの内容を渡す場合、base64encodeする必要がある。加えてcloud-configファイルに変数を利用したいケースがあると思う。

参照するファイル内に変数を利用したいケースで以前から使用されているtemplate_fileは非推奨。0.12以降ではtemplatefileを使用する。

template_file

In Terraform 0.12 and later, the templatefile function offers a built-in mechanism for rendering a template from a file. Use that function instead, unless you are using Terraform 0.11 or earlier.