如何启动具有 public DNS 的 ECS Fargate 容器?

How can you launch ECS Fargate containers having a public DNS?

我构建了一个 AWS CodePipeline 来构建容器并将其部署到 Fargate 托管的 EC2 实例中。参考 AWS CodePipeline

其中一项服务是 Web 服务器,我正在尝试从 public 访问它,这可以通过 public 分配的 IP 地址实现;但是,这不是很有用,因为每个部署的容器都会收到一个新的 IP 地址。

我知道可以设置弹性 IP 地址或将域指向容器服务,但我认为有更简单的方法。

可以选择提供 Public DNS...

来启动 EC2 实例

是否可以使用静态 public DNS 记录启动容器服务?如果可以,怎么做?

虽然它不是免费的,但通常情况下,如果您想要一个 public DNS 名称到 ECS 服务(fargate 或 EC2),您会在它前面加上一个负载平衡器(它也可以做 SSL 终止,如果你如此渴望)。

正因为如此,AWS 可以让您在设置服务时轻松创建负载均衡器或将您的服务添加到现有目标组。我认为您无法在事后更改它,因此您可能需要重新创建服务。

最后,当您在 ECS 服务前面有一个负载均衡器时,您只需在 Route53 中设置 CNAME 或 A ALIAS(如果您使用的是 Route53)以将 DNS 名称定向到该负载平衡器。

AWS 从 2016 年开始在 AWS Compute 博客上有 a walkthrough 快速描述了如何设置 ECS 服务并使用 Application Load Balancer 公开它。

another path -- 使用 ECS 服务发现和 AWS CloudMap,您可以使用 API 网关。您的负载平衡选项更为有限,但 API 网关是根据使用量而不是小时数计费的,因此它可以节省小批量服务的成本。您还可以在多个 ECS 服务之前使用单个 API 网关,有些人无论如何都会想要这样做。这种方法不太常用,但对于某些用途来说可能是正确的方法。

您可以使用 ECS Service Discovery 在私有 DNS 命名空间中注册容器 - 不幸的是,public DNS 无法做到这一点。

但是,你能做的就是拥有一个脚本

  • 重新部署后获取容器的 public IP 和
  • 更新使用该 IP 设置的 public Route 53 记录集。

In this article,我们描述了如何使用通用的 lambda 函数准确地做到这一点。

当我第一次设置 ECS Fargate 服务时,设置向导似乎自动(?)为我创建了一个负载均衡器。我能够访问我通过 URL 在 Amazon ECS -> 集群 -> {我的集群} -> {我的服务} -> 目标组名称(在“详细信息”选项卡中的“负载平衡”下)创建的 Web 应用程序-> {我的目标组} -> 负载均衡器 -> DNS 名称