Answers:
“选择的”答案是正确的,但是我想添加一些额外的信息,因为大多数同时使用EB和RDS的人也应该有相同的要求-即使他们还不知道。
第一个问题:为什么要让RDS实例存在于EB环境之外? 答:这样,RDS实例的生存期就不会与EB环境的生存期挂钩。即,当您删除环境时,您不想破坏数据库。您几乎没有理由将RDS实例实际绑定到您的环境。
独立于EB设置RDS的问题是您不会自动填充RDS_ *变量,因此需要检索它们的值并通过Web控制台或.ebextensions自行填充。但是不建议您在代码中添加凭据,因为这可能是一个安全漏洞。
但是,接下来的问题是,如果您要以编程方式创建环境(例如蓝绿色零停机时间部署),那么您需要一个解决方案,以解决每次如何填充敏感RDS值(例如密码)的问题。不幸的是,这要求您进一步放下AWS堆栈并使用CloudFormation模板。
理想的解决方案是对EB的增强,因此问题中提到的“使用现有数据库”链接实际上使您可以手动关联现有RDS数据库,然后再次自动填充RDS_ *环境变量,而不是将您重定向到无用的文档。AWS支持人员说,这是作为功能请求提出的,但是当然没有给出时间表。
来自AWS支持的答案:
为了将现有数据库与EB环境相关联,您必须通过管理控制台对其进行快照,然后在“数据层”下选择“创建新的RDS数据库”。由于RDS实例绑定到Beanstalk环境的基础Cloudformation堆栈中,因此似乎没有一种方法可以将正在运行的RDS实例与现有的EB环境关联起来而不从快照中启动新的实例。如果您为当前RDS实例创建快照,则可以根据需要在EB中重新启动它。
如果希望RDS实例存在于环境之外,则可以通过EB控制台简单地将连接参数作为环境变量提供:配置-> Web层->软件配置。然后,您可以通过PHP读取环境变量。
我最近需要这样做,并且还想使用AWS CLI / EB CLI自动执行这些步骤。无论如何,基本上是我遵循的步骤(假设您已经创建了RDS实例):
aws ec2 create-security-group
为此使用(AWS CLI),然后使用(AWS CLI)将其与RDS实例关联aws rds modify-db-instance
。eb init
(EB CLI))。aws rds describe-db-instances
那样。RDS_*
在创建环境(或稍后部署环境)时,使用该数据在EB实例上设置环境变量。您可以使用eb create
/ eb deploy
(EB CLI)进行此操作。最初创建环境时,它会降级,因为访问RDS数据库的安全组未正确设置。aws elasticbeanstalk describe-configuration-settings
(AWS CLI)。aws ec2 authorize-security-group-ingress
为此(AWS CLI),该组使用VPC安全组(而非DB安全组)。如果您所在地区支持DB安全组,则可以实现相同的目的。设置入站流量规则时,请确保为数据库引擎使用正确的协议和端口。aws rds modify-db-instance
(AWS CLI))。eb deploy
(EB CLI))。我必须重新部署,因为我在部署上运行迁移。仅此而已。现在,只要保持主机名和数据库凭据相同,就可以在不关心EB实例的情况下扩展/缩小RDS实例。您也可以使用这种方法进行蓝色/绿色部署(但是您可能还需要执行一些额外的步骤来撤消安全组访问权限)。
通过配置将现有安全组添加到EB EC2实例最简单的方法是使用https://github.com/awsdocs/elastic-beanstalk-samples/blob/master/configuration-files/aws-provided/中描述的简单文件安全配置/securitygroup-addexisting.config
例如:
$ cat .ebextensions/securitygroup-addexisting.config
option_settings:
- namespace: aws:autoscaling:launchconfiguration
option_name: SecurityGroups
value: rds-launch-wizard-1