EC2. 负载均衡器。至少需要指定两个子网。

28

我正在尝试创建和配置负载均衡器。可用区部分只有一个子网和一个区域。

我遇到了错误:

必须指定至少两个子网。

简单问题 - 我该怎么做?谢谢。


2
听起来你需要在同一地区的不同可用区中创建至少一个子网。创建后,在配置ELB时应该可以选择它。 - dmulter
1
@dmulter 是的,我已经明白了。请添加您的答案。 - Dmitry Grinko
@dmulter 谢谢,那个方法可行。关键点是区域的不同 AZ。 - user11814208
3个回答

18

首先需要在您的VPC中创建两个或更多的子网。通常最好为您的区域中的每个可用区(AZ)创建至少一个子网。请确保根据您的架构选择公共/私有。

AWS文档中没有具体的示例,但请确保先了解VPC概念和子网的创建。有关创建子网的最接近示例演练,请参见场景和示例

现在在配置ELB时选择子网应该很简单了。


当每个ELB指向不同的实例时,我可以为两个ELB使用相同的子网吗? - BartusZak
@BartusZak - 是的,你可以。 - kiran01bm

4
您的VPC需要两个子网:最好的做法是在不同的可用区域中拥有一个子网,例如ab。 TERRAFORM_CONFIG_NAME.tf 的相关部分应如下所示:
setting {
    namespace = "aws:ec2:vpc"
    name      = "Subnets"
    value     = "${lookup(var.vpc_subnets, format("%s_%s", var.location, var.availability_zone))}, ${lookup(var.vpc_subnets, format("%s_%s", var.location, var.secondary_availability_zone))}"
}

像这样的variables.tf:

variable "vpc_subnets" {
  type = "map"
  default = {
    "frankfurt_a" = "subnet-12345671"
    "frankfurt_b" = "subnet-12345672"
    "frankfurt_c" = "subnet-12345673"
    "ireland_a" = "subnet-12345674"
    "ireland_b" = "subnet-12345675"
    "ireland_c" = "subnet-12345676"
  }
}

variable "availability_zone" {
  default = "a"
}

variable "secondary_availability_zone" {
  default = "b"
}


variable "regions" {
  type = "map"
  default = {
    "frankfurt" = "eu-central-1"
    "ireland" = "eu-west-1"
    "london" = "eu-west-2"
  }
}

variable "location" {
  default = "ireland"
}

另外,也可以在TERRAFORM_CONFIG_NAME.tf的value字段中直接提供子网列表,例如:value = "subnet-1, subnet-2, subnet-3" - Jonas

1

有一种更简单的方法来解决这个问题。可以参考下面的文档代码作为示例。

resource "aws_lb" "test" {
  name               = "test-lb-tf"
  internal           = false
  load_balancer_type = "application"
  security_groups    = [aws_security_group.lb_sg.id]
  subnets            = [for subnet in aws_subnet.public : subnet.id]

  enable_deletion_protection = true

  access_logs {
    bucket  = aws_s3_bucket.lb_logs.id
    prefix  = "test-lb"
    enabled = true
  }

  tags = {
    Environment = "production"
  }
}

希望这能有所帮助。

请问您能否澄清提供的代码中是什么使得它更“容易”? - AlexHalkin
1
过去,您需要使用 for_each,也许我指的是您仍然可以这样做。但是现在只需使用一行代码即可:subnets = [for subnet in aws_subnet.public : subnet.id]以避免复杂性。希望这回答了您的问题。 - augusto valdivia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接