【问题标题】:AWS S3 copy assets between two bucketsAWS S3 在两个存储桶之间复制资产
【发布时间】:2019-05-31 08:41:03
【问题描述】:

使用命令行界面,我可以在两个存储桶之间复制文件。

$ aws s3 sync s3://mybucket-src s3://mybucket-target --exclude *.tmp

这将从一个源存储桶复制到另一个目标存储桶。但我想将文件类型(图像、文档、视频)复制到目标存储桶中各自的文件夹中。

  1. 图像进入 source_files/images
  2. 文档进入 source_files/pdf
  3. 视频进入 source_files/videos

此外,如果新文件到达源存储桶,则应将它们复制到目标存储桶中各自的文件夹中。

【问题讨论】:

    标签: amazon-s3 copy


    【解决方案1】:

    您的问题中有两个主题:

    • 根据对象类型将对象移动到不同位置
    • 对象一出现就移动

    通过配置Amazon S3 事件,可以在创建对象后立即执行某些操作。该事件可以触发 AWS Lambda 函数、向 Amazon SNS 主题发送消息或将消息放入 Amazon SQS 队列。

    对于您的用例,您将使用 AWS Lambda 函数。该函数应该:

    • 从提供的event记录中检索对象的bucket nameKey
    • 通过HeadObject()检索有关对象的元数据
    • 发出CopyObject() 命令以根据元数据将对象复制到所需位置

    有关在创建 S3 对象时触发 Lambda 函数的示例,请参阅:Tutorial: Using AWS Lambda with Amazon S3 - AWS Lambda

    【讨论】:

    • 这看起来是一个可行的解决方案。我会尝试通过java sdk中的lambda函数来实现。
    【解决方案2】:

    如果您使用的是 windows powershell:

      aws s3 ls  s3://bucket-source | ForEach-Object -Process {[System.IO.Path]::GetExtension($_).Split(".")[1]} | ForEach-Object -Process {aws s3 sync s3://bucket-source s3://bucket-destination/$_/ --exclude "*" --include  "*.$_" }
    

    解释:

    1. 获取源桶中的文件列表

      aws s3 ls s3://bucket-source

    2. 找到他们的扩展

      ForEach-Object -Process {[System.IO.Path]::GetExtension($_).Split(".")[1]}

    3. 复制到目标存储桶。它为每个扩展创建文件夹并将该类型的文件复制到其中:

      ForEach-Object -Process {aws s3 sync s3://bucket-source s3://bucket-destination/$/ --exclude "*" --include "*.$"

    【讨论】:

    • 但是如何在事件中触发此代码?另外我不想在目标存储桶中创建文件夹。文件夹已经存在。
    • @mohitkumar 请注意,“文件夹”实际上并不存在于 Amazon S3 中。您实际上可以将文件复制到不存在的文件夹中,并且该文件夹将“显示”存在。
    猜你喜欢
    • 1970-01-01
    • 2016-10-12
    • 2015-07-21
    • 2016-11-05
    • 2018-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-18
    相关资源
    最近更新 更多