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

从Glacier恢复S3数据:解决脚本Token过期及断点续扫问题

解决Glacier恢复S3数据脚本的Token过期与断点续行问题

一、处理Token过期,让脚本持续运行

  • 如果是STS临时凭证过期:利用AWS SDK的内置自动刷新机制(比如Python的boto3会自动刷新会话凭证,只要初始凭证具备足够权限);也可以在脚本中添加定时逻辑,主动调用STS接口获取新凭证并替换当前会话的凭证信息。
  • 如果是分页查询的NextToken过期:每次分页请求前检查Token剩余有效期,若不足10分钟,重新发起初始扫描请求获取新的NextToken;每次分页请求完成后,立即保存最新的NextToken,避免因中断丢失进度。

二、实现从上次扫描位置继续执行(断点续扫)

核心是持久化扫描进度,具体操作如下:

  1. 保存扫描状态:每次处理完一批对象或获取到新的NextToken后,将当前的NextToken、最后处理的对象键(Key)等信息写入本地JSON文件或轻量数据库(如SQLite)。
  2. 启动时加载状态:脚本启动时先读取保存的状态文件,若存在未完成进度,直接使用保存的NextToken或最后处理的对象键作为扫描起始点,无需从头开始。
  3. 异常中断处理:在脚本中添加异常捕获逻辑,当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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 22:15:51