如何指定使用terraform aws_launch_template创建的ec2实例的子网ID



我想用一个自动缩放组lauch EC2实例。

我创建了一个安全组,其中包含来自ALB安全组及其与我的自定义VPC关联的入站规则。

resource "aws_security_group" "asg_sg" {
name        = "alb-inbound"
description = "Security group for autoscaling instances"
vpc_id      = aws_vpc.vpc_prod.id
}
resource "aws_security_group_rule" "inbound_alb" {
type                      = "ingress"
from_port                 = 3000
to_port                   = 3000
protocol                  = "tcp"
security_group_id         = "${aws_security_group.asg_sg.id}"
source_security_group_id  = "${aws_security_group.alb_sg.id}"
}

我想部署一些带有自动缩放组的实例,作为项目的测试

我的启动模板配置如下所示。

resource "aws_launch_template" "as_lt_node_app" {
name_prefix             = "as-lt-"
image_id                = data.aws_ami.amzlinux2.id
instance_type           = "t2.micro"
vpc_security_group_ids  = ["${aws_security_group.asg_sg.id}"]
user_data               = base64encode(file("${path.module}/install.sh"))
}

我的自动缩放组配置如下。

resource "aws_autoscaling_group" "asg_node_app" {
# launch_configuration  = "${aws_launch_configuration.as_lc_node_app.name}"
availability_zones    = [var.azs[0],var.azs[1]]
min_size              = 1
max_size              = 4 
target_group_arns     = ["${aws_alb_target_group.node_tg.arn}"]
health_check_type     = "ELB"
desired_capacity      = 2 
launch_template {
id      = aws_launch_template.as_lt_node_app.id
version = "$Latest"
}
}

现在,当我运行地形应用程序时,我得到了这个错误。

│ Error: Error creating Auto Scaling Group: ValidationError: You must use a valid fully-
formed launch template. Security group sg-01510848bd1c3a79d and subnet subnet-c5d624b8
belong to different networks.
│       status code: 400, request id: 8318256b-4c03-4be5-8be0-51473bc1e0b7
│
│   with aws_autoscaling_group.asg_node_app,
│   on c6-02_autoscaling.tf line 22, in resource "aws_autoscaling_group" "asg_node_app":
│   22: resource "aws_autoscaling_group" "asg_node_app" {

使用此模板创建的EC2实例似乎部署在默认的VPC子网中。有没有办法在launch_template中指定我正在使用的VPC?

我用launch_configuration尝试了这个自动缩放组,但我遇到了类似的错误。

我想在laun_template中尝试network_interfaces参数,但在这次部署中,我创建了一个子网列表

resource "aws_subnet" "public_subnet" {
count             = length(var.public_cidr)
availability_zone = var.azs[count.index]
vpc_id            = aws_vpc.vpc_prod.id
cidr_block        = var.public_cidr[count.index]
tags              = local.common_tags
}

在这种情况下,我可以使用多个子网吗?

使用vpc_zone_identifier属性在aws_autoscaling_group上指定VPC。这会从VPC中获取一个包含子网ID的列表,您希望在其中启动实例。通过知道子网,ASG将自动知道VPC。

此外,还需要删除availability_zones属性。来自文档:

availability_zones:组的一个或多个可用区域的列表。用于EC2 Classic,在未使用vpc_zone_identifier参数指定时,通过启动模板和默认子网的id附加网络接口。与vpc_zone_identifier冲突。

现在没有人应该使用EC2 classic。子网绑定到可用性区域,因此这些信息将从vpc_zone_identifier中获知。

使用文档中建议的更改修改我的代码,感谢Ervin的回答

我的ASG现在看起来像这样

resource "aws_autoscaling_group" "asg_node_app" {
# launch_configuration  = "${aws_launch_configuration.as_lc_node_app.name}"
depends_on            = [aws_alb_target_group.node_tg]
vpc_zone_identifier   = ["${aws_subnet.public_subnet.0.id}","${aws_subnet.public_subnet.1.id}"]
min_size              = 1
max_size              = 4 
target_group_arns     = ["${aws_alb_target_group.node_tg.arn}"]
health_check_type     = "ELB"
desired_capacity      = 2 
launch_template {
id      = aws_launch_template.as_lt_node_app.id
version = "$Latest"
}
}

这些资源是在没有任何问题的情况下创造出来的。

最新更新