AWS:无法将 EC2 中托管的 Docker 容器连接到我的 RDS

问题描述 投票:0回答:1

我对AWS了解不多,我正在尝试使用Docker Compose和EC2部署一个大学项目。实现的目的是拥有一个使用 EC2 的自动缩放组,使用 docker compose 启动我的应用程序,并链接到带有 MySQL 引擎的 RDS。为了实现这一目标,我打算配置一个 EC2 实例,以便只需要使用 docker compose up 启动容器,并复制该 AMI 以将其作为 Auto Scaling 组实例的起点。我目前正在配置这个初始实例。

为此,我首先创建了一个包含两个容器的 docker-compose.yml 文件:一个用于后端(用 Java Spring Boot 编码),另一个用于前端(用 Vuejs 编码)。在后端服务中,我包含了带有 RDS 主机、用户和密码的环境变量,我已使用命名法 ${ENV_VALUE} 在 application.properties 文件中公开了其值。

也就是说,当我在 EC2 中启动容器时,我收到如下连接错误:

Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure.

Caused by: java.net.SocketTimeoutException: Connect timed out

ERROR 1 --- [           main] j.LocalContainerEntityManagerFactoryBean : Failed to initialize JPA EntityManagerFactory: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.exception.JDBCConnectionException: Unable to open JDBC Connection for DDL execution

需要记住的一些细节是:

  • EC2和RDS位于同一个VPC。

  • RDS 不可公开访问(我尝试将其更改为可公开访问并从我的 Windows 计算机启动连接,但这也不起作用)

  • EC2 未连接到 RDS(我理解,要连接容器本身,EC2 本身不需要连接到 RDS)。

我还尝试向 RDS 安全组添加一条允许 SQL 流量的规则,但我的 EC2 在运行容器时会卡住。

也就是说,我不知道连接错误可能来自哪里,如果需要更多数据来解决问题,我可以提供。

amazon-web-services amazon-ec2 docker-compose amazon-rds
1个回答
0
投票

这很可能是路由配置问题。当我从头开始使用 AWS 时,我几乎总是从最简单的问题开始。对于您的情况,我将尝试从您通过 SSH 连接的 EC2 主机访问 RDS 实例。为此,您需要做一些事情。

  • 首先,我要确保 RDS 端口配置正确。
  • 然后,确保记下数据库所在的子网(最有可能是私有子网)。
  • 接下来,确保附加到您的实例的安全组已打开端口 22(如果您想从 Windows 计算机进行连接,则用于 SSH)。
  • 打开 RDS 数据库的安全组以允许来自 EC2 实例的入站访问。
  • 在实例上安装基本数据库客户端并确保可以连接到 RDS 实例。
  • 验证连接后,从 Docker 实例中重新启动该进程,该问题应该会得到修复 根据我的经验,连接超时通常是由于安全组配置错误(未充分开放)或路由问题造成的,因此您需要确保子网可以通过路由表相互通信。

您可能还想检查网络 ACL,但这些 ACL 默认允许所有流量,因此在这种情况下这不应该成为太大的问题。

© www.soinside.com 2019 - 2024. All rights reserved.