如何在AWS中自动化密钥生成/轮换?Terraform相关技术疑问
AWS Secrets Manager 密钥轮换相关问题解答
1. AWS是否提供内置轮换Lambda/代码?
是的,AWS Secrets Manager提供了内置的Lambda轮换函数模板,覆盖两类核心场景:
- 针对AWS托管服务(如RDS、Redshift、DocumentDB)的专用轮换模板,自动适配对应服务的密钥更新逻辑
- 通用轮换模板,适用于自定义随机密钥生成这类场景
使用方式分为两种:
- 在Secrets Manager控制台配置轮换时,可直接选择预定义模板,AWS会自动创建对应的Lambda函数
- 通过Terraform引用预定义函数的ARN(格式示例:
arn:aws:lambda:<区域>:<账号ID>:function:SecretsManagerRotationTemplate),或基于官方模板代码自定义修改
2. 轮换时旧密钥是否立即过期?能否设置延迟过期?
默认情况下,旧密钥不会立即过期。Secrets Manager会保留旧版本密钥,默认保留期为7天,这段时间内应用可平滑过渡到新密钥。
你可以通过两种方式设置延迟过期天数:
- 创建Secret时,通过
recovery_window_in_days参数配置旧版本密钥的保留天数(取值范围7-30天,设为0会立即删除,但不推荐用于生产环境) - 在自定义轮换Lambda中,添加逻辑控制旧版本密钥的状态(比如先标记为
DISABLED,等待指定天数后再执行删除操作)
3. Terraform配置示例
基础Secret+内置轮换Lambda配置
# 创建基础Secret,设置旧版本保留14天 resource "aws_secretsmanager_secret" "example" { name = "example" recovery_window_in_days = 14 } # 引用AWS通用轮换模板Lambda(替换为你的区域和账号ID) data "aws_lambda_function" "secret_rotation" { function_name = "SecretsManagerRotationTemplate" } # 配置自动轮换规则(每30天轮换一次) resource "aws_secretsmanager_secret_rotation" "example" { secret_id = aws_secretsmanager_secret.example.id lambda_arn = data.aws_lambda_function.secret_rotation.arn rotation_rules { automatically_after_days = 30 } }
自定义轮换Lambda(生成随机密钥)
如果需要完全自定义密钥生成逻辑,可自行创建Lambda:
# 创建自定义轮换Lambda(代码需实现Secrets Manager轮换接口) resource "aws_lambda_function" "custom_secret_rotation" { filename = "secret_rotation.zip" function_name = "CustomSecretRotation" role = aws_iam_role.lambda_rotation_role.arn handler = "index.lambda_handler" runtime = "python3.11" # 核心轮换逻辑参考: # 1. 生成符合要求的随机密钥 # 2. 将新密钥作为新版本存入Secret # 3. 保留旧版本N天后再标记为禁用或删除 } # Lambda所需IAM角色(包含基础执行权限和Secrets Manager读写权限) resource "aws_iam_role" "lambda_rotation_role" { name = "LambdaSecretRotationRole" assume_role_policy = jsonencode({ Version = "2012-10-17" Statement = [ { Action = "sts:AssumeRole" Effect = "Allow" Principal = { Service = "lambda.amazonaws.com" } } ] }) } resource "aws_iam_role_policy_attachment" "lambda_basic_execution" { role = aws_iam_role.lambda_rotation_role.name policy_arn = "arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole" } resource "aws_iam_role_policy_attachment" "secrets_manager_access" { role = aws_iam_role.lambda_rotation_role.name policy_arn = "arn:aws:iam::aws:policy/SecretsManagerReadWrite" } # 关联自定义轮换Lambda到Secret resource "aws_secretsmanager_secret_rotation" "example_custom" { secret_id = aws_secretsmanager_secret.example.id lambda_arn = aws_lambda_function.custom_secret_rotation.arn rotation_rules { automatically_after_days = 30 } }
关键注意事项
- 自定义Lambda必须实现Secrets Manager规定的轮换接口,处理
createSecret、setSecret、testSecret、finishSecret四个阶段 recovery_window_in_days控制的是旧版本密钥的可恢复周期,超时后会被永久删除- 如需更精细的延迟过期控制,可在Lambda的
finishSecret阶段调用secretsmanager.update_secret_version_stage接口,将旧版本标记为DISABLED,再配合CloudWatch Events实现定时清理
内容的提问来源于stack exchange,提问作者kishi
相关产品推荐
相关产品推荐

