连接到外部 RDS 的 Elastic Beanstalk 创建的 EC2 的权限

Permissions for EC2 created by Elastic Beanstalk connecting to external RDS

我是 Elastic Beanstalk 的新手,对服务器管理不是很精通,但我需要在 Elastic Beanstalk 上建立一个连接到外部 RDS MySQL 数据库的 Django 项目。

我已经创建了一个单独的 RDS MySQL 数据库,我可以在我的计算机上使用 Sequel Pro 毫无问题地连接到它。然后我有我的 Django 项目,我尝试将其放入 Elastic Beanstalk,但不幸的是没有运气。如果我从我的计算机 运行 本地 Django 服务器,则该项目是可浏览的并且 Amazon RDS MySQL 是可访问的。然而,当我 运行

eb deploy

我明白了

django.db.utils.OperationalError: (2003, "Can't connect to MySQL server
on 'myapp-staging.xxx.eu-west-1.rds.amazonaws.com' (110)")
(ElasticBeanstalk::ExternalInvocationError)

如果我通过 SSH 登录到 EC2 服务器

eb ssh

然后用

检查打开的端口
netstat -lntu

我在那里没有看到 MySQL 的端口 3306,所以我猜它被防火墙阻止了。

这是我尝试过的有关权限的方法:

  1. 我转到 RDS 仪表板 -> 安全组并创建了 myapp-mysql-security-group,其 EC2 安全组连接类型指向 Elastic Beanstalk EC2 实例“awseb-e-”使用的 EC2 安全组。 ..”.
  2. 我去了 EC2 -> 安全组和“awseb-e-...”我设置了入站 MySQL 端口与源 0.0.0.0/0
  3. 我转到 VPC 仪表板 -> 安全组并创建了 myapp-mysql-security-group,其入站规则为 MySQL 端口,源为 0.0.0.0/0。

然后我尝试重新部署、重启服务器甚至重建环境,但都无济于事。 Elastic Beanstalk创建的EC2实例中MySQL端口3306还没有打开

我做错了什么或遗漏了什么?

MySQL 端口 3306 仅在 RDS 实例中打开(而不是在您的 EC2 实例中)。因此,如果您检查您的 EC2 实例,它不应侦听端口 3306。

您可以用来检查 RDS 是否正常工作的事情:

  • 检查您的 EC2 实例与 RDS 的连接。
    • 通过 SSH 连接到您的实例 (eb ssh) 和 运行 telnet myapp-staging.xxx.eu-west-1.rds.amazonaws.com 3306。您可能需要先安装 telnet (yum install telnet)。
    • 如果成功,请检查您的应用程序。
    • 如果失败,请检查下一点。
  • 确保您的 RDS 和 EC2 放置正确:
    • 对于 private 仅访问 RDS:
      • 确保它们在同一个 VPC 中,并允许 RDS 中的传入连接从 VPC 的 IP 到 3306。为了获得更好的性能,请使用 IP 地址而不是安全组名称。
      • 如果它们在不同的 VPC 上,您可以创建 VPC Peering
    • 对于public访问RDS:
      • 同上,允许来自VPC IP的传入连接。
  • 确保允许 EC2 实例与 EC2 安全组中的端口 3306 建立传出连接。
  • 确保您的 EC2 主机在 iptables 中没有拒绝 3306 规则。
  • 如果您的 EC2 和 RDS 在不同的 VPC 中并且您为 EC2 使用私有 IP,请检查 NAT 服务器。确保允许代理端口 3306。