首页 > 解决方案 > ECS EC2 启动类型:服务数据库连接字符串

问题描述

我正在 docker 上尝试一个小型 POC(学习实验)。我有 3 个 docker 图像,一个用于店面、一个搜索引擎和一个分别称为 storefront、solr、docmysql 的数据库引擎。我曾尝试在 ec2 上的 docker swarm(在单个节点上)中运行它们,并且效果很好。

在 POC 中,我接下来需要在单个非 Amazon ECS-Optimized AMI 上使用 EC2 启动类型将此移动到 AWS ECS。我已经为此安装并启动了一个 ecs-agent。我为在任务中配置为容器的 3 个图像中的每一个创建了 3 个服务和一个任务。问题是关于从店面连接到数据库。

店面有一个属性文件,其中数据库连接通常定义为

  "jdbc:mysql://docmysql/hybris64?useConfigs=maxPerformance&characterEncoding=utf8&useSSL=false". 

当我将它作为 docker swarm 运行时,这很有效。将其移至 ECS(EC2 启动类型)后,我必须从我的任务/容器中为 docmysql 服务公开端口 3306。这给了我一个 docmysql.local 的服务端点,“local”是一个私有命名空间。我尝试将连接字符串更改为

"jdbc:mysql://docmysql.local/hybris64?useConfigs=maxPerformance&characterEncoding=utf8&useSSL=false" 

在属性文件中,它总是以“名称或服务未知”失败。我的连接字符串应该是什么?创建服务后,我在 Route 53 中看到 2 个条目,一个 SRV 记录和一个 A 记录。A 记录的名称为 .docmysql.local,如果我在数据库连接字符串中使用它,我会看到它有效,但显然与 hadcoded taskid 不正确。我已经阅读了 AWS Cloud Map (servicediscovery) 但仍然不太清楚如何去做。我不会在服务中的数据库任务前面放置任何负载均衡器,数据库始终只有一项任务。

那么生成有效的连接字符串的最佳方法是什么。还有为什么当我将它作为 docker swarm 运行时没有问题。

我知道我可以使用 RDS 而不是说明我自己的数据库,我会尝试这样做,但现在需要这个工作,因为我已经开始这样做了。谢谢你的帮助。

标签: mysqldockeramazon-ecsservice-discovery

解决方案


好吧,在我自己解决问题之前,我已经提出了一些观点:

  • 您是否需要使用 ECS 扩展您的实例?如果没有,请将其迁移到 RDS。
  • 您需要在 EC2-Type 上部署它吗?如果没有,使用fargate,处理起来更简单。

现在,我在 Fargate 上遇到了这个问题,并发现根据您的容器/任务定义,它可以在同一任务中用于测试目的,因此,127.0.0.1 应该是答案。

在您需要使用 awsvpc 网络模式的不同任务上,您将拥有以下内容:

  • 每个使用 awsvpc 网络模式的任务都会收到自己的弹性网络接口,该接口附加到托管它的容器实例。(来自 AWS)

我的建议是创建一个 Lambda 函数来动态发现您的网络接口。

阅读本文以深入了解:

https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-networking.html

https://aws.amazon.com/blogs/developer/invoking-aws-lambda-functions-from-java/


推荐阅读