我正在研究将自动缩放组用于将由 ELB 前端的网络服务器层。我遇到困难的一件事是如何为每个新实例提供正确的 DNS 名称。例如,我希望网络服务器具有frontend-web-XXX.prod.example.com
这样的名称,以便它们的名称在日志中显示正确并且易于组织。我还有另外两层我最终想要自动缩放,我希望它们也有类似api-web-XXX.prod.example.com
的名称。我对 cloudformation 模板有一些经验,并且已经使用关联的 Route53 记录启动了单个实例,但我没有看到任何迹象表明如何在自动缩放的组中完成此操作。
这不是您可以使用 CloudFormation 做的事情,因为它的参与停止在定义自动缩放组 - 它不需要看到由 ASG 启动的实例。自动缩放组也不给你任何方法来做到这一点。
相反,您可以确保您的实例在启动时运行某些东西以在 Route 53 中注册自己。 这篇文章讨论了使用 Chef来执行此操作,但您可以在独立脚本中执行相同的操作。
我发现这篇文章(https://underthehood.meltwater.com/blog/2020/02/07/dynamic-route53-records-for-aws-auto-scaling-groups-with-terraform/)解决了这个问题ASG 生命周期挂钩,通知 SNS 主题,触发 Lambda 函数将记录插入 R53。如果 ASG 缩减,则会触发另一个生命周期挂钩,导致 Lambda 函数删除 DNS 条目。
这是一个相当复杂的解决方案,我没有亲自尝试过,但它看起来拥有所有正确的组件来完成这里所要求的事情。
我使用的一种方法是在用户数据执行期间设置 R53 记录(https://gitlab.com/-/snippets/2213082)。我已经为 Windows AD 管理节点完成了此操作(仅不经常需要,因此除非需要,否则会终止)。为此,您需要一个具有正确权限的实例配置文件,以允许服务器操纵 DNS 区域(这可能对每个人都喜欢,也可能不是每个人都喜欢)。
另一种选择是在您创建的实例上使用固定 IP。不过,我不确定您如何能够使用此设置启动多个实例。您可以附加第二个具有固定 IP 或弹性 IP 的接口,您可以以某种方式从池中选择。这听起来又像是 userdata 的工作——尽管需要不同的权限,这对某些人来说可能更容易接受。
我能想到的最后一个选项是负载均衡器。LB 拥有 IP 地址并将流量发送到 ASG 中的实例。这可能是最简单的解决方案,虽然可能是最昂贵的 - 特别是如果您只计划拥有一个实例。