我对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 在运行容器时会卡住。
也就是说,我不知道连接错误可能来自哪里,如果需要更多数据来解决问题,我可以提供。
这很可能是路由配置问题。当我从头开始使用 AWS 时,我几乎总是从最简单的问题开始。对于您的情况,我将尝试从您通过 SSH 连接的 EC2 主机访问 RDS 实例。为此,您需要做一些事情。
您可能还想检查网络 ACL,但这些 ACL 默认允许所有流量,因此在这种情况下这不应该成为太大的问题。