Amazon web services 无法使AWS ECS服务通过服务发现进行通信
我正在尝试使2个服务通过AWS ECS服务中的服务发现端点进行通信 示例: Service1:运行任务定义以运行nginx和phpfpm Service2:运行任务定义以运行redis 现在,我需要让service1容器与service2通信 容器 根据互联网上的文件和资源。这就是我所做的,但却无法达到我的需要Amazon web services 无法使AWS ECS服务通过服务发现进行通信,amazon-web-services,devops,amazon-ecs,service-discovery,Amazon Web Services,Devops,Amazon Ecs,Service Discovery,我正在尝试使2个服务通过AWS ECS服务中的服务发现端点进行通信 示例: Service1:运行任务定义以运行nginx和phpfpm Service2:运行任务定义以运行redis 现在,我需要让service1容器与service2通信 容器 根据互联网上的文件和资源。这就是我所做的,但却无法达到我的需要 我们需要打开服务发现(完成) 设置将用作服务发现端点的正确服务名称和命名空间(Done) 创建任务定义并使用上述属性集创建服务(完成) 现在AWS将在路由53上生成SRV记录(OK) 现
service\u discovery\u service\u name.service\u discovery\u命名空间。
错误日志显示,它无法解析名称
根据我们的谈话,这里是正在发生的事情的小结
- 如果Service1(
)需要与Service2(nginx
)交互并使用AWS服务发现选项和记录,那么Service1需要知道它需要执行DNSredis
查找,而不是DNSSRV
(地址)查找A
- 这里有多个选项。首先,如果您想继续使用
记录,那么您的客户端需要使用SRV
和service
选项代理redis上游服务器,这些选项仅在nginx版本中提供。检查我在答案底部测试过的示例nginx配置是否有效resolve
- 另外,请确保使用前缀
创建AWS服务发现名称。否则,我在nginx配置中遇到了配置SRV\u http.\u tcp
选项问题,而没有前缀resolve/Service
- 其他选项,如果您不想依赖于
记录,而是转到标准SRV
记录查找,则您必须对容器使用A
模式,并选择awsvpc
选项A
- 如果使用DNS选项,则您对
的查询将正常工作服务\u发现\u服务\u名称。服务\u发现\u命名空间
- 有了DNS选项,就有一些限制。由于ENIs数量的限制取决于EC2实例系列,所以无法在同一EC2实例上为给定服务创建多个任务,因此我只希望使用SRV记录
stream {
resolver 172.31.0.2;
upstream redis {
zone tcp_servers 64k;
server redisservice.local service=_http._tcp resolve;
}
server {
listen 12345;
status_zone tcp_server;
proxy_pass redis;
}
}
一些参考资料-
我想更详细地阐述@Imran的详细答案,因为大部分答案都是关于
SRV
DNS记录类型的,并且仅针对Nginx的高级版本(和SRV
)显示Nginx示例
如果您使用ECS Fargate并配置了A
DNS记录。最重要的是配置一个合适的解析器
从文档中:
配置名称服务器,用于将上游服务器的名称解析为
地址,例如:
解析器127.0.0.1[::1]:5353
地址可以指定为
域名或IP地址,带有可选端口。如果端口不是
指定时,使用端口53。名称服务器是在数据库中查询的
循环时尚
因此,解析程序必须解析私有DNS。因此,我们需要使用NS
DNS记录。
使用8.8.8.8
作为解析程序将不起作用,因为此DNS无法解析专用DNS
NS代表“名称服务器”,此记录指示哪个DNS服务器
是该域的权威服务器(哪个服务器包含实际的DNS
记录)。一个域通常会有多个NS记录,这些记录可以
指示该域的主服务器和备份名称服务器
要获取DNS解析程序,请运行以下命令:
aws route53列出资源记录集--托管区域id%hosted\u zone\u id%--查询“ResourceRecordset[?Type='NS']”
选择一条资源记录并将其放入Nginx解析器
(包括尾随的
)
Nginx基本模板:
events {
worker_connections 768;
}
http {
# DNS Resolver
resolver ns-###.awsdns-####.com. valid=10s;
gzip on;
gzip_proxied any;
gzip_types text/plain application/json;
gzip_min_length 1000;
fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
server {
listen 80;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_redirect off;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# This is the important part
proxy_pass http://ecs-fargate-svc.local:8080;
}
location = /health-check {
return 200 'all good';
}
}
}
需要考虑的几点:
- 不要忘记添加映射端口(在我的示例中为
)8080
- 确保安全组允许VPC内的流量
- 与FARTATE一起工作,我们的日志有限,请考虑在VPC中创建EC2实例,ECS-FARGATE任务位于其中,并尝试卷曲URL\DNS记录。
您需要在为每个服务任务分配IP的路由53中创建DNS
类型A
记录,而不是SRV
。只有当您的通信支持SRV记录查找时,您才需要SRV
记录,即客户端需要知道它需要执行SRV查找,然后获取IP。@Imran yes,但是aws ECS具有内置的该功能,并且也会生成A记录,该记录反过来指向实例的IP地址任务定义中使用的是哪种docker网络模式?。如果您没有使用awspvc
,则它将仅创建SRV
类型,然后指向A
类型。当您执行nslookup myapp.local
时,您将不会得到任何东西,因为它的类型是SRV
,而不是A
。当您尝试nslookup-type=srv myapp.local
时,您将获得srv列表,然后您可以尝试nslookup{taskid}。myapp.local
提供容器的IP。除非您的客户机支持先执行SRV查找,然后再执行IP查找,否则您最好使用cr