在 terraform 中创建 AWS 实例时如何使用 user_data url?
How to use user_data url when creating an AWS instance in terraform?
Terraform 版本 = 0.12
data "template_file" "user_data" {
template = file("${path.module}/userdata.sh")
}
resource "aws_instance" "bespin-ec2-web-a" {
ami = "ami-0bea7fd38fabe821a"
instance_type = "t2.micro"
vpc_security_group_ids = [aws_security_group.bespin-sg.id]
subnet_id = aws_subnet.bespin-subnet-public-a.id
associate_public_ip_address = true
tags = {
Name = "bespin-ec2-web-a"
}
user_data = data.template_file.user_data.rendered
}
我想上传user_data到S3,调用URL使用。
我能做什么?
例如)
resource "template_file" "userdata_sh" {
template = "https://test.s3.ap-northeast-2.amazonaws.com/userdata.sh"
}
不是 100% 清楚要实现什么,但是,如果要指定 EC2 实例要使用的用户数据,那么在 S3 中使用 sh 文件是不可能的。
需要直接向 aws_instance terraform 资源指定用户数据内容。
EC2/userdata
resource "aws_instance" "this" {
ami = "${local.ami_this_id}"
instance_type = "${var.instance_type}"
subnet_id = "${var.subnet_id}"
vpc_security_group_ids = "${var.security_group_ids}"
key_name = "${aws_key_pair.this.key_name}"
iam_instance_profile = "${var.ec2_instance_profile_id}"
user_data = data.template_file.user_data.rendered # <----- Specify userdata content
root_block_device {
volume_type = "${var.root_volume_type}"
volume_size = "${var.root_volume_size}"
delete_on_termination = true
}
}
如果要上传到 S3 并将其复制到 EC2 实例中 运行 它作为 shell 脚本,则不需要上传到 S3 然后使用 AWS 将其复制到 EC2 实例中CLI S3 命令或使用例如在 EC2 中安装 S3 存储桶S3 保险丝.
S3 上传
首先,使用https://www.terraform.io/docs/providers/local/r/file.html
resource "local_file" "userdata_sh" {
content = data.template_file.user_data.rendered
filename = "your_local_userdata_sh_path"
}
然后使用https://www.terraform.io/docs/providers/aws/r/s3_bucket_object.html上传到S3。
resource "aws_s3_bucket_object" "object" {
bucket = "your_s3_bucket_name"
key = "userdata.sh"
source = "your_local_userdata_sh_path"
etag = "${filemd5("your_local_userdata_sh_path")}"
}
URL 模板资源
不可能。模板文件需要在您的本地机器上。如果共享 userdata.sh 是目标,那么请考虑使用例如在您的机器上安装 S3 S3 保险丝.
Terraform 版本 = 0.12
data "template_file" "user_data" {
template = file("${path.module}/userdata.sh")
}
resource "aws_instance" "bespin-ec2-web-a" {
ami = "ami-0bea7fd38fabe821a"
instance_type = "t2.micro"
vpc_security_group_ids = [aws_security_group.bespin-sg.id]
subnet_id = aws_subnet.bespin-subnet-public-a.id
associate_public_ip_address = true
tags = {
Name = "bespin-ec2-web-a"
}
user_data = data.template_file.user_data.rendered
}
我想上传user_data到S3,调用URL使用。 我能做什么?
例如)
resource "template_file" "userdata_sh" {
template = "https://test.s3.ap-northeast-2.amazonaws.com/userdata.sh"
}
不是 100% 清楚要实现什么,但是,如果要指定 EC2 实例要使用的用户数据,那么在 S3 中使用 sh 文件是不可能的。
需要直接向 aws_instance terraform 资源指定用户数据内容。
EC2/userdata
resource "aws_instance" "this" {
ami = "${local.ami_this_id}"
instance_type = "${var.instance_type}"
subnet_id = "${var.subnet_id}"
vpc_security_group_ids = "${var.security_group_ids}"
key_name = "${aws_key_pair.this.key_name}"
iam_instance_profile = "${var.ec2_instance_profile_id}"
user_data = data.template_file.user_data.rendered # <----- Specify userdata content
root_block_device {
volume_type = "${var.root_volume_type}"
volume_size = "${var.root_volume_size}"
delete_on_termination = true
}
}
如果要上传到 S3 并将其复制到 EC2 实例中 运行 它作为 shell 脚本,则不需要上传到 S3 然后使用 AWS 将其复制到 EC2 实例中CLI S3 命令或使用例如在 EC2 中安装 S3 存储桶S3 保险丝.
S3 上传
首先,使用https://www.terraform.io/docs/providers/local/r/file.html
resource "local_file" "userdata_sh" {
content = data.template_file.user_data.rendered
filename = "your_local_userdata_sh_path"
}
然后使用https://www.terraform.io/docs/providers/aws/r/s3_bucket_object.html上传到S3。
resource "aws_s3_bucket_object" "object" {
bucket = "your_s3_bucket_name"
key = "userdata.sh"
source = "your_local_userdata_sh_path"
etag = "${filemd5("your_local_userdata_sh_path")}"
}
URL 模板资源
不可能。模板文件需要在您的本地机器上。如果共享 userdata.sh 是目标,那么请考虑使用例如在您的机器上安装 S3 S3 保险丝.