我有一个 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
答案4
我试过了。问题是 fargate 使用的公共 IP 已附加到 TASK,因此如果重新启动任务,则会提供新的 IP 地址,并且需要更新 DNS 记录。这就是使用 alb/nlb 的原因。
理论上你可以使用其他东西来管理 DNS 主机记录,也许是 lambda 函数或其他东西
服务发现注意事项:即使使用公共命名空间,为服务发现服务创建的 DNS 记录也始终使用任务的私有 IP 地址而不是公共 IP 地址进行注册。