【问题标题】:AWS S3 copy folder without using listobject不使用 listobject 的 AWS S3 复制文件夹
【发布时间】:2021-11-27 17:50:39
【问题描述】:
我需要在同一个存储桶中复制一个文件夹,然后对复制的内容运行各种逻辑。
我想知道是否有办法在不使用listObjects 的情况下复制整个文件夹,然后分别复制每个文件。
因为这意味着运行listObjects 并复制每个文件,然后在新文件夹上再次运行listObjects,然后在每个文件上运行逻辑。
所以基本上我是在尝试节省 IO 并避免多个循环。
请指教。
【问题讨论】:
标签:
node.js
amazon-web-services
amazon-s3
aws-sdk
【解决方案1】:
您可以在您选择的 SDK 中使用 --recursive 标记来完成此操作。将此与可以使用通配符的--include 和--exclude 标志结合使用,您就可以实现您的目标。 See this page of the CLI documentation
类似:
aws s3 cp s3://mybucket/logs/ s3://mybucket/logs2/ --recursive --exclude "*" --include "*.log"
【解决方案2】:
Amazon S3 不提供“复制文件夹”的命令。相反,每个对象都必须通过其自己的 API 请求单独复制。
这意味着您首先需要获取对象列表。这可以通过以下方式获得:
- 对
ListObjects 的调用(注意:每个 API 调用最多只能返回 1000 个对象)
或
如果您有大量个对象,您可以考虑使用Amazon S3 Batch Operations,它可以为每个对象复制文件或调用AWS Lambda函数。
您还可以将 Amazon S3 配置为在创建对象时(包括复制对象时)触发 AWS Lambda 函数。这样,对象的创建就可以直接触发你要运行的逻辑。