我在创建 Elastic Beanstalk 环境之前已经创建了 RDS 实例。两者协同工作没有问题,但我希望将它们链接在一起,并且可以通过环境RDS_*
变量访问 RDS 参数。
Elastic Beanstalk 配置页面显示:
虽然第一个链接会就地创建一个 RDS 实例并将其链接到当前环境,但第二个链接只是重定向到本文档页面。,不幸的是,它只解释了如何创建一个新的 RDS 实例,但没有解释如何链接现有的实例。
如何将现有 RDS 实例关联到我的 Elastic Beanstalk 环境?
答案1
“选定的”答案是正确的,但我想添加一些额外的信息,因为大多数同时使用 EB 和 RDS 的人也应该有相同的要求 - 即使他们还不知道。
第一个问题:为什么您希望 RDS 实例存在于 EB 环境之外? 回答:这样 RDS 实例的生命周期就不会与 EB 环境的生命周期绑定在一起。也就是说,当您删除环境时,您不想同时破坏数据库。您实际上想要将 RDS 实例绑定到环境的原因很少。
独立于 EB 设置 RDS 的一个问题是,您无法自动填充 RDS_* 变量,因此需要通过 Web 控制台或 .ebextensions 检索它们的值并自行填充。但不建议您在代码中添加凭据,因为这可能是一个安全漏洞。
但是,接下来的问题是,如果您想以编程方式创建环境(例如蓝绿零停机部署),那么您需要一个解决方案来每次填充敏感的 RDS 值(例如密码)。不幸的是,这需要您进一步深入 AWS 堆栈并使用 CloudFormation 模板。
理想的解决方案是对 EB 进行增强,以便问题中提到的“使用现有数据库”链接实际上允许您手动关联现有 RDS 数据库,然后再次自动填充 RDS_* 环境变量,而不是将您重定向到无用的文档。AWS 支持表示,这已作为功能请求提出,但当然没有给出时间表。
答案2
答案来自AWS 支持:
为了将现有数据库关联到 EB 环境,您必须通过管理控制台拍摄快照,然后在数据层下选择“创建新的 RDS 数据库”。由于 RDS 实例与 Beanstalk 环境的底层 Cloudformation 堆栈绑定的方式,似乎没有办法将正在运行的 RDS 实例与现有 EB 环境关联,而无需从快照启动新实例。如果您拍摄当前 RDS 实例的快照,则可以根据需要在 EB 中重新启动它。
如果您希望 RDS 实例存在于环境之外,您可以通过 EB 控制台将连接参数作为环境变量提供:配置 -> Web 层 -> 软件配置。然后,您可以通过 PHP 读取环境变量。
答案3
我最近需要这样做,并且还想使用 AWS CLI/EB CLI 自动执行这些步骤。无论如何,以下是我遵循的基本步骤(假设您已经创建了一个 RDS 实例):
- 确保为 RDS 实例设置了不同的安全组(而不是 VPC 默认组)。您可以使用(AWS CLI) 来实现这一点,并使用(AWS CLI)
aws ec2 create-security-group
将其与 RDS 实例关联。aws rds modify-db-instance
- 初始化你的 beanstalk 应用程序(我使用了
eb init
(EB CLI)来实现)。 - 从您的 RDS 数据库读取相关配置数据(数据库名称、主机名、端口等)。我就是
aws rds describe-db-instances
这么做的。 RDS_*
在创建环境(或稍后部署环境)时,使用该数据在 EB 实例上设置环境变量。您可以使用eb create
/eb deploy
(EB CLI)执行此操作。最初创建环境时,它会降级,因为访问 RDS 数据库的安全组设置不正确。- 从 EB 配置中获取相关安全组。您需要一个用于自动扩展组和一个用于弹性负载均衡器的安全组。您可以使用
aws elasticbeanstalk describe-configuration-settings
(AWS CLI) 来实现这一点。 - 授权自动扩展组将入站流量发送到您在步骤 1 中设置的安全组所在的数据库。我
aws ec2 authorize-security-group-ingress
为此使用了 (AWS CLI),它使用 VPC 安全组(而不是 DB 安全组)。如果您所在的区域支持 DB 安全组,您可能也可以使用 DB 安全组实现相同的效果。设置入站流量规则时,请确保为您的数据库引擎使用正确的协议和端口。 - 将弹性负载均衡器组添加到 RDS 实例的安全组(再次使用
aws rds modify-db-instance
(AWS CLI))。 - 重新启动或重新部署 Elastic Beanstalk 应用程序(例如使用
eb deploy
(EB CLI))。我必须重新部署,因为我在部署上运行迁移。
基本上就是这样。现在,只要保持主机名和数据库凭据相同,您就应该能够扩大/缩小 RDS 实例,而无需关心 EB 实例。您还可以使用这种方法进行蓝/绿部署(但您可能需要执行一些额外步骤来撤销安全组访问权限)。
答案4
我遇到了同样的问题并按照以下步骤修复:
1)转到 EC2 实例并记下您的安全组示例“sg-121212121212”
2)转到 RDS 安全组并获取入站流量
3)编辑规则选择所有流量并添加新的 ebs 安全组“sg-121212121212”
希望对您有帮助