如何在 ECS Fargate 部署的容器外部进行外部 api 调用

Posted

技术标签:

【中文标题】如何在 ECS Fargate 部署的容器外部进行外部 api 调用【英文标题】:How to make an external api call outside of a container on ECS Fargate deployment 【发布时间】:2022-01-15 23:58:54 【问题描述】:

我已经阅读了有关此问题的其他问题,都提到了启用服务发现,但我的问题与如何为我当前的 Fargate 部署进行设置的问题略有不同。

我有四个通过 Gradle 构建的 Spring Boot api 容器,推送到 ECR,并部署在 ECS Fargate 中,Terraform IaC 设置了适当的资源。其中三个容器化 api 在其中设置了环境变量以引用第四个容器,从而在容器外部对那个服务进行外部 api 调用。为这些部署设置了 DNS 和 443 负载平衡器。

我在包含需要发现的 api 的集群中创建了一个新服务。我已启用服务发现并为 api 创建了一个本地 CloudMap A 记录,然后在其他容器中设置每个环境变量以使用该本地 A 记录 url,例如 ecsservicename.local。此外,我试图挖掘我在其他 api 中连接的服务并返回一个 IP,所以我确信这是有效的。

我的问题如下:

(1) 由于实际上只有一个服务应该被其他服务获取,因此在该 api 而不是其他 api 上设置服务发现是否正确,或者我应该在所有其他 api 上设置服务发现?

(2) 即使设置了 route53,这应该是 A 记录还是 SRV?关于何时在 aws 上使用 which 的文档让我感到困惑。

(3) 是否有更好或更简单的方法可用于我缺少的容器间通信?

【问题讨论】:

进展如何?仍然不清楚您的问题? 是的,这似乎有效。我只需要在那个 api 中设置服务发现,然后在另一个 api 的容器变量中引用该服务名称。也就是说,我最初使用 443 负载均衡器配置了它,它还安装了身份验证和证书,所以这有点棘手。不得不做一些更多的配置,这样我就不会被防火墙击中,但这是可行的。 很高兴听到。如果我的回答有帮助,那么将不胜感激。 试图投票,但它说我需要 15 点声望点,所以我想我的帐户需要更多点 :) 致 accept 你不需要声望。 【参考方案1】:

    没错。只应为一项服务设置发现。不需要其他发现,因为您没有与其他服务互连。

    SRV 也提供端口,所以来自docs:

如果您的服务任务指定的任务定义使用桥接或主机网络模式,则 SRV 记录是唯一受支持的 DNS 记录类型。

    我认为您的架构经过深思熟虑,没有想到任何“更简单”或更好的方法。

【讨论】:

以上是关于如何在 ECS Fargate 部署的容器外部进行外部 api 调用的主要内容,如果未能解决你的问题,请参考以下文章

指定 aws ECS/Fargate 容器依赖项无法部署

AWS ECS 中的 Python 应用程序。如何链接到外部应用程序配置?

AWS ECS Fargate 容器运行状况检查命令

如何链接在 AWS ECS 任务中运行的 2 个容器

在 AWS ECS Fargate 中,任务内无法进行容器间连接

如何使用 Fargate 在 AWS ECS 中正在运行的容器中运行命令