You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 12:41:04