Amazon web services 无法使AWS ECS服务通过服务发现进行通信

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) 现

我正在尝试使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
      nginx
      )需要与Service2
      redis
      )交互并使用AWS服务发现选项和记录,那么Service1需要知道它需要执行DNS
      SRV
      查找,而不是DNS
      A
      (地址)查找
    • 这里有多个选项。首先,如果您想继续使用
      SRV
      记录,那么您的客户端需要使用
      service
      resolve
      选项代理redis上游服务器,这些选项仅在nginx版本中提供。检查我在答案底部测试过的示例nginx配置是否有效

    • 另外,请确保使用前缀
      \u http.\u tcp
      创建AWS服务发现名称。否则,我在nginx配置中遇到了配置SRV
      resolve/Service
      选项问题,而没有前缀

    • 其他选项,如果您不想依赖于
      SRV
      记录,而是转到标准
      A
      记录查找,则您必须对容器使用
      awsvpc
      模式,并选择
      A
      选项

    • 如果使用DNS选项,则您对
      服务\u发现\u服务\u名称。服务\u发现\u命名空间
      的查询将正常工作
    • 有了DNS选项,就有一些限制。由于ENIs数量的限制取决于EC2实例系列,所以无法在同一EC2实例上为给定服务创建多个任务,因此我只希望使用SRV记录
    nginx DNS 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