从Glacier恢复S3数据:解决脚本Token过期及断点续扫问题
解决Glacier恢复S3数据脚本的Token过期与断点续行问题
一、处理Token过期,让脚本持续运行
- 如果是STS临时凭证过期:利用AWS SDK的内置自动刷新机制(比如Python的boto3会自动刷新会话凭证,只要初始凭证具备足够权限);也可以在脚本中添加定时逻辑,主动调用STS接口获取新凭证并替换当前会话的凭证信息。
- 如果是分页查询的NextToken过期:每次分页请求前检查Token剩余有效期,若不足10分钟,重新发起初始扫描请求获取新的NextToken;每次分页请求完成后,立即保存最新的NextToken,避免因中断丢失进度。
二、实现从上次扫描位置继续执行(断点续扫)
核心是持久化扫描进度,具体操作如下:
- 保存扫描状态:每次处理完一批对象或获取到新的NextToken后,将当前的NextToken、最后处理的对象键(Key)等信息写入本地JSON文件或轻量数据库(如SQLite)。
- 启动时加载状态:脚本启动时先读取保存的状态文件,若存在未完成进度,直接使用保存的NextToken或最后处理的对象键作为扫描起始点,无需从头开始。
- 异常中断处理:在脚本中添加异常捕获逻辑,当Token过期或其他错误触发时,优先保存当前进度,再退出或自动重启脚本并加载进度继续执行。
简单Python示例片段
import json import boto3 # 状态文件路径,用于保存扫描进度 STATE_FILE = "glacier_restore_progress.json" def load_progress(): try: with open(STATE_FILE, 'r') as f: return json.load(f) except FileNotFoundError: return {"next_token": None, "last_key": None} def save_progress(next_token, last_key): progress = {"next_token": next_token, "last_key": last_key} with open(STATE_FILE, 'w') as f: json.dump(progress, f) def restore_s3_objects(): s3_client = boto3.client('s3') bucket = "your-target-bucket" progress = load_progress() while True: # 根据保存的进度发起查询请求 if progress["next_token"]: response = s3_client.list_objects_v2( Bucket=bucket, ContinuationToken=progress["next_token"] ) else: response = s3_client.list_objects_v2(Bucket=bucket) # 处理当前页的对象恢复 for obj in response.get('Contents', []): obj_key = obj['Key'] # 执行Glacier恢复操作 s3_client.restore_object( Bucket=bucket, Key=obj_key, RestoreRequest={ 'Days': 7, 'GlacierJobParameters': {'Tier': 'Standard'} } ) progress["last_key"] = obj_key # 更新并保存进度 progress["next_token"] = response.get('NextContinuationToken') save_progress(progress["next_token"], progress["last_key"]) # 无更多对象则终止循环 if not progress["next_token"]: break if __name__ == "__main__": restore_s3_objects()
注:示例基于list_objects_v2分页逻辑,需根据你实际使用的API和脚本逻辑调整;确保脚本具备读写状态文件、操作S3及Glacier的权限。
内容的提问来源于stack exchange,提问作者user19378169
相关产品推荐
相关产品推荐

