将域名分配给 AWS Fargate 任务

将域名分配给 AWS Fargate 任务

我有一个 AWS Fargate 任务在公共子网中运行 Web 应用程序,因此它有一个公共地址。我的问题是如何将域(通过 Route 53)连接到该任务,以便在部署新版本时不会出现任何问题。

  • 我知道我可以使用 ALB/NLB,但我想节省成本。
  • 我不想直接使用公共 IP,因为它可能会改变。
  • 我认为解决方案与 ENI 有关,但我不确定如何通过 Route 53 指向它。

任何帮助将非常感激。

谢谢

答案1

大多数情况下,您很可能希望使用 ALB/NLB 进行服务发现。虽然需要付出一些成本,但您也能获得很多好处:一些 DoS 保护、扩展指标、日志记录、SSL/TLS

不过,你可以使用ECS 服务发现

服务发现使用 Amazon Route 53 自动命名 API 操作来管理服务任务的 DNS 条目,使其在您的 VPC 内可被发现

支持公共命名空间,但在创建服务发现服务之前,您必须拥有一个在 Route 53 注册的现有公共托管区域。

服务发现要求任务使用 awsvpc、bridge 或 host 网络模式。

以下博客文章详细介绍了如何使用 fargate 进行服务发现:https://aws.amazon.com/blogs/aws/amazon-ecs-service-discovery/

答案2

我不相信@m-glatki 的答案是正确的 - 您不能将服务发现用于公共 IP 地址,正如@andreas-pasch 提到的那样。

我发现实现这一点的唯一方法是创建一个由 Cloudwatch 事件触发的 Lambda 函数,用于容器达到“正在运行”状态时。我的第一次尝试是通过启动脚本获取容器元数据并在启动时更新 Route 53,但这是一条死路。

有一个很好的指南这里对于 JavaScript(我用 Python 和 Terraform 重写了)。我认为缺少的是将 ECS 集群 ARN 添加到“详细信息”下的 Cloudwatch 事件模式;否则,该函数可能会在每次容器启动时触发。ECS 事件文档可能对具体情况有用。

AWS 有EC2 指南但我没有费心去研究他们的代码;如果你也喜欢 Python,那么参考一下可能会很方便。

注意:服务发现对于私有 IP 地址非常有效。

答案3

正如ECS 开发者指南

Amazon ECS 不支持将服务注册到公共 DNS 命名空间

因此无法通过 ECS 服务发现进行开箱即用的公共域注册。但您可以做的是,在部署后使用 AWS SKD 获取容器的公共 IP 地址,并将其注册到您的公共 Route 53 托管区域中。

本文展示了一种使用 lambda 函数在每次重新部署容器时执行此操作的方法。

答案4

我试过了。问题是 fargate 使用的公共 IP 已附加到 TASK,因此如果重新启动任务,则会提供新的 IP 地址,并且需要更新 DNS 记录。这就是使用 alb/nlb 的原因。

理论上你可以使用其他东西来管理 DNS 主机记录,也许是 lambda 函数或其他东西

服务发现注意事项:即使使用公共命名空间,为服务发现服务创建的 DNS 记录也始终使用任务的私有 IP 地址而不是公共 IP 地址进行注册。

https://forums.aws.amazon.com/thread.jspa?threadID=270599

相关内容