亚马逊AWS官方博客
使用 Amazon EventBridge 和 AWS Lambda 在 AWS Secrets Manager 自动创建和备份密钥历史版本
![]() |
一. 前言
目前 AWS Secrets Manager 默认情况下只会自动保留一个历史版本。如果需要保留多个历史版本则需要通过 CLI 或者 API 手动打上并管理 staging label 暂存标签。AWS Secrets Manager 目前支持添加 20 个暂存标签。由于不能通过 Management Console UI 控制面板来操作,对于客户来说使用这种方法保留和回溯历史版本变得比较困难。
本文将介绍通过使用 Amazon EventBridge 和 AWS Lambda 在 AWS Secrets Manager 自动创建保留密钥历史版本的方案。这个方案能够为客户的每一次密钥更改自动生成 staging label 并保留最新的 20 个历史版本,不需要人为干预和手动操作。方案支持将密钥以及历史版本保存在当前区域,也可以跨区域跨账号保存和备份。
二. 原地创建版本架构设计
![]() |
原理
通过 Amazon EventBridge 捕捉 Secrets Manager 密钥更新事件的形式,触发 Lambda 来处理事件并在密钥自动打上 staging label 来保留多个版本。同时因为 Secrets Manager 限制在一个密钥下 staging label 必须唯一且数量不能超过 20 个, Lambda 会自动为备份的密钥生成唯一的标签且在达到标签上限时自动删除最老的版本上的标签以保留最新的版本。
详细配置
- 创建一个 AWS Lambda Python 函数命名为 SecretsVersionFunction,代码如下:
- 在 Lambda 函数的默认执行角色上添加以下策略:
- 打开 Amazon EventBridge,在事件总线,默认事件总线(default)中创建一个新的规则 SMCreateUpdateSecretsEvent。将事件模式设定为:
- 事件目标类型设置为 Lambda 函数并选定之前创建的 SecretsVersionFunction 并保存。
- 在 AWS Secrets Manager 中创建一个测试密钥并更新,可以观察到暂存标签被自动添加到了版本上:
- 通过 AWS CloudWatch Lambda 命名空间 Errors 指标并设置告警通知可以监控 Lambda 函数的执行情况,确保自动备份过程正常运行。
三. 跨区域跨账号多版本备份架构设计
![]() |
原理
通过 Amazon EventBridge 转发源区域和账号的事件到目标区域和账号,触发 AWS Lambda 函数来进行密钥备份和保存历史版本。
同时,这个方案利用 AWS Service Catalog 来创建和管理 AWS CloudFormation 的堆栈集以方便在多个账户和区域同时进行部署。
最后,方案会自动在备份账号中生成新的 KMS key 来加密原有密钥并在多区域场景下自动生成副本密钥。
详细配置
以需要将 AWS Secrets Manager 源账号东京区(ap-northeast-1)的 Secrets 备份到目标账号孟买(ap-south-1)为例:
- 在 AWS Management Console 中打开 Service Catalog。如果需要跨账号备份,请登陆管理员账号 Administrator Account 部署此方案。
- 如果已有产品组合,可跳过这个步骤 – 在 Service Catalog 服务中创建一个产品组合,完成后在产品组合访问权限中添加当前用户和需要访问权限的 IAM 主体(组、角色或用户), 记录创建的产品组合 ID。
- 在目标账户的目标区域创建一个 S3 桶。克隆 aws-secrets-manager-p 并将 scripts/ 和 templates/ 文件夹中的文件上传至 S3 桶,注意所有文件需要同一个前缀。确保此存储桶具有一个策略,该策略允许密钥来源的 AWS 帐户以及备份目标帐户进行读取访问。Bucket policy 范例如下:
- 请注意,如果账号中没有 AWSCloudFormationStackSetAdministrationRole 和 AWSCloudFormationStackSetExecutionRole 角色,请参考 https://docs.aws.amazon.com/zh_cn/AWSCloudFormation/latest/UserGuide/stacksets-prereqs-self-managed.html 创建:
- 选择 Lambda 服务,找到 SecretsManagerBackupBackupFunction 函数,在“配置”→“环境变量”中添加“OVERRIDE_ON_UPDATE”,值为“False”。
- 部署完成,可以在源区域中创建/更新密钥,并观察密钥是否备份到目标区域和账号。
范例效果
![]() |