首页 > 解决方案 > AWS VPC 中的 ECS Fargate 服务 - 无法相互交谈

问题描述

我的架构就像

Route53 -> SG -> ALB -> Target Group (IP) -> Task.

在 Route 53 中,我定义了命名空间。一种是公开的,一种是私人的。

domain.io   ----   Private
domain.io   ----   Public

我有两个服务,A 和 B。

ALB 看起来像:

<DNS of public LB attached to service A> = A-ALB
<DNS of public LB attached to service B> = B-ALB

在 Private 命名空间中,条目如下所示:

service-a.domain.io - Type A record - A-ALB
service-b.domain.io - Type A record - B-ALB

在公共命名空间中,条目如下所示:

service-a.domain.io - Type A record - A-ALB
service-b.domain.io - Type A record - B-ALB

A-ALB 和 B-ALB 有一个附加到它们的安全组。此安全组包含 VPC CIDR Block,以允许来自 VPC 的所有传入流量通过。

All traffic ---- All  ----  All ---  10.0.0.0/16

任务:

Task        Private IP        Public IP        
A           10.0.0.1          3.0.0.1
B           10.0.0.2          3.0.0.2

当服务 A 在 URL service-b.domain.io 上调用服务 B 时,它会从 Private 命名空间中获取值并尝试通过目标组访问任务。但由于负载均衡器在此处列出,服务 A 尝试使用服务 A 的公共 IP 访问服务 B。并且服务 A(3.0.0.1)的公共 IP 没有在安全组中列出,它超时给我们没有响应。但是当我将此IP列入白名单时,服务A可以毫无问题地访问服务B。

由于负载均衡器是公共负载均衡器,因此它解析任务的公共 IP 地址。服务 B 只允许我附加一个负载均衡器,要么是私有的,要么是公共的,所以因为这个服务也需要公开访问,所以我肯定需要选择一个公共的负载均衡器。

我不介意将 IP 添加到安全组,但是每次我重新部署我的服务时,由于它是一个 Fargate 服务,因此任务的公共和私有 IP 会发生变化,我需要向安全组添加新的公共 IP。

服务 A 应该如何访问服务 B 以便不需要更改安全组?我应该对 Route 53 进行更改吗?ALB?TG?还是服务?

标签: amazon-web-servicesload-balancingamazon-ecsamazon-vpcaws-fargate

解决方案


似乎您有一个不应公开的公共 ALB,因为公共负载均衡器通常在安全组中有 0.0.0.0/0 规则,因此可以避免您面临的问题。

我建议您创建一个内部负载均衡器而不是公共负载均衡器。

这样,当 ALB DNS 的 DNS 解析发生时,ALB 的私有 IP 将被返回,因此内部通信将发生,您可以在 Security group 中指定安全组 ID(作为源)。


推荐阅读