我是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"
}
一切顺利:
但是现在,我得到了" 502 Bad Gateway"在邮递员试图运行" backend.us-east-2.elasticbeanstalk.com/health"。
我检查了Beanstalk上的日志,发现应用程序在连接RDS数据库时遇到问题:
"无法创建与数据库服务器的连接。尝试重新连接3次。放弃。"
我试图解决问题:
1-我尝试将EC2实例使用的相同安全组分配给我的RDS实例,但它没有用。
2-我试图在安全组上制定更多的入站规则,以添加EC2实例的公共和私有IP,但我不确定我应该定义的端口和CIDR,并且无法实现。< / p>
任何评论都会受到高度赞赏。
答案 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端口上拥有实例的目标组。
希望这有帮助!