没有名为 "REGION" 的变量



使用模板提供程序的ec2启动临时用户数据定义即将被templatefile函数取代,因为它已被弃用。

定义本身可以毫无问题地完成,但在规划过程中出现错误,称用于获取实例元数据等的处理变量未定义,有什么方法可以避免这种情况吗?

$ 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编码,我想这不是你想要的。(

相关内容

  • 没有找到相关文章

最新更新