AWS CLI S3:使用终端在本地复制文件:致命错误:调用 HeadObject 操作时发生错误(404)

Posted

技术标签:

【中文标题】AWS CLI S3:使用终端在本地复制文件:致命错误:调用 HeadObject 操作时发生错误(404)【英文标题】:AWS CLI S3: copying file locally using the terminal : fatal error: An error occurred (404) when calling the HeadObject operation 【发布时间】:2017-12-19 22:37:06 【问题描述】:

我正在尝试从 s3 存储桶本地复制文件。我可以获取存储桶中的文件列表:

aws s3 ls  s3://myBucket/myDirectory/todaysFiles/

但是当我尝试在本地复制文件时:

aws s3 cp s3://myBucket/myDirectory/todaysFiles/ .

我收到此错误:

fatal error: An error occurred (404) when calling the HeadObject operation: Key "myDirectory/todaysFiles/" does not exist

但我尝试只在本地复制一个文件:

 aws s3 cp s3://myBucket/myDirectory/todaysFiles/somefile .

我收到此错误:

 warning: Skipping file s3://myBucket/myDirectory/todaysFiles/somefile. Object is of storage class GLACIER. Unable to perform download operations on GLACIER objects. You must restore the object to be able to the perform operation. See aws s3 download help for additional parameter options to ignore or force these transfers.

你们中的任何人都知道我为什么会收到此错误或解决此错误的方法吗?

非常感谢您的帮助

【问题讨论】:

【参考方案1】:

对于第一个错误 - 添加递归标志:

aws s3 cp s3://myBucket/myDirectory/todaysFiles/ . --recursive

这会将“todaysFiles”目录中的所有文件复制到当前目录。

但是,第二个错误表明您的文件位于 Glacier 中。这使事情变得有点复杂,因为 Glacier 不是实时的 - 取决于您愿意支付的费用,可能需要数小时才能恢复数据。有关更多信息,请参阅Restoring Objects 文档。在对象从 Glacier 恢复到 S3 之前,您无法从 S3 复制。

请注意,如果您这样做,您将需要 Glacier 和 S3 的费用。

顺便说一句,如果这些文件真的是今天的文件,那么在 S3 上存储和推送到 Glacier 之间应该有更长的时间。但我猜父目录也可能有一个与日期相关的组件。

【讨论】:

【参考方案2】:

如果 Source 包含多个文件夹,则在末尾使用 --recursive。

aws s3 cp s3Uri Local --recursive

【讨论】:

【参考方案3】:

如果对任何人有帮助,你也可以使用

aws s3 sync s3://<bucketname>/<folder>/ ./<folder>

这应该可以在不必使用递归的情况下工作。它的好处是可以跳过本地已经存在的文件。

正如@raju 所提到的,glacier 是 AWS 上的一种廉价存储系统,这意味着如果您想检索数据,您首先需要发出请求以获取数据,然后才能下载数据。对于不经常访问的长期存储,它的成本很低。

【讨论】:

【参考方案4】:
pip install --upgrade --user awscli

aws s3 cp s3://inbound/test/ /inbound/ --recursive --region us-west-2

【讨论】:

--region 开关适用于目标存储桶,这里没有意义,因为它是本地文件系统。要指定源存储桶的区域,请改用 --source-region 开关。编号:docs.aws.amazon.com/cli/latest/reference/s3/cp.html 看来 OP 已经安装了 awscli,无需推荐。 s3 是全球性的,不是吗?指定区域有什么意义?

以上是关于AWS CLI S3:使用终端在本地复制文件:致命错误:调用 HeadObject 操作时发生错误(404)的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 boto 从 S3 读取密钥,但可以使用 aws cli

使用 AWS CLI 从 S3 获取最后修改的对象

AWS S3在两个存储桶之间复制文件和文件夹

使用aws cli将S3对象上传到存储桶后如何获取它?

如何使用 cli 在 AWS S3 中查找/检查当前权限?

AWS S3 CLI的权限bug