【问题标题】:How can i specify the subnet ID of my ec2 instances created with terraform aws_launch_template?如何指定使用 terraform aws_launch_template 创建的 ec2 实例的子网 ID?
【发布时间】:2022-01-14 00:38:07
【问题描述】:

我想使用自动缩放组启动 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 apply 时出现此错误。

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

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

【问题讨论】:

    标签: amazon-ec2 terraform terraform-provider-aws autoscaling


    【解决方案1】:

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

    另外,您需要删除availability_zones 属性。来自docs

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

    现在没有人应该使用 EC2 经典版。子网绑定到可用区,因此可以从vpc_zone_identifier 获知此信息。

    【讨论】:

    • 是的,这解决了问题!
    【解决方案2】:

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

    资源创建没有任何问题。

    【讨论】:

      猜你喜欢
      • 2020-11-30
      • 2021-08-09
      • 2021-07-28
      • 1970-01-01
      • 2020-07-19
      • 1970-01-01
      • 2018-03-22
      • 2021-03-17
      • 2021-11-17
      相关资源
      最近更新 更多