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

Posted

技术标签:

【中文标题】如何启动具有公共 DNS 的 ECS Fargate 容器?【英文标题】:How can you launch ECS Fargate containers having a public DNS? 【发布时间】:2019-05-14 23:41:26 【问题描述】:

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

其中一项服务是网络服务器,我正在尝试通过公共分配的 IP 地址从公众访问它;但是,这并不是很有用,因为每个部署的容器都会收到一个新的 IP 地址。

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

EC2 实例可以通过提供公共 DNS 的选项启动...

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

【问题讨论】:

【参考方案1】:

虽然它不是免费的,但通常如果您想要 ECS 服务(fargate 或 EC2)的公共 DNS 名称,您会在其前面使用负载均衡器(如果您愿意,它也可以进行 SSL 终止)。

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

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

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

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

【讨论】:

【参考方案2】:

您可以使用 ECS Service Discovery 在私有 DNS 命名空间中注册您的容器 - 不幸的是,这对于公共 DNS 是不可能的。

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

在重新部署后获取容器的公共 IP 并 使用该 IP 更新您的公共 Route 53 记录集。

In this article,我们描述了如何通过使用通用 lambda 函数来做到这一点。

【讨论】:

【参考方案3】:

当我第一次设置 ECS Fargate 服务时,设置向导似乎已经自动 (?) 为我创建了一个负载均衡器。我能够通过 Amazon ECS -> Clusters -> my cluster -> my service -> Target Group Name(在 Details 选项卡中的 Load Balancing 下)-> my目标组 -> 负载均衡器 -> DNS 名称

【讨论】:

以上是关于如何启动具有公共 DNS 的 ECS Fargate 容器?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用外部IP NAT启动JBoss AS

带有 PHP SDK 的 AWS EC2 - 等到实例具有公共 DNS 名称

如何使用 boto3 从连接到 ECS 任务的网络接口获取公共 IP

EC2 t2.micro 实例没有公共 DNS

给阿里云 VPC 中的 Ubuntu ECS 配置自定义 DNS 服务器

如何将输入转换器用于 ECS Fargate 启动类型和 Terraform CloudWatch 事件触发器