我将在 VPC 中默认子网中的 Elastic Beanstalk 自动扩展组中拥有多个 EC2 实例。这些 EC2 实例上的应用程序需要连接到使用 IP 地址白名单允许访问的第三方服务。因此,我需要一个或多个静态 IP 地址,我可以将这些地址提供给此服务提供商,以便将它们添加到白名单中。我的理解是,获取静态 IP 的唯一方法是获取弹性 IP 地址。而且我一次只能将弹性 IP 与一个 EC2 实例关联 - 我无法将其与我的整个子网或互联网网关关联(这是正确的吗?)。那么,我是否需要为每个 EC2 实例设置一个弹性 IP,以便每个实例都可以单独列入白名单?如果自动扩展添加了另一个实例,这将如何工作?我是否应该有一个具有弹性 IP 的 EC2 实例,并通过该实例路由所有传出流量?如果是这样,该实例是否需要专门用于此目的,还是可以是运行我的应用程序的实例之一?
答案1
您需要一个 NAT。此配置通常用于支持 VPC 中的私有子网,有相当详细的指南这里。一旦您的 VPC 配置为使用 NAT 实例,所有出站流量都将归因于 NAT 实例的 EIP。
如果是这样,该实例是否需要仅用于此目的,或者它可以是运行我的应用程序的实例之一?
从技术上来说你也许可以,但这不是一个好主意:
- 角色隔离可以保证良好的安全性。
- 您希望您的应用服务器具有相似或相同的负载配置文件。如果一个实例由于 NAT 而多出了 10% 的负载,那么当您达到该实例的限制时,您将不得不过早地进行扩展。随着更多实例添加到您的集群中,NAT 变得越来越繁忙,这种情况会变得更糟。
- 您希望您的应用服务器完全相同且短暂,这样当出现问题或需要扩展时,您可以拆除和/或更换它们。拥有一个与其他服务器不同的应用服务器将是一个很大的麻烦。
你可能如果您的实例是容器化的,那么您就可以摆脱它,但这可能仍然不是一个好主意。
还要记住,您的 NAT 实例可能是单点故障,因此您可能需要考虑冗余。
答案2
我知道这是一个老话题 - 对于现在有类似用例的人来说,AWSnat-网关将会是一个更好的解决方案。
答案3
我没有足够的声誉来评论上述答案,但我想添加一些您需要了解的信息,如果使用 NAT 网关来实现这一点。创建 NAT 网关时,您需要选择一个子网和一个弹性 IP 地址。
起初,我只是将 NAT 网关添加到我的弹性负载均衡器和 EC2 实例所在的同一子网。然后,您必须将 NAT 网关添加到您的路由表。我将 NAT 网关添加为我尝试联系的外部数据库服务器 IP 的目标。这导致我的弹性 beantalk 中托管的应用程序超时。这是因为它们试图通过 NAT 连接到该外部数据库。它们到达 NAT,然后 NAT 尝试通过互联网联系我的服务器,并在其所在子网的路由表中查找它,而该子网又指向自身,从而形成了一个循环。
解决方案是,在创建 NAT 网关之前,为 NAT 创建一个新子网,以便 NAT 拥有自己的子网和路由表。在 NAT 的路由表中,将所有流量指向互联网网关。在主路由表中,将您的外部 IP 指向 NAT。然后,当您的 EC2 实例尝试连接到您的外部 IP 时,它们将在主路由表(或您为实例所在的子网定义的任何路由表)中查找它们,并找到 NAT。然后,您的 NAT 将在其自己的路由表中查找该 IP,并找到互联网。