Elastic Beanstalk 应用程序无法连接到 RDS MySQL 实例

Elastic Beanstalk app won't connect to RDS MySQL instance

我在 Elastic Beanstalk 实例上安装了 CodeIgniter PHP 应用程序。我试图将它连接到我设置的 RDS MySQL 实例,但加载 Elastic Beanstalk 站点 URL 总是导致页面连接超时。我已将问题缩小为无法连接到数据库。

我想我已经正确设置了我的安全组以允许 Elastic Beanstalk EC2 实例与 RDS 通信,但一定是出了什么问题,因为页面仍然无法加载。

我在下面包含了 RDS 和 Elastic Beanstalk 使用的安全组的 inbound/outbound 规则的屏幕截图,以及我附加到 Elastic Beanstalk 实例的安全组的屏幕截图。

关于为什么我的 Elastic Beanstalk 应用程序无法与我的 RDS 实例通信有什么想法吗?


编辑:RDS 实例和 Elastic Beanstalk 实例在同一个安全组中。

将您设置 Elastic Beanstalk 的堆栈安全组名称添加到 RDS 安全组列表中。

最简单的测试方法是登录 EC2 实例(即 eb ssh)并测试与数据库的连接以排除应用程序的任何问题。

mysql -u user -p password -h rds.instance.endpoint.region.rds.amazonaws.com

您是否也将 RDS 实例启动到 VPC 中?

您的 RDS 安全组需要将端口 3306 上的传入流量授予 beantalk 安全组。

例如 RDS 安全组

Incoming
ALLOW TCP 3306 from BeanstalkSG

不要打开 0.0.0.0

由于您已经允许所有传出流量,因此您的 Beanstalk SG 不必另外为传出流量授予 3306。

您的 VPC ACL 是否允许 3306 上的流量? (默认情况下,他们这样做)

现在有关于如何将 ElasticBeanstalk 与任何 RDS 数据库(MySQL 等)连接的 tutorial,其方式不会将两者绑定在一起,即您可以单独创建它们。本教程介绍如何通过 AWS 控制台设置安全组。

之后,您必须设置 5 个 ElasticBeanstalk 环境变量(至少 MySQL):RDS_HOSTNAMERDS_PORTRDS_DB_NAMERDS_USERNAME & RDS_PASSWORD

不同的 ElasticBeanstalk 实例会以不同的方式访问这些变量以建立数据库连接(我在 PHP 中知道,您必须使用 $_SERVER['RDS_DB_NAME'],等等)。请参阅上面 link 中的 Java、Node.js、Python、Ruby 和 .NET 中的操作方法。

新用户很容易将RDS 实例名误认为是数据库名

实例名称 只是您和其他人用来组织 RDS 项目的标签。您的应用根本没有使用此标签。

另一方面,数据库名称正是您在应用程序中所需要的。

创建 RDS instance/cluster 后,请注意您的服务器是空的。 里面没有数据库。

一个 RDS 实例或集群中可以有多个数据库,就像 MySQL 服务器中可以有多个数据库一样。 默认情况下你有 none.

在您的应用程序上使用 RDS 之前,您需要 运行 在 MySQL 命令行上执行“CREATE DATABASE”命令。

公平地说,在您新创建的 RDS 实例上只有一个数据库。它被称为“mysql”,但您不能在您的应用程序中使用它。

创建要在您的应用程序上使用的数据库的唯一方法是通过 EC2 实例,因为 RDS 实例不可公开访问。

简单步骤:

1.创建一个nano实例(在同一个VPC/security组);

2. 通过 SSH 连接到 nano 实例(例如 ssh -i <my_key.pem> my_nano.amazonaws.com);

3. mysql -u <master_user> -p -h <rds_endpoint>

4. master_user 和 master_password 是您在创建 RDS 集群时设置的 - 这些凭据没有默认值;

5. 在 mysql 上创建一个数据库:CREATE database <my_db>;

6. 然后,在您的应用程序中,使用:master_user、master_password、my_db、rds_endpoint.

步骤 1:验证 RDS 数据库实例处于 "available".

状态

在 AWS 控制台访问 RDS 数据库 >> "Summary" >> 信息:

步骤 2:验证您的 EC2 实例 是否能够访问 RDS 实例 :

  • 登录到您的 EC2 实例并运行执行以下任何命令:

    • telnet <RDS endpoint> <port number>
    • nc [-vz] <RDS endpoint> <port number>

      • 如果 telnetnc 命令成功,则网络连接已建立,问题可能是由用户引起的对数据库的身份验证,例如用户名和密码。
      • 如果上述命令中的 none 成功,请确保您的 RDS 实例的入站规则配置为允许来自 EC2 实例的安全组的连接

步骤 3:验证您传递的连接参数是否正确:

  • 数据库服务器主机:在 AWS 控制台上访问 RDS 数据库 >> "Connectivity & security" >> 端点
  • 数据库端口:在AWS控制台访问RDS数据库 >> "Connectivity & security" >>端口
  • 数据库用户名: 在AWS控制台访问RDS数据库>> "Configuration" >> "Master username"
  • 数据库密码:如您在创建RDS实例时提到的
  • 数据库名称: 在AWS控制台访问RDS数据库 >> "Configuration" >> "DB name"

    mysql -u user -p password -h <RDS endpoint>

第 4 步:验证您的连接字符串 url 格式是否正确:

对于从 Spring 应用程序连接到 Mysql RDS 实例,URL 格式将为:

spring.datasource.url=jdbc:mysql://<RDS endpoint>:3306/ebdb?createDatabaseIfNotExist=true