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满足以下权限要求:
- 信任策略允许
s3batchoperations.amazonaws.com服务代入角色 - 包含
s3:CreateJob权限 - 包含源存储桶的
s3:GetObject权限 - 包含目标存储桶的
s3:PutObject权限 - 包含清单存储桶的
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
相关产品推荐
相关产品推荐

