我有两个服务在 ECS 上运行:service_1 和 service_2。服务_2 使用服务_1。两个服务都位于同一命名空间中。
service_1 上的 Service Connect 服务配置在客户端别名部分设置 DNSName 和端口。假设 DNSName 设置为
service1
。
使用 Terraform 完成部署。
并行部署两个服务时,service_1 容器上的
/etc/hosts
将具有类似于 127.255.0.1 service1
的条目,因此它可以发现自身。然而在service_2上,/etc/hosts
中没有创建这样的条目,因此无法通过主机名找到service_1。
“解决方案”是强制重新部署service_2。重新部署后,service_2 上的
/etc/hosts
将有新条目,指向 service1
。
我的猜测是,AWS Service Connect 不会在已运行的服务上自动刷新
/etc/hosts
。这在某种程度上违背了这项服务的目的。
由于我只有一种依赖关系,因此我可以在 Terraform 中利用
depends_on
,以便在部署 service_2 之前,service_1 启动并运行。但是如果我有双向依赖怎么办?我是否需要创建两者,然后强制重新创建一个以便它们能够找到彼此?
不幸的是,这是 ECS Service Connect 的预期行为。
必须重新部署现有服务,其中的应用程序才能解析新端点。 最近部署后添加到命名空间的新端点不会添加到任务配置中。 https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-connect.html
我可以在 Terraform 中利用 dependent_on,以便在部署 service_2 之前启动并运行 service_1。
这是 AWS 的建议以及服务连接概念:部署顺序
中的描述首先,假设您正在单个 AWS CloudFormation 模板和单个 AWS CloudFormation 堆栈中创建一个可供公共 Internet 使用的应用程序。
公共发现和可访问性应由 AWS CloudFormation 最后创建,包括前端客户端服务。需要按此顺序创建服务,以防止出现前端客户端服务正在运行且可供公众使用但后端却不然的情况。这消除了在该时间段内向公众发送错误消息的情况。
在 AWS CloudFormation 中,您必须使用 dependentOn 向 AWS CloudFormation 指示无法并行或同时创建多个 Amazon ECS 服务。您应该为客户端任务连接到的每个后端客户端-服务器服务将 dependentOn 添加到前端客户端服务。
您可以尝试在 Service Connect 配置中将这两个服务设置为
Client and server
,并使用各自的 DNS 相互访问它们。例如:service1.namespace
和 service2.namespace
。
客户端模式连接到命名空间中的其他服务,客户端-服务器模式为此服务提供端点。
如果您不提供 DNS 名称,则在 Service Connect 代理 配置中使用端口别名。