如何不使用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
相关产品推荐
相关产品推荐

