通过Beanstalk部署的Docker容器无法连接到RDS上的数据库

时间:2018-06-15 13:51:49

标签: amazon-web-services docker amazon-ec2 elastic-beanstalk amazon-rds

我是docker和AWS的新手。我刚创建了我的第一个docker图像。该应用程序是一个后端微服务,其余控制器将数据保存在MySQL数据库中。我在RDS中手动创建了数据库,在本地运行容器之后,其余的API在Postman中运行良好。

这是Dockerfile:

FROM openjdk:8-jre-alpine
MAINTAINER alireza.online
COPY ./target/Practice-1-1.0-SNAPSHOT.jar /myApplication/
COPY ./target/libs/ /myApplication/libs/
EXPOSE 8080
CMD ["java", "-jar", "./myApplication/Practice-1-1.0-SNAPSHOT.jar"]

然后我通过AWS Beanstalk部署了docker镜像。这是Dockerrun.aws.json:

{
  "AWSEBDockerrunVersion": "1",
  "Image": {
    "Name": "aliam/backend",
    "Update": "true"
  },
  "Ports": [
    {
      "ContainerPort": "8080"
    }
  ],
  "Logging": "/var/log/nginx"
}

一切顺利:

enter image description here

但是现在,我得到了" 502 Bad Gateway"在邮递员试图运行" backend.us-east-2.elasticbeanstalk.com/health"。

我检查了Beanstalk上的日志,发现应用程序在连接RDS数据库时遇到问题:

"无法创建与数据库服务器的连接。尝试重新连接3次。放弃。"

我试图解决问题:

1-我尝试将EC2实例使用的相同安全组分配给我的RDS实例,但它没有用。

2-我试图在安全组上制定更多的入站规则,以添加EC2实例的公共和私有IP,但我不确定我应该定义的端口和CIDR,并且无法实现。< / p>

任何评论都会受到高度赞赏。

1 个答案:

答案 0 :(得分:1)

以下是您的堆栈中的资源: LoadBalancer - &gt; EC2实例 - &gt; MySQL数据库

所有这些都需要为其分配安全组,允许在正确的端口上连接到上游资源。

因此,如果您将sg-1234安全组分配给您的EC2实例,并将sg-5678分配给您的RDS数据库,则sg-5678中必须存在允许来自{{{}的入站连接的规则1}}(不需要CIDR,你可以打开从SG到SG的连接)。典型的MySQL端口是3306。

同样,LoadBalancer(由ElasticBeanstalk自动为您创建)必须能够访问您的EC2实例的8080端口。此外,如果要使用“backend.us-east-2.elasticbeanstalk.com/health”域名访问实例,则loadbalancer必须侦听端口80并在8080端口上拥有实例的目标组。

希望这有帮助!