首页 > 解决方案 > 如何创建 Amazon S3 作业以移动大文件

问题描述

我需要在唯一的 Amazon S3 存储桶中将文件从一个文件夹复制到另一个文件夹。但是,由于文件大小,我不能简单地从 AWS SDK S3 类调用 copyObject 方法,因为它会使我的 Lambda 函数超时。

这就是为什么我试图创建一个S3 批量操作作业来移动这个文件,但是我Invalid job operation在尝试时遇到了错误。我正在使用 AWS SDKS3Control类,试图调用方法 createJob。我将此对象作为参数传递:

{
    AccountId: '445084039568',
    Manifest: {
        Location: {
            ETag: 'dbe4a392892992491a7124c10f2fbf03',
            ObjectArn: 'arn:aws:s3:::amsp-media-bucket/manifest.csv'
        },
        Spec: {
            Format: 'S3BatchOperations_CSV_20180820',
            Fields: ['Bucket', 'Key']
        },
        
    },
    Operation: {
        S3PutObjectCopy: {
            TargetResource: 'arn:aws:s3:::amsp-media-bucket/bigtest'
        }
    },
    Report: {
        Enabled: false
    },
    Priority: 10, 
    RoleArn: 'arn:aws:iam::445084039568:role/mehoasumsp-sandbox-asumspS3JobRole-64XWYA3CFZF3'
}

老实说,我不确定我是否正确指定了清单。这是 manifest.csv 内容:

amsp-media-bucket, temp/37766a92-16ef-4ee2-8e79-3875679dad85.mkv

我不是对文件本身不安全,而是对我在 param 对象中定义 Spec 属性的方式不安全。

标签: amazon-web-servicesamazon-s3

解决方案


单引号在作业规范 JSON 中可能无效。我只见过双引号。

在 boto3 (Python SDK) 中,使用托管的 .copy() 函数而不是 .copy_object(),并调整 multipart_chunksize 和并发设置,多个 UploadPartCopy 请求很可能在 Lambda 运行时限制内完成。AWS JS SDK 似乎缺少等效功能,您可能想尝试类似https://github.com/Zooz/aws-s3-multipart-copy

正如 John Rotenstein 所说,请注意 CSV 文件中对象键中的空格。

S3PutObjectCopy S3 批量操作作业使用 CopyObject,其大小限制为 5GiB。

加上操作成本,S3 批量操作作业每个成本为 0.25 美元,如果复制少量对象,这可能会很昂贵。


推荐阅读