8

我对Elastic Beanstalk很陌生,对服务器管理不太熟练,但我需要在连接到外部RDS MySQL数据库的Elastic Beanstalk上设置Django项目。由Elastic Beanstalk创建的连接到外部RDS的EC2权限

我创建了一个单独的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的安全组与EC2安全组连接类型指向由弹性使用EC2安全组Beanstalk EC2实例“awseb-e -...”。
  2. 我去了EC2->安全组和为“awseb-e -...”我设置入站MySQL端口的源0.0.0.0/0
  3. 我去了VPC仪表板 - >安全组并创建myapp -mysql-security-group,带有源端口为0.0.0.0/0的MySQL端口的入站规则。

然后我尝试重新部署,重新启动服务器甚至重建环境,但没有任何帮助。 MySQL端口3306在由Elastic Beanstalk创建的EC2实例中仍未打开。

我在做什么错或缺少什么?

回答

7

仅在RDS实例(不在您的EC2实例中)打开MySQL端口3306。所以,如果你对你的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,并允许从VPC的IP在RDS传入连接到3306.为了获得更好的性能,请使用IP地址而不是安全组名称。
      • 如果他们在不同的VPC上,则可以创建VPC Peering
    • 对于公共访问RDS:
      • 同上,允许从VPC的IP传入的连接。
  • 确保EC2实例允许使EC2安全组的3306端口传出连接。
  • 确保您的EC2主机在iptables中没有拒绝3306规则。
  • 如果您的EC2和RDS在不同的VPC中并且您使用专用IP作为EC2,请检查NAT服务器。确保你允许端口3306被代理。
+0

最初来自Elastic Beanstalk的EC2与RDS不在同一个VPC中。因此,我使用eb create命令中的--vpc switch在与VDS相同的VPC中重新创建了Elastic Beanstalk。为了解决进一步的连接问题,我必须将VPC IP添加到RDS的传入连接。感谢您的广泛解释。我希望它也能帮助其他AWS用户。 –

相关问题