AWS ECS 还有一个相对较新的东西叫做 服务连接。它利用 Cloud Map,但还向您的 ECS 服务添加了一个旁路“代理”容器,从而有效地创建了一个自动服务网格。
我使用CloudFormation使得Service Connect与ECS配合工作。在我的CloudFormation中,我配置了
AWS::ECS::Cluster
,并将ServiceConnectDefaults
配置为我想要使用的Cloud Map命名空间,例如example.internal
。然后,在ServiceConnectConfiguration
下,我为AWS::ECS::Service
定义设置了enabled: true
,同时提供了一些额外的细节,比如为service/port提供一个名称。假设我已经给我的服务/端口命名为my-service
,我相信现在同一VPC中使用Service Connect的其他服务可以连接到my-service.example.internal
,而无需使用DNS,sidecar-proxy会自动找到某个my-service
的实例进行连接!(我还没有测试过这一点;我首先想要在当前问题上获得一些澄清。)
但是我也想要私有DNS访问,这样至少可以去Cloud9并发出例如curl my-service.example.internal/api/test
而不需要查找my-service
实例之一的IP地址。我发现我可以定义一个AWS::ServiceDiscovery::PrivateDnsNamespace
和一个AWS::ServiceDiscovery::Service
(使用相同的名称my-service
),甚至可以使用ServiceRegistries
将后者与我的ECS服务关联起来。但是当我尝试部署我的CloudFormation堆栈时,我会收到错误:
提供的请求无效:CreateService错误:服务已存在。
我猜想为了让Service Connect正常工作,ECS内部创建了自己的AWS::ServiceDiscovery::Service
,此时它发现我的CloudFormation堆栈已经创建了一个同名的AWS::ServiceDiscovery::Service
。但是如果我不自己创建AWS::ServiceDiscovery::Service
,那么ECS创建的那个将不会为my-service
提供DNS条目。
我是否可以推断出AWS ECS可以与Service Connect一起使用(在这种情况下将没有服务DNS条目,但是旁路代理将使用API调用来查找注册的服务),或者Service Discovery(在这种情况下,我手动创建Cloud Map DNS条目,ECS将根据我关联到ECS服务的AWS::ServiceDiscovery::Service
自动注册它们),但不能同时使用两者?还是我配置有误?
我想,如果我正在使用Service Discovery并获得DNS条目,我只需在其他服务中指示(在我的情况下是私有的)DNS条目,它们将通过Cloud Map找到它们,为我提供与Service Connect相同的功能,而无需旁路代理。但也许Service Connect具有一些额外的监控功能,我将失去它们吗?
有没有人能够确认这个理解是否正确,并且详细阐述在使用Service Connect或Service Discovery与ECS时的实际差异和影响?