我应如何从 Elastic Beanstalk 环境解耦 Amazon RDS 实例而不导致停机、数据库同步问题或数据丢失?
上次更新时间:2020 年 9 月 23 日
我有一个 Amazon Relational Database Service (Amazon RDS) 数据库实例附加到我的 AWS Elastic Beanstalk 环境。我想要删除实例和环境之间的依赖关系。我应如何避免停机、数据库同步问题或数据丢失?
简短描述
按照解决方法中的步骤执行以下操作:
- 使用 Elastic Beanstalk 蓝(环境 A)/绿(环境 B)部署以从环境 A 中解耦该 RDS 数据库实例。
- 使用需要的信息创建新的 Elastic Beanstalk 环境(环境 B)以连接到该 RDS 数据库实例。
重要提示:挂载到 Elastic Beanstalk 环境的 RDS 数据库实例非常适合开发和测试环境,但不是生产环境的理想选择,因为数据库实例的生命周期与应用程序环境的生命周期绑定。如果终止该环境,您将会丢失数据,因为 RDS 数据库实例会被环境删除。有关更多信息,请参阅将 Elastic Beanstalk 用于 Amazon RDS。
解决方法
创建 RDS 数据库快照
- 打开 Elastic Beanstalk 控制台。
- 选择您想从您的 RDS 数据库实例解耦的 Elastic Beanstalk 环境(环境 A)。
- 在导航窗格中,选择配置。
- 对于数据库,选择修改。
- 选择终端节点。
- 为您的 RDS 数据库实例创建 RDS 数据库快照。
防止您的 RDS 数据数据库实例被删除
- 打开 Amazon RDS 控制台。
- 选择数据库,然后选择修改。
- 在删除保护部分,选择启用删除保护选项。
- 选择继续。
- 在计划修改部分,选择立即应用。
- 选择修改数据库实例。
- 刷新 Amazon RDS 控制台,然后验证是否已成功启用删除保护。
创建新 Elastic Beanstalk 环境
您的新 Elastic Beanstalk 环境(环境 B)不能包含相同 Elastic Beanstalk 应用程序中的 RDS 数据库实例。
注意:为方便在之后执行蓝/绿部署(或 CNAME 交换),请验证环境 A 和环境 B 使用的应用程序版本相同。
- 创建环境 B。
- 将环境 B 连接到环境 A 的现有 RDS 数据库实例。
注意: 有关更多信息,请参阅 启动并连接到默认 VPC 中的外部 Amazon RDS 实例。 - 验证环境 B 可以连接到现有的 RDS 数据库实例,并且您的应用程序按预期方式运行。
执行蓝/绿部署以避免停机
- 打开环境 B 的 Elastic Beanstalk 控制台。
- 交换新旧 Elastic Beanstalk 环境的环境 URL。
注意:有关更多信息,请参阅使用 Elastic Beanstalk 进行蓝/绿部署。 - 验证环境 B 的 URL 在打开时能够响应且按预期方式运行。
重要提示:在 DNS 变更已传播且您的旧 DNS 记录过期后才能终止环境 A。DNS 记录可能需要经过长达 48 小时才会过期。DNS 服务器不一定从其缓存中清除旧记录,这取决于您在 DNS 记录上设置的生存时间 (TTL)。
删除旧 Elastic Beanstalk 环境的安全组规则
- 打开 Amazon RDS 控制台。
- 选择您的数据库。
- 选择连接与安全视图。
- 从安全性中选择您需要修改的安全组。
- 对于操作,请选择编辑入站规则。
- 删除包含环境 A 的安全组作为源的规则。
- 在 Elastic Beanstalk 控制台中,验证环境 B 和您的应用程序是否均按预期运行。
终止旧 Elastic Beanstalk 环境
终止旧 Elastic Beanstalk 环境(环境 A)。
终止环境时,将删除所有 Elastic Beanstalk 资源,但 RDS 数据库实例和旧安全组除外。删除保护可防止删除 RDS 数据库实例和旧安全组。
终止环境时,您将在 Elastic Beanstalk 事件日志中看到以下错误消息:
Deleting RDS database named: aaxxxxxxxxxx failed Reason: Cannot delete protected DB Instance aaxxxxxxxxxx, please disable deletion protection and try again
Stack deletion failed: The following resource(s) failed to delete: [AWSEBRDSDatabase].
删除堆栈
- 打开 AWS CloudFormation 控制台。
- 根据环境 A 的环境的 ID 选择堆栈。
注意:堆栈的状态为 DELETE_FAILED。 - 选择删除。
- 在列出您要保留的资源的删除堆栈弹出窗口中,选择卡在 DELETE_FAILED 状态的 RDS 资源,然后选择删除堆栈。
- (可选)终止环境 A并删除您之前创建的 RDS 快照。