我是AWS的新手,我正在尝试将简单的应用程序部署到AWS ECS。我有两个简单的Docker容器,在ECS Fargate中运行:
这两种服务均在默认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。
对于任何建议,无论是进一步研究还是如何通过服务发现连接两个容器,我现在都没有主意。
答案 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端使用。