Jasper Inc.

地方在住エンジニアのテック&ライフブログ

【Terraform】templatefile関数でシェルスクリプトに配列を渡す【OCI】

前回はtemplatefile関数を使ってシェルスクリプトなどのファイルの中の値を変更する方法をシェアしましたが、今回はその変数が配列で、シェルスクリプト側でfor文で取り出す方法をシェアします。

main.tf
resource "oci_core_instance" "this" {
  availability_domain = var.availability_domain
  compartment_id      = var.compartment_id
  shape               = "VM.Standard.E4.Flex"
  shape_config {
    ocpus = 1
  }
  source_details {
    source_id   = "ocid1.image.oc1.ap-tokyo-1.aaaaaaaahhqgmyj2zb3bw6wnnvkvo7godb5vqpqqtuknosn5k5uvk5wphhwa"
    source_type = "image"
  }
  create_vnic_details {
    nsg_ids = [
      var.nsg_id
    ]
    subnet_id = var.subnet_id
  }

  metadata = {
    ssh_authorized_keys = var.ssh_keys
    user_data           = base64encode(templatefile("${path.root}/modules/userdata/init.sh", var.ip)) # << Here
  }
}
variables.tf
variable "ip" {
  type    = map(string)
  default = {
    env = ["dev", "test", "prod"]
  }
}
init.sh
#!/bin/bash

for item in "${env[@]}"; do
    touch /root/$item.txt
done
# エラーになる…
./modules/userdata/init.sh:17,26-27: 
Invalid character; This character is not used within the language.

Terraform側が[@]を解釈できず、エラーになっていると思われる。

variables.tf
variable "ip" {
  type    = map(string)
  default = {
    env = "dev test prod"
  }
}

配列ではなく、スペース区切りの文字列にする。

init.sh
#!/bin/bash

IFS=' ' read -r envList <<< "${env}"
for item in $envList; do
    touch /root/$item.txt
done

スペース区切りで再代入し、for文を使うとうまくいく。