无法通过服务发现连接两个ECS服务

时间:2020-05-30 21:12:08

标签: amazon-web-services amazon-ecs

我是AWS的新手,我正在尝试将简单的应用程序部署到AWS ECS。我有两个简单的Docker容器,在ECS Fargate中运行:

  • “前端”:Vue Js应用程序,该应用程序向后端发出单个请求;
  • “后端”:提供请求的Django应用;

这两种服务均在默认VPC和相同的单个公共子网的同一群集内启动。对于“后端”,我配置了服务发现:命名空间– 测试,服务发现名称– 后端。安全组配置为允许所有流量。

因此,问题在于前端发出请求时:

axios.get('http://backend.test:8000/api/get-test/')

我收到错误消息:Failed to load resource: net::ERR_NAME_NOT_RESOLVED backend.test:8000/api/get-test/

但是,在AWS Cloud9命令中执行:dig +short backend.test返回后端容器的正确私有IP。

当我将请求更改为

axios.get('http://172.17.3.85:8000/api/get-test/') 

172.17.3.85是后端容器的有效私有IP,出现以下错误:

GET http://172.17.3.85:8000/api/get-test/ net::ERR_CONNECTION_TIMED_OUT

但是,如果我在同一VPC和子网中使用EC2实例并通过SSH对其进行分拆,则可以ping后端容器和请求-

curl -v http://172.17.3.85:8000/api/get-test/  

以及

curl -v http://backend.test:8000/api/get-test/ 

返回所需的响应。

一切正常的唯一情况是请求类似

axios.get('http://3.18.59.133:8000/api/get-test/')

其中3.18.59.133是后端容器的有效公共IP。

对于任何建议,无论是进一步研究还是如何通过服务发现连接两个容器,我现在都没有主意。

1 个答案:

答案 0 :(得分:1)

基于对问题的评论和描述中的讨论,原因是Frontend’: Vue Js app 在客户端执行,例如在浏览器中

这说明了所描述和讨论的所有问题:

  • axios.get('http://backend.test:8000/api/get-test/') 不起作用,因为在客户端,您无法解析私有托管区域。

  • axios.get('http://172.17.3.85:8000/api/get-test/') 不起作用,因为172.17.3.85仅在VPC中有效,在客户端网络中无效。

  • spin out EC2 instance in the same VPC and subnet and SSH 可行,因为可以在VPC内部解析私有托管区域。

  • axios.get('http://3.18.59.133:8000/api/get-test/') 可行,因为与私有IP不同,公共IP可以在clinet端使用。