ECS EC2 启动类型:服务数据库连接字符串

ECS EC2 Launch Type: Service database connection string

我正在 docker 上尝试一个小型 POC(学习实验)。我有 3 张 docker 图片,一张分别用于店面、搜索引擎和数据库引擎,分别称为店面、solr、docmysql。我已经在 ec2 上的 docker 集群(在单个节点上)中尝试了 运行 它们并且工作正常。

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

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

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

当我 运行 它作为一个 docker 群时,这有效。将其移至 ECS(EC2 启动类型)后,我必须从我的 task/container 中为 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 群时,为什么我没有遇到问题。

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

嗯,我在问题中提出自己的解决方案之前提出了一些观点:

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

现在,我在 Fargate 上遇到了这个问题,并发现根据您的 container/task 定义,它可以在同一任务中用于测试目的,因此,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/