如何轻松删除上千个已停止的AWS Glue会话?
批量删除AWS Glue已停止会话的需求
我们的Glue Session History下有约1500条记录。
其中包含大量已停止的会话,这些会话无法重启,已无保留价值,我希望删除所有已停止的会话。
通过网页端设置每页显示100条并批量删除时,会遇到速率限制,每次删除不到100条,操作繁琐且等待时间未知。
虽然可以使用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()
使用说明
- 安装依赖:
pip install boto3 - 配置AWS凭证(通过
aws configure、环境变量或IAM角色均可) - 直接运行脚本即可
解决方案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 个已停止会话"
使用说明
- 确保安装
jq(JSON处理工具) - 配置好aws-cli凭证
- 赋予脚本执行权限:
chmod +x delete_stopped_sessions.sh - 运行脚本:
./delete_stopped_sessions.sh
其他简便方法
- AWS Lambda定时清理:把Python脚本打包成Lambda函数,通过CloudWatch Events设置定时触发器,实现自动定期清理,无需手动操作。
- 网页端调整删除量:网页操作时每次选50条而非100条删除,降低触发速率限制的概率,但效率远低于脚本。
内容的提问来源于stack exchange,提问作者John Mee
相关产品推荐
相关产品推荐

