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

如何不使用CloudTrail,通过Terraform实现AWS Secrets Manager访问日志?

实现Secrets Manager访问日志(不依赖CloudTrail)的Terraform方案

因为AWS Secrets Manager没有像S3、Redshift那样原生的logging配置块,要在不借助CloudTrail的前提下捕获访问日志,需要通过CloudWatch Logs集成实现,核心是让Secrets Manager将API调用日志直接发送到指定的CloudWatch日志组,具体实现如下:

1. 核心配置逻辑

  • 创建CloudWatch日志组,用于存储Secrets Manager的访问日志
  • 配置IAM权限,允许Secrets Manager服务主体向该日志组写入日志
  • 为目标Secret启用日志记录,指定目标日志组(通过动态开关控制启用状态)

2. Terraform代码实现

参考你提供的Redshift动态配置风格,用local变量控制日志开关:

# 控制是否启用Secrets Manager日志的开关变量
locals {
  enable_secrets_manager_logging = true
}

# 创建存储日志的CloudWatch日志组
resource "aws_cloudwatch_log_group" "secrets_manager_access_logs" {
  name              = "/aws/secretsmanager/access-logs"
  retention_in_days = 365
  depends_on        = [aws_iam_role_policy.secrets_manager_logging]
}

# 允许Secrets Manager写入CloudWatch日志的IAM角色
resource "aws_iam_role" "secrets_manager_logging" {
  name = "secrets-manager-logging-to-cloudwatch"

  assume_role_policy = jsonencode({
    Version = "2012-10-17"
    Statement = [{
      Action = "sts:AssumeRole"
      Effect = "Allow"
      Principal = {
        Service = "secretsmanager.amazonaws.com"
      }
    }]
  })
}

# 给IAM角色附加写入CloudWatch日志的权限
resource "aws_iam_role_policy" "secrets_manager_logging" {
  name   = "secrets-manager-log-write-permission"
  role   = aws_iam_role.secrets_manager_logging.id
  policy = jsonencode({
    Version = "2012-10-17"
    Statement = [{
      Action = [
        "logs:CreateLogStream",
        "logs:PutLogEvents"
      ]
      Effect   = "Allow"
      Resource = aws_cloudwatch_log_group.secrets_manager_access_logs.arn
    }]
  })
}

# 动态配置Secrets Manager的日志设置(对应Redshift的dynamic logging块逻辑)
resource "aws_secretsmanager_logging_configuration" "example" {
  count               = local.enable_secrets_manager_logging ? 1 : 0
  secret_id           = aws_secretsmanager_secret.example.id # 替换为你的目标Secret ID
  cloudwatch_logs_log_group_arn = aws_cloudwatch_log_group.secrets_manager_access_logs.arn
  log_level           = "INFO" # 可选值:ERROR/INFO,INFO会记录所有API调用操作
}

# 示例:创建一个Secrets Manager密钥(如果需要)
resource "aws_secretsmanager_secret" "example" {
  name = "example-app-secret"
}

3. 关键说明

  • aws_secretsmanager_logging_configuration是Terraform专门用于配置Secrets Manager日志的资源,通过count参数实现类似Redshift的动态启用/禁用逻辑
  • 日志级别log_level设为INFO会捕获所有密钥相关API操作(如获取、更新、删除),设为ERROR仅记录错误事件
  • 如果需要将日志持久化到S3,可以额外配置CloudWatch Logs的导出任务(aws_cloudwatch_log_export_task),将日志定期同步到指定S3桶

内容的提问来源于stack exchange,提问作者Elangkumaran Baladhandapani

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 00:07:28