批量删除AWS CloudWatch所有日志组中6个月前的日志流
批量删除AWS CloudWatch中超过6个月的日志流
针对数千个日志组的场景,你可以通过AWS CLI结合Shell脚本或**Python脚本(使用boto3)**来批量清理超过6个月的日志流,以下是具体实现:
方法一:Bash脚本 + AWS CLI
这个方案适合熟悉命令行的用户,无需额外依赖,直接通过AWS CLI完成批量操作。
步骤1:计算6个月前的时间戳
首先转换为CloudWatch日志流使用的毫秒级Unix时间戳:
# 生成6个月前的毫秒级时间戳 SIX_MONTHS_AGO=$(date -d "-6 months" +%s)000
步骤2:批量遍历日志组并删除旧日志流
脚本会自动遍历所有日志组,筛选出创建时间早于6个月的日志流,并分批删除(规避单次API请求最多删除100个日志流的限制):
# 获取所有日志组名称 LOG_GROUPS=$(aws logs describe-log-groups --query 'logGroups[*].logGroupName' --output text) for LOG_GROUP in $LOG_GROUPS; do echo "Processing log group: $LOG_GROUP" # 将符合条件的日志流存入数组 read -ra STREAM_ARRAY <<< "$(aws logs describe-log-streams --log-group-name "$LOG_GROUP" --query "logStreams[?creationTime <= $SIX_MONTHS_AGO].logStreamName" --output text)" # 每100个日志流为一批进行删除 for ((i=0; i<${#STREAM_ARRAY[@]}; i+=100)); do BATCH=("${STREAM_ARRAY[@]:i:100}") if [ ${#BATCH[@]} -gt 0 ]; then aws logs delete-log-streams --log-group-name "$LOG_GROUP" --log-stream-names "${BATCH[@]}" echo "Deleted ${#BATCH[@]} old log streams from $LOG_GROUP" else echo "No old log streams found for $LOG_GROUP" fi done done
权限要求
执行脚本的AWS身份需要拥有以下权限:
logs:DescribeLogGroupslogs:DescribeLogStreamslogs:DeleteLogStreams
方法二:Python脚本 + boto3
如果需要更灵活的逻辑控制(比如自定义筛选条件、异常处理),可以用Python结合boto3 SDK实现:
import boto3 from datetime import datetime, timedelta # 初始化CloudWatch日志客户端 logs_client = boto3.client('logs') # 计算6个月前的毫秒级时间戳 six_months_ago = datetime.now() - timedelta(days=180) six_months_ago_ms = int(six_months_ago.timestamp() * 1000) # 分页获取所有日志组 log_group_paginator = logs_client.get_paginator('describe_log_groups') for log_group_page in log_group_paginator.paginate(): for log_group in log_group_page['logGroups']: log_group_name = log_group['logGroupName'] print(f"Processing log group: {log_group_name}") # 分页获取日志流,按创建时间升序排列(提前终止遍历) stream_paginator = logs_client.get_paginator('describe_log_streams') stream_pages = stream_paginator.paginate( logGroupName=log_group_name, orderBy='CreationTime', descending=False ) old_log_streams = [] for stream_page in stream_pages: for stream in stream_page['logStreams']: if stream['creationTime'] <= six_months_ago_ms: old_log_streams.append(stream['logStreamName']) else: # 升序排列,后续流的创建时间更晚,直接终止遍历 break # 分批删除日志流 for i in range(0, len(old_log_streams), 100): batch = old_log_streams[i:i+100] logs_client.delete_log_streams( logGroupName=log_group_name, logStreamNames=batch ) print(f"Deleted {len(batch)} old log streams from {log_group_name}")
注意事项
- 确保本地已配置AWS凭证(通过
aws configure或环境变量) - 脚本使用分页查询,避免API请求超时或超出限制
- 可以根据需求调整时间范围(比如把
timedelta(days=180)改成其他天数)
内容的提问来源于stack exchange,提问作者Bhargav
相关产品推荐
相关产品推荐

