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

如何轻松删除上千个已停止的AWS Glue会话?

批量删除AWS Glue已停止会话的需求

我们的Glue Session History下有约1500条记录。
Glue会话历史截图
其中包含大量已停止的会话,这些会话无法重启,已无保留价值,我希望删除所有已停止的会话。

通过网页端设置每页显示100条并批量删除时,会遇到速率限制,每次删除不到100条,操作繁琐且等待时间未知。
Glue会话历史速率限制截图

虽然可以使用aws-cli删除会话,但仅支持单次删除一个。请问是否有现成脚本可以实现:

  • 调用list-sessions获取会话列表;
  • 筛选出状态为"stopped"的会话;
  • 为每个符合条件的会话调用delete session;
  • 规避速率限制;
  • 遍历所有分页会话列表?

或者有其他简便方法?


解决方案1:Python + Boto3 脚本

这个脚本自动处理分页、筛选停止状态会话,通过重试机制规避速率限制:

import boto3
from botocore.exceptions import ClientError
import time

def delete_stopped_glue_sessions():
    glue_client = boto3.client('glue')
    next_token = None
    deleted_count = 0

    while True:
        # 获取会话列表,处理分页
        try:
            if next_token:
                response = glue_client.list_sessions(NextToken=next_token)
            else:
                response = glue_client.list_sessions()
        except ClientError as e:
            print(f"获取会话列表失败: {e}")
            time.sleep(5)
            continue

        # 筛选状态为STOPPED的会话
        stopped_sessions = [s['Id'] for s in response.get('Sessions', []) if s['Status'] == 'STOPPED']

        # 逐个删除会话,带重试
        for session_id in stopped_sessions:
            retry_count = 0
            max_retries = 3
            while retry_count < max_retries:
                try:
                    glue_client.delete_session(Id=session_id)
                    print(f"已删除会话: {session_id}")
                    deleted_count += 1
                    break
                except ClientError as e:
                    if 'ThrottlingException' in str(e):
                        print(f"触发速率限制,等待2秒后重试会话 {session_id}")
                        time.sleep(2)
                        retry_count += 1
                    else:
                        print(f"删除会话 {session_id} 失败: {e}")
                        break
            if retry_count == max_retries:
                print(f"重试3次后仍无法删除会话 {session_id}")

        # 检查是否还有下一页
        next_token = response.get('NextToken')
        if not next_token:
            break
        # 分页间加短暂延迟,避免触发限制
        time.sleep(1)

    print(f"批量删除完成,共删除 {deleted_count} 个已停止会话")

if __name__ == "__main__":
    delete_stopped_glue_sessions()

使用说明

  1. 安装依赖:pip install boto3
  2. 配置AWS凭证(通过aws configure、环境变量或IAM角色均可)
  3. 直接运行脚本即可

解决方案2:Shell脚本(aws-cli + jq)

如果习惯Shell环境,用以下脚本处理分页和速率限制:

#!/bin/bash

deleted_count=0
next_token=""

while :; do
    # 获取会话列表,处理分页
    if [ -z "$next_token" ]; then
        response=$(aws glue list-sessions)
    else
        response=$(aws glue list-sessions --next-token "$next_token")
    fi

    # 提取STOPPED状态的会话ID
    session_ids=$(echo "$response" | jq -r '.Sessions[] | select(.Status == "STOPPED") | .Id')

    # 逐个删除,加延迟规避限制
    for session_id in $session_ids; do
        echo "尝试删除会话: $session_id"
        aws glue delete-session --id "$session_id"
        if [ $? -eq 0 ]; then
            deleted_count=$((deleted_count+1))
            echo "成功删除会话: $session_id"
        else
            echo "删除会话 $session_id 失败,跳过"
        fi
        # 单次删除后加小延迟
        sleep 0.5
    done

    # 检查下一页
    next_token=$(echo "$response" | jq -r '.NextToken')
    if [ "$next_token" == "null" ]; then
        break
    fi
    sleep 1
done

echo "批量删除完成,共删除 $deleted_count 个已停止会话"

使用说明

  1. 确保安装jq(JSON处理工具)
  2. 配置好aws-cli凭证
  3. 赋予脚本执行权限:chmod +x delete_stopped_sessions.sh
  4. 运行脚本:./delete_stopped_sessions.sh

其他简便方法

  • AWS Lambda定时清理:把Python脚本打包成Lambda函数,通过CloudWatch Events设置定时触发器,实现自动定期清理,无需手动操作。
  • 网页端调整删除量:网页操作时每次选50条而非100条删除,降低触发速率限制的概率,但效率远低于脚本。

内容的提问来源于stack exchange,提问作者John Mee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 11:08:18