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

时间:2019-01-15 11:18:56

标签: mysql docker amazon-ecs service-discovery

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

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

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

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

当我将其作为Docker群运行时,此方法起作用。将其移至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,如果在数据库连接字符串中使用此记录,我会看到它有效,但显然与已编码的taskid无关。我已经阅读了有关AWS Cloud Map(服务发现)的信息,但仍不清楚如何去做。在服务中,我不会在数据库任务之前放置任何负载平衡器,对于数据库而言,总是只有一个任务。

那么生成有效的连接字符串的最佳方法是什么。另外,当我将其作为Docker群运行时为什么没有问题。

我知道我可以使用RDS来代替声明自己的数据库,我会尝试这样做,但是从现在开始,现在需要进行此工作。感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

好吧,在提出自己的解决方案之前,我已经提出了几点意见:

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

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

在不同的任务上,您需要使用awsvpc网络模式,因此,您将拥有:

  • 使用awsvpc网络模式的每个任务都有其自己的弹性网络接口,该接口附加到承载它的容器实例上。 (FROM 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/