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

批量删除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:DescribeLogGroups
  • logs:DescribeLogStreams
  • logs: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 21:35:12