如何将现有的 RDS 实例关联到 Elastic Beanstalk 环境?

如何将现有的 RDS 实例关联到 Elastic Beanstalk 环境?

我在创建 Elastic Beanstalk 环境之前已经创建了 RDS 实例。两者协同工作没有问题,但我希望将它们链接在一起,并且可以通过环境RDS_*变量访问 RDS 参数。

Elastic Beanstalk 配置页面显示:

您没有数据库。您可以创建新的 RDS 数据库或使用现有数据库。

虽然第一个链接会就地创建一个 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 实例):

  1. 确保为 RDS 实例设置了不同的安全组(而不是 VPC 默认组)。您可以使用(AWS CLI) 来实现这一点,并使用(AWS CLI)aws ec2 create-security-group将其与 RDS 实例关联。aws rds modify-db-instance
  2. 初始化你的 beanstalk 应用程序(我使用了eb init(EB CLI)来实现)。
  3. 从您的 RDS 数据库读取相关配置数据(数据库名称、主机名、端口等)。我就是aws rds describe-db-instances这么做的。
  4. RDS_*在创建环境(或稍后部署环境)时,使用该数据在 EB 实例上设置环境变量。您可以使用eb create/ eb deploy(EB CLI)执行此操作。最初创建环境时,它会降级,因为访问 RDS 数据库的安全组设置不正确。
  5. 从 EB 配置中获取相关安全组。您需要一个用于自动扩展组和一个用于弹性负载均衡器的安全组。您可以使用aws elasticbeanstalk describe-configuration-settings(AWS CLI) 来实现这一点。
  6. 授权自动扩展组将入站流量发送到您在步骤 1 中设置的安全组所在的数据库。我aws ec2 authorize-security-group-ingress为此使用了 (AWS CLI),它使用 VPC 安全组(而不是 DB 安全组)。如果您所在的区域支持 DB 安全组,您可能也可以使用 DB 安全组实现相同的效果。设置入站流量规则时,请确保为您的数据库引擎使用正确的协议和端口。
  7. 将弹性负载均衡器组添加到 RDS 实例的安全组(再次使用aws rds modify-db-instance(AWS CLI))。
  8. 重新启动或重新部署 Elastic Beanstalk 应用程序(例如使用eb deploy(EB CLI))。我必须重新部署,因为我在部署上运行迁移。

基本上就是这样。现在,只要保持主机名和数据库凭据相同,您就应该能够扩大/缩小 RDS 实例,而无需关心 EB 实例。您还可以使用这种方法进行蓝/绿部署(但您可能需要执行一些额外步骤来撤销安全组访问权限)。

答案4

我遇到了同样的问题并按照以下步骤修复:

1)转到 EC2 实例并记下您的安全组示例“sg-121212121212”

2)转到 RDS 安全组并获取入站流量

3)编辑规则选择所有流量并添加新的 ebs 安全组“sg-121212121212”

希望对您有帮助

相关内容