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

How can i specify the subnet ID of my ec2 instances created with terraform aws_launch_template?

我想启动带有自动缩放组的 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}"
}

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

我的 launch_template 配置如下所示。

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"
  }
}

现在当我 运行 terraform 应用时我得到这个错误。

    │ 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 属性。来自 docs:

availability_zones: A list of one or more availability zones for the group. Used for EC2-Classic, attaching a network interface via id from a launch template and default subnets when not specified with vpc_zone_identifier argument. Conflicts with 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"
  }
}

资源已创建,没有任何问题。