使用boto3的S3Control创建Amazon S3 Batch任务报Request invalid错误
问题原因与解决方案
核心错误原因
- 账号ID不一致:代码中
AccountId参数填的是71652345619605,但后续RoleArn中的账号ID是716293619605,两个ID不匹配导致请求校验不通过。 - 输入清单配置错误:
Manifest.Spec是定义输入任务清单的格式,你当前填写的Format为S3 Batch Operations的输出报告格式,Fields也填了报告输出的专属字段(如TaskStatus、ErrorCode等),和输入清单的实际格式不匹配。 - 报告配置缺失必填项且格式错误:
Report参数中的Bucket需要填写完整的桶ARN,不能只填桶名,同时你遗漏了必填的Format字段定义报告格式。 - 可选校验项:如果目标桶未开启Object Lock功能,你配置的
ObjectLockMode、ObjectLockRetainUntilDate参数也会触发非法请求。
修复步骤
- 统一账号ID,将
AccountId修改为和RoleArn一致的716293619605。 - 修正输入清单配置:
- 如果你使用的是S3 Inventory生成的清单作为输入,将
Manifest.Spec.Format改为S3Inventory_CSV_20211130,Fields只保留输入清单实际包含的字段(如['Bucket', 'Key', 'VersionId'])。 - 如果你使用的是自定义CSV清单,
Format改为CSV,Fields和你自定义CSV的列顺序对应。
- 如果你使用的是S3 Inventory生成的清单作为输入,将
- 修正报告配置:
- 将
Report.Bucket改为完整ARN,格式为arn:aws:s3:::你的报告桶名。 - 新增必填的
Format字段,值为Report_CSV_20180820。
- 将
- 校验IAM角色权限:确认
s3BatchOps角色的信任策略允许batchoperations.s3.amazonaws.com服务代入,同时角色有清单桶读权限、目标桶写权限、报告桶写权限。
修正后的核心代码示例
client_control.create_job( # 修正为正确的账号ID AccountId='716293619605', ConfirmationRequired=True, Operation={ 'S3PutObjectCopy': { 'TargetResource': 'arn:aws:s3:::worm-all-bucket-inventory-embark', 'StorageClass': 'DEEP_ARCHIVE', 'ObjectLockLegalHoldStatus': 'OFF', # 确认目标桶开启了Object Lock再保留以下两个参数,否则删除 'ObjectLockMode': 'COMPLIANCE', 'ObjectLockRetainUntilDate': datetime(2115, 1, 1) } }, Report={ # 修正为完整桶ARN 'Bucket': 'arn:aws:s3:::s3-batch-ops-report', 'Enabled': True, 'ReportScope': 'AllTasks', # 新增必填的报告格式字段 'Format': 'Report_CSV_20180820' }, Manifest={ 'Spec': { # 按你实际的输入清单格式修改 'Format': 'S3Inventory_CSV_20211130', # 按输入清单实际包含的列填写,和列顺序完全对应 'Fields': [ 'Bucket', 'Key', 'VersionId' ] }, 'Location': { 'ObjectArn': 'arn:aws:s3:::all-bucket-inventory-embark/agentwidget/2/2021-08-26T00-00Z/manifest.json', 'ETag': 'fdc154f55282ef570cc9023068a72fc2' } }, Priority=10, RoleArn='arn:aws:iam::716293619605:role/s3BatchOps' )
内容的提问来源于stack exchange,提问作者davefogo
相关产品推荐
相关产品推荐

