【问题标题】:AWS: add second internal load balancer to elastic beanstalk in terraformAWS:在 terraform 中向弹性 beantalk 添加第二个内部负载均衡器
【发布时间】:2019-10-19 00:39:46
【问题描述】:
【问题讨论】:
标签:
amazon-web-services
terraform
amazon-elastic-beanstalk
terraform-provider-aws
【解决方案1】:
我认为这可以完美实现,但您需要在方法上稍作改动。
EB 内部不会有 2 个负载均衡器,但是您的 beanstalk 将描述从第二个负载均衡器开始的基础架构,设置为内部,然后您将添加另一个指向 BE 负载的公共负载均衡器平衡器。
与 AWS 博客中提出的方法相比,我们可以更轻松地实现这一目标。
为此,您的 BE 设置将与您拥有的几乎相同,但是:
- 将负载平衡器设置为网络类型。这是唯一允许您在负载平衡器中拥有静态 IP 的类型。
- 将负载均衡器设置为内部(在 beanstalk 的网络配置内部,将可见性设置为内部,并取消选中“将公共 IP 地址分配给 EC2 实例...”
- 将弹性 IP 分配给您的负载均衡器,至少 2 个,位于不同的可用区。
- Beanstalk 的其余部分保持原样。
现在创建一个公共负载均衡器:
- 这可以是您需要的任何类型。如果你想做 SSL 终止或任何其他第 7 层魔法,也许是 ALB。此外,它必须是公开的
- 创建一个新的目标组。该组的目标类型应为 IP。
- 在上面注册您的网络负载均衡器的 2 个弹性 IP。
- 向您的 ALB 添加一个指向此目标组的侦听器
这会变魔术。您将需要检查如何在 terraform 中执行此操作,但该方法非常简单,因此我确信 terraform 会让您这样做。
与 AWS 博客(其目的是为了完全不同的目的)相比,这样做的优势在于,这里的内部负载均衡器是网络,而外部则不需要。由于 NLB 是内部的,您可以避免基础架构中的大量开销,也可以避免动态逻辑,例如他们建议注册 IP 地址的 lambda。
使用这种方法,您可以获得更具声明性的架构,更易于在 terraform 中描述,并且更易于在生产中维护。
【解决方案2】:
您只能将一个目标组与一个负载均衡器相关联。将目标组与负载均衡器关联后,该目标组将无法再与另一个 ALB 关联。
您可能会想出一个解决方法,使用不同的方法,例如端口和安全组规则,或者创建第二个目标组。
这些都不是 Elastic beanstalk 的设计初衷。这只是开发人员推送代码并远离底层基础设施的一种简单方法。当复杂程度增加时,就需要离开 EB。
【解决方案3】:
您可以在选项设置上从 EB 扩展其 TargetGroupARNs,
使用 cloudformation 语法:
- Namespace: aws:cloudformation:template:resource:property
ResourceName: AWSEBAutoScalingGroup
OptionName: TargetGroupARNs
Value: [{\"Ref\":\"AWSEBV2LoadBalancerTargetGroup\"},"ARN_FROM_A_EXTERNAL_TARGETGROUP_LINKING_TO_ANOTHER_LOADBALANCER"}]
而且,是的,我刚刚找到了对 aws:cloudformation:template:resource:property here 的引用,根本没有文档