AWS Cloudformation 使用内部 IP 地址进行通信

AWS Cloudformation communicating using internal IP addresses

我正在尝试使用 AWS Cloudformation 创建 Web 应用程序。这个特定的应用程序将有 3 个实例(Web 服务器、应用程序服务器、RDS 数据库)。我希望这些实例能够相互交谈。比如Web服务器要和App服务器对话,App服务器要和RDS数据库对话。

我不明白如何配置服务器以便它们知道彼此的 IP 地址。我认为有 3 种方法可以做到这一点 - 但我不确定其中哪一种是现实可行的:

  1. 我可以在堆栈创建期间分配一个固定的私有 IP 地址(例如 192.168.0.2 等)——这样我就可以预先知道每个实例的 IP 地址
  2. 我可以等待 AWS Cloudformation return 创建的实例的 IP 地址,然后手动调整我的代码以使用这些 IP 地址进行通信
  3. 我可以在堆栈创建过程中以某种方式获取已创建实例的 IP 地址,并将其作为参数存储在我创建的下一个实例中(不确定 Cloudformation 是否允许这样做?)

哪种设置方式最好?另外,请分享一些关于我如何在 Cloudformation 中执行此操作的详细信息。

一个解决方案是将您的 Web 服务器和应用程序服务器放在 ELB(负载平衡器)后面。这样,您的 Web 服务器将使用 ELB 的 URL(而不是应用服务器的 IP)与应用服务器通信。应用服务器可以通过 RDS 实例的端点(同样是 URL)与 RDS 实例通信。

假设您将基础架构分为 3 个 CloudFormation 堆栈:RDS 数据库、应用程序服务器和 Web 服务器。 RDS 堆栈将通过 CloudFormation 输出功能公开 RDS 实例。该端点将依次用作应用程序服务器堆栈的 CloudFormation 参数。您可以在应用服务器 LauchConfiguration 的 UserData 字段中插入 RDS 端点,以便在启动时,您的应用服务器将知道 RDS 实例的端点。最后,您的应用服务器堆栈将公开应用服务器的 ELB 端点(再次使用 CloudFormation 输出功能)。使用相同的方法,您的应用程序服务器的 ELB 的 URL 将被注入并由您的 Web 服务器堆栈使用。

附带说明一下,使用自动缩放组监督您的服务(Web 服务器、应用程序服务器)也是一个好主意。您的实例很可能会因您无法控制的因素而终止。在这种情况下,您会希望 Autoscaling 组启动一个全新的实例并将其放在您的 ELB 后面。