没有名为 "REGION" 的变量

There is no variable named "REGION"

使用模板提供程序的 ec2 启动模板用户数据定义即将被替换为模板文件函数,因为它已被弃用。

定义本身可以没有问题,但是在规划过程中出现错误,说获取实例元数据等的处理变量未定义,有什么办法可以避免吗?

  $ terraform version
  Terraform v0.13.5
data "template_file" "userdata" {
  template = templatefile("${path.module}/userdata.sh.tpl",
    vars....
  )
}

resource "aws_launch_template" "sample" {
....
   user_data = base64encode(data.template_file.userdata.rendered)
....
}

以下定义适用处理

export LOCAL_IP=$(ec2metadata --local-ipv4)
export GLOBAL_IP=$(ec2metadata --public-ipv4)
export REGION=$(curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone | sed 's/[a-z]$//')
export AWS_DEFAULT_REGION="$${REGION}"
$ terraform plan
Error: failed to render : <template_file>:13,30-36: Unknown variable; There is no variable named "REGION"., and 4 other diagnostic(s)

谢谢

一起使用 template_file 数据源和 templatefile 函数没有意义,因为它们都做同样的事情:渲染模板。

在您当前的配置中,您有 templatefile 函数呈现模板以生成字符串,然后 template_file 函数将 的结果 解释为如果它是一个模板,那么您的模板将被评估两次。

第一个评估将按预期将 $${REGION} 变成 ${REGION},然后第二个评估将尝试将 ${REGION} 作为模板插值处理。

相反,完全删除 template_file 数据源(已弃用),只需 使用 templatefile 函数:

   user_data = templatefile("${path.module}/userdata.sh.tpl, {
     # ...
   })

(我在这里删除了 base64encode 函数,因为 user_data 需要一个未编码的字符串值,其中 提供程序本身 将进行 base64 编码。如果你调用base64encode 你自己在这里然后你最终会得到两级 base64 编码,我想这不是你想要的。)