我对 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,所以我猜它被防火墙阻止了。
这是我在权限方面尝试过的:
- 我转到 RDS 仪表板 -> 安全组并创建了 myapp-mysql-security-group,其 EC2 安全组连接类型指向 Elastic Beanstalk EC2 实例“awseb-e-...” 使用的 EC2 安全组。
- 我进入 EC2 -> 安全组,对于“awseb-e-...”,我将入站 MySQL 端口设置为源 0.0.0.0/0
- 我进入 VPC 仪表板 -> 安全组并使用源 0.0.0.0/0 的 MySQL 端口入站规则创建了 myapp-mysql-security-group。
然后我尝试重新部署、重新启动服务器甚至重建环境,但都无济于事。Elastic Beanstalk 创建的 EC2 实例中的 MySQL 端口 3306 仍未打开。
我做错了什么或者缺少了什么?
答案1
配置中似乎缺少两点:
我必须重新创建 Elastic Beanstalk 环境,使其与 RDS 数据库位于同一个虚拟私有云 (VPC) 内。这可以通过以下方式完成:
eb create myapp-staging --vpc
然后回答一些问题,例如 VPC ID 是什么。
我必须将 VPC CIDR(IP)输入到“rds-launch-wizard”安全组允许的 MySQL 传入连接中:
a) 转到 VPC 仪表板 -> 您的 VPC 并复制 VPC CIDR。
b) 转到 VPC 仪表板 -> 安全组并选择“rds-launch-wizard”组,然后编辑入站规则并添加此规则:
MySQL/Aurora (3306) | TCP (6) | 3306 | <VPC CIDR here>
答案2
如果不使用自定义 VPC,将现有安全组添加到 EB EC2 实例的最简单方法是使用https://github.com/awsdocs/elastic-beanstalk-samples/blob/master/configuration-files/aws-provided/security-configuration/securitygroup-addexisting.config
例如:
$ cat .ebextensions/securitygroup-addexisting.config
option_settings:
- namespace: aws:autoscaling:launchconfiguration
option_name: SecurityGroups
value: rds-launch-wizard-1