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

AWS S3Control调用create_job返回无效请求,Lambda触发S3 Batch操作报错

S3 Batch Operation Lambda调用返回invalid request排查方案

核心错误点及修复方案

  • Manifest配置类型错误
    你当前使用的是S3 Inventory生成的清单,Manifest.Spec.Format不应填S3BatchOperations_CSV_20180820,需改为S3InventoryReport_CSV_20210331,同时Fields字段需要和S3 Inventory输出的CSV列对应,标准配置为:
"Fields": ["Bucket", "Key", "VersionId"]

如果你的清单没有开启版本控制,可移除VersionId字段。

  • Manifest指向文件错误
    你当前在Manifest.Location.ObjectArn中填写的是清单元数据manifest.json的地址,S3 Batch Operation需要传入的是实际的CSV清单文件(通常为gzip压缩格式)的ARN,该地址可从manifest.json的file字段中获取,同时ETag也需要替换为对应CSV文件的ETag,而非manifest.json的ETag。

  • AccountId占位符未替换
    你代码中AccountId参数填的是xxxx占位符,需要替换为实际的AWS账号ID,需和RoleArn中携带的账号ID409148389496保持一致。

  • 角色权限校验
    确认你使用的IAM角色arn:aws:iam::409148389496:role/osp-log-batch-user满足以下权限要求:

  1. 信任策略允许s3batchoperations.amazonaws.com服务代入角色
  2. 包含s3:CreateJob权限
  3. 包含源存储桶的s3:GetObject权限
  4. 包含目标存储桶的s3:PutObject权限
  5. 包含清单存储桶的s3:GetObject权限

修正后核心代码示例

import json
import logging
import boto3
import os
from botocore.exceptions import ClientError

from datetime import datetime, timedelta

log = logging.getLogger(__name__)
log.setLevel(os.getenv("LOG_LEVEL", "INFO"))

for name in ['boto3', 's3control', 'botocore', 'boto']:
    logging.getLogger(name).setLevel(logging.ERROR)

clientControl = boto3.client('s3control')
    
def lambda_handler(event, context):
    log.debug('Creating job')
    
    filter_date = datetime.now() - timedelta(days=2)
    
    try:
        response = clientControl.create_job(
            AccountId = '409148389496', # 替换为实际账号ID
            ConfirmationRequired = False,
            Operation = {
                'S3PutObjectCopy': {
                    'TargetResource': 'arn:aws:s3:::vertexsmb-osplogs-uw2-lower-inventory',
                    'CannedAccessControlList': 'bucket-owner-full-control',
                    'MetadataDirective': 'COPY',
                    'ModifiedSinceConstraint': filter_date, # 替换为动态日期
                    'RequesterPays': False,
                    'StorageClass': 'STANDARD',
                    'BucketKeyEnabled': False
                }
            },
            Report = {
                'Bucket': 'vertexsmb-osplogs-uw2-lower-inventory',
                'Format': 'Report_CSV_20180820',
                'Enabled': True,
                'ReportScope': 'FailedTasksOnly',
                'Prefix': 'batch-operation-reports/' # 建议加前缀方便管理
            },
            Manifest = {
                'Spec': {
                    'Format': 'S3InventoryReport_CSV_20210331',
                    "Fields": ['Bucket', 'Key'] # 开启版本控制则加上VersionId
                },
                'Location': {
                    'ObjectArn': 'arn:aws:s3:::vertexsmb-osplogs-uw2-lower-inventory/[CSV清单文件路径]', # 替换为实际CSV文件ARN
                    'ETag': '[CSV文件对应的ETag]' # 替换为CSV文件的ETag
                }
            },
            Priority = 10,
            RoleArn = 'arn:aws:iam::409148389496:role/osp-log-batch-user'
        )
    except ClientError as e:
        log.error(e)
        raise e

    return {
        'statusCode': 200,
        'body': json.dumps('Job created successfully, job id: ' + response['JobId'])
    }

内容的提问来源于stack exchange,提问作者B. Youngman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 11:39:03