Terraform:如何将变量传递给 user_data 初始化脚本
Terraform: How can I pass variables to user_data init script
我已经被这个问题困扰了一段时间,但我无法解决它。
我正在启动一个运行 bash 脚本并安装一些东西的 EC2 实例。
同时,我也在启动一个RDS实例,但我需要能够将值从RDS端点传递到EC2实例以配置连接。
我正在尝试使用模板文件来执行此操作,就像这样
resource "aws_rds_cluster_instance" "cluster_instances" {
count = 1
identifier = "rds-prod-ddbb-${count.index}"
cluster_identifier = aws_rds_cluster.default.id
instance_class = "db.r5.large"
engine = "aurora"
engine_version = "5.6.mysql_aurora.1.22.5"
publicly_accessible = "true"
}
resource "aws_rds_cluster" "default" {
cluster_identifier = "aws-rds-ddbb-cluster"
availability_zones = ["us-west-2b"]
db_subnet_group_name = "default-vpc-003d3ab296c"
skip_final_snapshot = "true"
backup_retention_period = 30
vpc_security_group_ids = [aws_security_group.ddbb.id]
}
data "template_file" "RDSs" {
template = file("init.sh")
vars = {
rds = aws_rds_cluster.default.endpoint
}
depends_on = [
aws_rds_cluster.default,
aws_rds_cluster_instance.cluster_instances,
]
}
resource "aws_instance" "web_01" {
ami = "ami-0477c9562acb09"
instance_type = "t2.micro"
subnet_id = "subnet-0d0558d99ec3cd3"
key_name = "web-01"
user_data_base64 = base64encode(data.template_file.RDSs.rendered)
vpc_security_group_ids = [aws_security_group.ddbb.id]
ebs_block_device {
device_name = "/dev/sda1"
volume_type = "gp2"
volume_size = 20
}
tags = {
Name = "Web01"
}
depends_on = [
aws_rds_cluster.default,
aws_rds_cluster_instance.cluster_instances,
]
}
然后,我的init.sh
是这样的:
#!/bin/bash
echo "rds = $rds" > /var/tmp/rds
但是我在 /var/tmp/rds
中什么也没有得到,所以看起来变量 $rds
是空的。
非常感谢您的帮助。
Ps:我的输出配置如下:
outputs.tf
output "rds_endpoint" {
value = aws_rds_cluster.default.endpoint
}
这工作正常,当应用完成时,它会显示 rds 端点的值。
该变量不是 shell 变量,而是一个模板化变量 — 因此 terraform 将解析文件,无论其类型如何,并替换所述文件中的 terraform 变量。
知道这一点,$rds
不是 terraform 变量插值,while ${rds}
is。
因此,您的 bash 脚本应该是:
#!/bin/bash
echo "rds = ${rds}" > /var/tmp/rds
我已经被这个问题困扰了一段时间,但我无法解决它。
我正在启动一个运行 bash 脚本并安装一些东西的 EC2 实例。 同时,我也在启动一个RDS实例,但我需要能够将值从RDS端点传递到EC2实例以配置连接。
我正在尝试使用模板文件来执行此操作,就像这样
resource "aws_rds_cluster_instance" "cluster_instances" {
count = 1
identifier = "rds-prod-ddbb-${count.index}"
cluster_identifier = aws_rds_cluster.default.id
instance_class = "db.r5.large"
engine = "aurora"
engine_version = "5.6.mysql_aurora.1.22.5"
publicly_accessible = "true"
}
resource "aws_rds_cluster" "default" {
cluster_identifier = "aws-rds-ddbb-cluster"
availability_zones = ["us-west-2b"]
db_subnet_group_name = "default-vpc-003d3ab296c"
skip_final_snapshot = "true"
backup_retention_period = 30
vpc_security_group_ids = [aws_security_group.ddbb.id]
}
data "template_file" "RDSs" {
template = file("init.sh")
vars = {
rds = aws_rds_cluster.default.endpoint
}
depends_on = [
aws_rds_cluster.default,
aws_rds_cluster_instance.cluster_instances,
]
}
resource "aws_instance" "web_01" {
ami = "ami-0477c9562acb09"
instance_type = "t2.micro"
subnet_id = "subnet-0d0558d99ec3cd3"
key_name = "web-01"
user_data_base64 = base64encode(data.template_file.RDSs.rendered)
vpc_security_group_ids = [aws_security_group.ddbb.id]
ebs_block_device {
device_name = "/dev/sda1"
volume_type = "gp2"
volume_size = 20
}
tags = {
Name = "Web01"
}
depends_on = [
aws_rds_cluster.default,
aws_rds_cluster_instance.cluster_instances,
]
}
然后,我的init.sh
是这样的:
#!/bin/bash
echo "rds = $rds" > /var/tmp/rds
但是我在 /var/tmp/rds
中什么也没有得到,所以看起来变量 $rds
是空的。
非常感谢您的帮助。
Ps:我的输出配置如下:
outputs.tf
output "rds_endpoint" {
value = aws_rds_cluster.default.endpoint
}
这工作正常,当应用完成时,它会显示 rds 端点的值。
该变量不是 shell 变量,而是一个模板化变量 — 因此 terraform 将解析文件,无论其类型如何,并替换所述文件中的 terraform 变量。
知道这一点,$rds
不是 terraform 变量插值,while ${rds}
is。
因此,您的 bash 脚本应该是:
#!/bin/bash
echo "rds = ${rds}" > /var/tmp/rds