【问题标题】:Elastic Load Balancing both internal and internet-facing内部和面向 Internet 的 Elastic Load Balancing
【发布时间】:2018-05-30 00:53:45
【问题描述】:

我们正在尝试在 AWS 中使用 Elastic Load Balancing 和自动缩放功能,以便我们可以根据需要进行缩放。

我们的应用程序由几个较小的应用程序组成,它们都在同一个子网和同一个 VPC 上。

我们希望将 ELB 放在我们的一个应用和其他应用之间。

问题是我们希望负载均衡器在使用 API 的不同应用程序之间在内部同时面向互联网工作,因为我们的应用程序仍然有一些应该使用的用途在外部完成,而不是通过 API。

我已经阅读了这个question,但我无法从那里确切地知道如何做到这一点,它并没有真正指定任何步骤,或者我确实非常了解它。

我们可以有一个内部和外部的 ELB 吗?

为了记录,我只能通过 VPN 访问这个网络。

【问题讨论】:

  • 您可以设置一个私有 DNS 地址以通过 Route 53 解析到您的内部 ELB,因此如果您可以将其用于您的内部 API 调用,那么它应该可以正常工作。如果您必须使用静态 IP 地址而不是 DNS 端点,则可能会遇到困难。

标签: amazon-web-services amazon-ec2 load-balancing autoscaling


【解决方案1】:

我创建了一个 Lambda 函数,用于检查哪些私有 IP 设置为负载均衡器,并在更改时更新 Route53 记录:https://github.com/Bramzor/lambda-sync-private-elb-ips

使用此功能,您可以轻松利用 ELB 进行私有流量。我个人使用它通过 VPC 区域间对等互连将多个区域相互连接,而无需额外的 ELB。

【讨论】:

  • 与拥有私人 lb 相比要花多少钱?
  • @lanwen 运行这种 Lambda 的成本可以忽略不计。例如,如果 lambda 在 10 秒内完成(很可能会低于此时间),那么在加拿大,每 1000 次调用将花费您 2 美分。再加上 EventBridge 和 CloudWatch Logs 的成本甚至可以忽略不计。
  • @lanweb 与每月支付 10 美元购买专用私有 LB 相比,这些 Lambda 函数只需几美分。
【解决方案2】:

我面临同样的挑战,我可以确认目前最好的解决方案是拥有两个不同的 ALB,一个面向 Internet,另一个是内部的。您可以将两个 ALB 附加到单个 AutoScaling 组,以便您可以访问同一个集群。

确保两个 ALB 的网络选项(子网、安全组)相同,以便它们访问相同的集群实例。自动缩放和启动配置与连接到同一 AutoSacling 组的两个 ALB 无缝协作。这也适用于从 ElasticBeanstalk 环境创建的 ALB。

【讨论】:

    【解决方案3】:

    标准的 AWS 解决方案是为此配备一个额外的内部 ELB。 看起来@DaryL 有一个有趣的解决方法,但如果不更新 DNS,它可能会失败 5 分钟。此外,由于内部 IP 共享 ENI 和 ELB 外部 IP 的安全性,因此无法为内部 IP 设置单独的安全组。

    【讨论】:

      【解决方案4】:

      我不同意@MattHouser 的回答。实际上,在 VPC 中,您的 ELB 的所有内部接口都列在具有公共 IP 和主要私有 IP 的网络接口中。 我已经测试了我的公共 ELB 的私有 IP,它的工作方式与外部 IP 完全一样。

      问题是:这些 IP 没有像私有 ELB DNS 那样以最新的方式在任何地方列出。所以你必须自己做。

      我为此制作了一个小 POC 脚本,带有一个内部 Route53 托管区域:https://gist.github.com/darylounet/3c6253c60b7dc52da927b80a0ae8d428

      【讨论】:

      • 有了这个解决方案,具体来说,负载均衡器关联的IP地址是动态的不是问题吗?见forums.aws.amazon.com/message.jspa?messageID=287183
      • 小心,在这个 AWS 论坛帖子上,他们在谈论公共 IP。我提供的脚本在私有 Route53 区域中注册私有 ELB IP。公共和私有 ELB IP 都是动态的,因此您必须定期启动此脚本,例如在 crontab 中。我从 1 年开始就将它投入生产,没有任何问题,我每 5 分钟在 crontab 中启动这个脚本。
      【解决方案5】:

      弹性负载均衡器不可能同时具有公共 IP 地址和私有 IP 地址。它是其中之一,但不是两者兼而有之。

      如果你想让你的 ELB 有一个私有 IP 地址,那么它就不能监听来自互联网的请求。

      如果您的 ELB 是面向公众的,您仍然可以使用公共端点从您的内部 EC2 实例调用它。但是,有一些注意事项:

      • 流量将退出您的 VPC 并重新进入。私有 IP 地址不会为您提供直接的实例到 ELB 连接。
      • 您也不能在安全组规则中使用安全组。

      有 3 种替代方案:

      1. 复制 ELB 和 EC2 实例,一个专用于私有流量,一个专用于公共流量。
      2. 有 2 个 ELB(一个公共,一个私有)共享相同的后端 EC2 实例。
      3. 不要将 ELB 用于私有或公共流量,而是在单个 EC2 实例上使用弹性 IP 地址(如果是公共的)或私有 IP 地址(如果是私有的)。

      【讨论】:

      • 谢谢,这就是我要找的东西
      • 这实际上不是真的,因为@DaryL 已经在他的回答中发布了。您可以使用 AWS API 和 SDK 查找内部 IP 地址,然后在 Route53 中为这些地址创建您自己的 DNS 记录。每 5 分钟更新一次就足够了,但是在两者之间放置类似 HAProxy 的东西是安全的,以确保所有 IP 仍然存在。或者使用 Route53 健康检查,但我认为这些可能会变得非常昂贵。
      猜你喜欢
      • 1970-01-01
      • 2012-05-01
      • 2016-11-28
      • 1970-01-01
      • 1970-01-01
      • 2012-01-17
      • 2011-08-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多