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を使用する。
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.