S3批量操作从Deep Archive恢复至Standard报InvalidObjectState错误
S3 Batch Operations仅处理Deep Archive对象的实现方案
问题背景
使用S3 Batch Operations执行Restore操作将Deep Archive存储类对象转换为Standard存储类时作业失败:
- 作业输入清单通过S3 Inventory生成,清单包含目标桶内所有对象
- 目标桶内同时存在Deep Archive、Standard两类存储类对象,作业处理到Standard对象时触发报错
- 报错信息如下:
Restore is not allowed for the object's current storage class (Service: Amazon S3; Status Code: 403; Error Code: InvalidObjectState; Request ID: CBKBCAHF9RJJY180; S3 Extended Request ID: ut4csBUfR+c1rSZQMVga1h+WNS6hiddXB2ANj7vvtAOlv8YtavgUM/droJ09qqi2ZMmqVQFOby8=; Proxy: null)
- 目标桶对象总量超200万,无法通过手动筛选生成合规清单
可落地方案
按优先级从高到低排列:
- 配置S3 Inventory规则直接生成过滤后的清单
新建或编辑现有S3 Inventory规则时,在筛选条件中指定仅包含存储类为DEEP_ARCHIVE的对象,生成的清单天然排除Standard等其他存储类的对象,可直接作为Batch Operations的输入。该方案全程在AWS服务侧完成,无额外开发成本,适配千万级以上对象规模,不需要做二次数据处理。 - 用S3 Select筛选已有全量清单
如果已经生成了全量清单,不需要重新跑Inventory任务,直接使用S3 Select对存储在S3上的清单文件做服务端查询筛选,导出仅包含Deep Archive对象的记录作为新的作业清单。S3 Inventory支持的CSV、ORC、Parquet三种输出格式都兼容S3 Select,筛选过程不需要把全量清单下载到本地,处理200万条记录仅需数秒,成本可忽略。
针对默认字段配置的CSV格式清单,筛选的SQL语句参考:
正式筛选前先执行SELECT * FROM s3object s WHERE s._7 = 'DEEP_ARCHIVE'SELECT * FROM s3object s LIMIT 5拉取前5行记录,确认StorageClass字段对应的列序号,如果清单配置了额外输出字段,调整SQL里的列序号即可。 - 配置作业失败容忍规则做兜底
不需要调整清单,创建Batch Operations作业时,将失败任务容忍阈值设置为高于非Deep Archive对象的占比,作业碰到Standard对象触发InvalidObjectState报错时不会整体终止,会自动跳过失败对象继续处理剩余的Deep Archive对象,最终可通过作业报告查看所有跳过的记录。该方案操作成本最低,适合需要紧急启动作业的场景,注意该规则会跳过所有触发相同错误码的对象,使用前需确认桶内不存在其他会触发同错误码的异常对象,避免漏处理目标资源。
内容的提问来源于stack exchange,提问作者Haider Ali
相关产品推荐
相关产品推荐

