[英]Dinamically add resources in Terraform
我设置了一个 jenkins 管道,它启动 terraform 以在我们的 VPC 中创建一个新的 EC2 实例,并在每次运行时将其注册到我们在 R53(同时创建)上的私有托管区域。
我还设法将状态保存到 S3 中,因此它不会因重新创建托管区域而失败。
我遇到的主要问题是,每次运行 terraform 时,都会不断用新实例替换前一个实例,而不是将其添加到实例池中。
如何避免这种情况?
这是我的代码片段
terraform {
backend "s3" {
bucket = "<redacted>"
key = "<redacted>/terraform.tfstate"
region = "eu-west-1"
}
}
provider "aws" {
region = "${var.region}"
}
data "aws_ami" "image" {
# limit search criteria for performance
most_recent = "${var.ami_filter_most_recent}"
name_regex = "${var.ami_filter_name_regex}"
owners = ["${var.ami_filter_name_owners}"]
# filter on tag purpose
filter {
name = "tag:purpose"
values = ["${var.ami_filter_purpose}"]
}
# filter on tag os
filter {
name = "tag:os"
values = ["${var.ami_filter_os}"]
}
}
resource "aws_instance" "server" {
# use extracted ami from image data source
ami = data.aws_ami.image.id
availability_zone = data.aws_subnet.most_available.availability_zone
subnet_id = data.aws_subnet.most_available.id
instance_type = "${var.instance_type}"
vpc_security_group_ids = ["${var.security_group}"]
user_data = "${var.user_data}"
iam_instance_profile = "${var.iam_instance_profile}"
root_block_device {
volume_size = "${var.root_disk_size}"
}
ebs_block_device {
device_name = "${var.extra_disk_device_name}"
volume_size = "${var.extra_disk_size}"
}
tags = {
Name = "${local.available_name}"
}
}
resource "aws_route53_zone" "private" {
name = var.hosted_zone_name
vpc {
vpc_id = var.vpc_id
}
}
resource "aws_route53_record" "record" {
zone_id = aws_route53_zone.private.zone_id
name = "${local.available_name}.${var.hosted_zone_name}"
type = "A"
ttl = "300"
records = [aws_instance.server.private_ip]
depends_on = [
aws_route53_zone.private
]
}
结果是我之前创建的实例被销毁并创建了一个新实例。 我想要的是继续使用此代码添加实例。 谢谢你
您的代码仅创建一个实例aws_instance.server
,并且对其属性的任何更改都只会在您的后端在 S3 中时修改该实例,因此它充当每个管道的全局状态。 aws_route53_record.record
和脚本中的任何其他内容也是如此。
如果您希望不同的管道重用完全相同的脚本,您应该使用不同的工作空间,或者为每个管道创建不同的 TF 状态。 另一种替代方法是重新定义您的 TF 脚本,以将实例映射作为输入变量并使用for_each创建不同的实例。
如果这些实例应该相同,您应该使用aws_autoscaling_group和所需容量来管理它们的数量。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.