用户数据的Terraform模板文件转义bash变量



我有一个非常简单的用户数据脚本:

#!/bin/bash
# Create script that will be executed as cron
cat > generate_rds_password.sh <<EOF
export AWS_DEFAULT_REGION=${region}
echo "Generating password"
export PGPASSWORD="$(aws rds generate-db-auth-token --hostname ${rds_host} --port 5432 --region ${region} --username ${pgusername})"
echo "$${PGPASSWORD}"
EOF
# Make it executable
chmod +x generate_rds_password.sh

这样做的目的是创建一个脚本,并使其可执行。它做了一些其他的事情,但与这个问题无关。

我调用Terraform:生成这个脚本的方式

resource "aws_launch_template" "rds_bastion" {
<...>
user_data = base64encode(templatefile("${path.module}/bastion_userdata/startup.sh", {
rds_host        = data.aws_db_instance.rds_instance[count.index].address
pgusername      = var.pgmonitor_user
region          = var.region
environment     = var.environment
}))
}

现在,由于某些原因,我无法响应$PGPASSWORD。TF计划向我显示了正确的命令(echo "${PGPASSWORD}"(,但当我从实例中抓取文件时,尽管PGPASSWORD是正确生成的,但回波是空的:

export PGPASSWORD="xxxx.asdsadsad.eu-central-1.rds.amazonaws.com:5432/?Action=connect&DBUser=asdasd&X-Amz-Algorithm=...."
echo ""

我在这里错过了什么?从这个线索来看,这似乎是正确的方式?

因此,在阅读了这篇博客文章后,如果从脚本创建脚本,变量的转义方式似乎有所不同。

对我有效的是$$$的组合

cat > generate_rds_password.sh <<EOF
export AWS_DEFAULT_REGION=${region}
echo "Generating password"
TF_PGPASSWORD="$(aws rds generate-db-auth-token --hostname ${rds_host} --port 5432 --region ${region} --username ${pgusername})"
echo $${TF_PGPASSWORD}
EOF

最新更新