如何通过CLI将AWS CloudWatch日志导出存储至S3存储桶
CloudWatch日志导出到S3操作指南
前置配置(必做,否则导出会失败)
首先需要给目标S3存储桶添加桶策略,授权CloudWatch日志服务写入权限,将以下策略中的{AWS区域}、{目标S3桶名}替换为实际值后,添加到S3桶的权限配置中:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "logs.{AWS区域}.amazonaws.com" }, "Action": [ "s3:GetBucketAcl", "s3:PutObject" ], "Resource": [ "arn:aws:s3:::{目标S3桶名}", "arn:aws:s3:::{目标S3桶名}/*" ], "Condition": { "StringEquals": { "s3:x-amz-acl": "bucket-owner-full-control" } } } ] }
方案一:一次性全量导出历史日志
直接使用你已经配置好的AWS CLI执行导出任务即可:
- 命令参数说明:
--log-group-name:Lambda对应的CloudWatch日志组名,默认格式为/aws/lambda/{Lambda函数名}--from:导出起始时间戳(单位:毫秒),需要导出所有历史日志直接填0--to:导出结束时间戳(单位:毫秒),需要导出到当前时间可直接用$(date +%s000)生成--destination:目标S3桶名--destination-prefix:S3桶内的存储前缀,可自定义,比如填lambda-cloudwatch-logs/方便后续Redshift导入
- 完整执行命令示例:
aws logs create-export-task \ --log-group-name "/aws/lambda/my-demo-lambda" \ --from 0 \ --to $(date +%s000) \ --destination "my-s3-log-bucket" \ --destination-prefix "lambda-cloudwatch-logs/"
- 命令执行后会返回导出任务ID,可通过以下命令查看导出进度:
aws logs describe-export-tasks --task-id {返回的任务ID}
任务状态变为COMPLETED即导出完成,可到S3对应路径下查看日志文件。
- 批量导出多个日志组的话,写shell循环遍历所有日志组名,串行执行上述命令即可(同一区域同一时间仅支持运行1个导出任务)。
方案二:自动实时同步新增日志
如果需要后续Lambda新产生的日志自动同步到S3,无需每次手动导出,可配置实时投递链路:
- 创建Kinesis Data Firehose传输流,目标选择你的S3存储桶,可按需配置gzip压缩降低存储成本,设置和全量导出一致的S3前缀
- 进入对应CloudWatch日志组的「订阅过滤器」页面,新建订阅,目标选择刚才创建的Kinesis Data Firehose,过滤规则留空即可匹配所有日志
- 配置完成后,新产生的日志会在1~5分钟内自动投递到S3指定路径
后续Redshift导入提示
导出到S3的日志为JSON格式压缩文件,直接使用Redshift的COPY命令即可导入到SQL表,导入时指定format json参数即可自动匹配字段,无需提前做格式转换。
内容的提问来源于stack exchange,提问作者Sidhant Gupta
相关产品推荐
相关产品推荐

