![如何为 Auto Scaling 创建的 EC2 实例创建 DNS 条目?](https://linux22.com/image/633976/%E5%A6%82%E4%BD%95%E4%B8%BA%20Auto%20Scaling%20%E5%88%9B%E5%BB%BA%E7%9A%84%20EC2%20%E5%AE%9E%E4%BE%8B%E5%88%9B%E5%BB%BA%20DNS%20%E6%9D%A1%E7%9B%AE%EF%BC%9F.png)
我正在研究使用自动扩展组来为由 ELB 前置的 Web 服务器层级提供服务。我遇到的一个难题是如何为每个新实例赋予正确的 DNS 名称。例如,我希望 Web 服务器具有如下名称,frontend-web-XXX.prod.example.com
这样它们的名称在日志中显示正确,并且易于组织。我还有另外两个层级,我最终希望它们能够自动扩展,并且我希望它们api-web-XXX.prod.example.com
也具有如下名称。我对云形成模板有一些经验,并且已经启动了具有相关 Route53 记录的单个实例,但我没有看到任何迹象表明如何在自动扩展组中完成此操作。
答案1
您无法使用 CloudFormation 来做到这一点,因为它的作用仅限于定义自动扩展组 - 它无需查看由 ASG 启动的实例。自动扩展组也不会为您提供任何方法来执行此操作。
相反,您可以确保您的实例在启动时运行某些程序以在 Route 53 中注册自己。 这篇文章讨论了使用 Chef来做到这一点,但你可以在独立脚本中做同样的事情。
答案2
我找到了这篇文章(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 中的实例。这可能是最简单的解决方案,尽管可能是最昂贵的 - 特别是如果您只打算拥有一个实例。
答案3
尝试 KopiCloud AD API Terraform 提供程序 (https://registry.terraform.io/providers/KopiCloud-AD-API/ad/latest);它可以在 Microsoft DNS 中创建/删除/列出 DNS 记录。
我编写了 Terraform 代码,使用 AWS LB 创建 AWS EC2 实例,然后它们在 Microsoft DNS 中注册记录。
查看 KopiCloud AD API GitHub 上的示例 (https://github.com/KopiCloud-AD-API/terraform-kopicloud-ad-api-dns-a-records)