弹性Beanstalk连接外部RDS创建的EC2权限



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

我已经创建了一个单独的RDS MySQL数据库,我可以在电脑上使用Sequel Pro连接到它,而不会出现问题。然后我有我的Django项目,我试图把它放在Elastic Beanstalk上,但不幸的是没有运气。如果我在电脑上运行本地Django服务器,项目是可浏览的,并且可以访问AmazonRDS 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 Dashboard->Security Groups,创建了myapp-mysql安全组,EC2安全组连接类型指向Elastic Beanstalk EC2实例"awseb-e…"使用的EC2安全群组
  2. 我去了EC2->安全组,对于"awseb-e-…",我设置了源为0.0.0.0/0的入站MySQL端口
  3. 我去了VPC Dashboard->Security Groups,用mysql端口的入站规则创建了myapp-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。您可能需要先安装telnetyum install telnet
    • 如果成功,请检查您的应用程序
    • 如果失败,请检查下一点
  • 确保您的RDS和EC2位置正确:
    • 对于私有,仅访问RDS:
      • 确保它们在同一个VPC中,并允许RDS从VPC的IP传入3306。为了获得更好的性能,请使用IP地址而不是安全组名称
      • 如果它们在不同的专有网络上,您可以创建专有网络对等
    • 对于公共访问RDS:
      • 同上,允许从VPC的IP传入连接
  • 确保允许EC2实例建立到EC2安全组中的端口3306的传出连接
  • 确保您的EC2主机没有在iptables中拒绝3306规则
  • 如果您的EC2和RDS在不同的VPC中,并且您的EC2使用私有IP,请检查NAT服务器。请确保允许代理端口3306

最新更新