【发布时间】:2020-07-26 17:09:52
【问题描述】:
我的架构是这样的
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
在私有命名空间中,条目如下所示:
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?还是服务?
【问题讨论】:
-
如果您的架构允许,我认为理想的解决方案是考虑使用服务发现 [1]。 [1] - docs.aws.amazon.com/AmazonECS/latest/developerguide/…
-
我尝试使用服务发现,但由于我有一个与我的应用程序关联的端口,它会在路由 53 中创建一个 SRV 记录,而 DNS 无法解决该问题。
-
我只是想指出,在大多数情况下,您的服务应该是私有的,具有负载均衡器。如果你的服务是公开的,那么理论上有人可以直接点击它,如果你在 ALB 终止了 HTTPS,他们可以绕过它。只需在与服务相同的 VPC 中给 ALB 公有子网,但给服务私有子网。
标签: amazon-web-services load-balancing amazon-ecs amazon-vpc aws-fargate