没有名为 "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 编码,我想这不是你想要的。)
使用模板提供程序的 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 编码,我想这不是你想要的。)