如何从亚马逊的请求者支付桶中下载数据?

How to download data from Amazon's requester pay buckets?

为了下载 arXiv 文章,我已经苦苦挣扎了大约一周:http://arxiv.org/help/bulk_data_s3#src

我尝试了很多东西:s3Browsers3cmd。我可以登录到我的存储桶,但无法从 arXiv 存储桶下载数据。

我试过了:

  1. s3cmd get s3://arxiv/pdf/arXiv_pdf_1001_001.tar

参见:

$ s3cmd get s3://arxiv/pdf/arXiv_pdf_1001_001.tar


s3://arxiv/pdf/arXiv_pdf_1001_001.tar -> ./arXiv_pdf_1001_001.tar  [1 of 1]
s3://arxiv/pdf/arXiv_pdf_1001_001.tar -> ./arXiv_pdf_1001_001.tar  [1 of 1]
ERROR: S3 error: Unknown error
  1. s3cmd getx-amz-request-payer:requester

它又给了我同样的错误:

$ s3cmd get --add-header="x-amz-request-payer:requester" s3://arxiv/pdf/arXiv_pdf_manifest.xml
s3://arxiv/pdf/arXiv_pdf_manifest.xml -> ./arXiv_pdf_manifest.xml  [1 of 1]
s3://arxiv/pdf/arXiv_pdf_manifest.xml -> ./arXiv_pdf_manifest.xml  [1 of 1]
ERROR: S3 error: Unknown error
  1. 正在复制

我也试过从那个文件夹复制文件。

$ aws s3 cp s3://arxiv/pdf/arXiv_pdf_1001_001.tar .

A client error (403) occurred when calling the HeadObject operation: Forbidden
Completed 1 part(s) with ... file(s) remaining

这可能意味着我犯了一个错误。问题是我不知道如何添加以及添加什么来表达我对付费下载的许可。

我不知道如何从 S3 下载数据。我在 AWS 网站上阅读了很多内容,但在任何地方都找不到针对我的问题的精确解决方案。

如何批量下载 arXiv 数据?

请求者付费 是 Amazon S3 存储桶上的一项功能,要求存储桶的用户支付与访问数据相关的数据传输费用。

通常情况下,S3 存储桶的所有者需要支付数据传输费用,但对于免费/开源项目来说,这可能会很昂贵。因此,存储桶拥有者可以激活请求者支付以减少他们将被收取的成本部分。

因此,在访问请求者付款存储桶时,您需要对自己进行身份验证,以便 S3 知道向谁收费。

我推荐使用官方AWS Command-Line Interface (CLI)访问AWS服务。您可以通过以下方式提供您的凭据:

aws configure

然后通过以下方式查看存储桶:

aws s3 ls s3://arxiv/pdf/

并通过以下方式下载:

aws s3 cp s3://arxiv/pdf/arXiv_pdf_1001_001.tar .

更新: 我刚刚自己尝试了上面的方法,并收到了 Access Denied 错误消息(在存储桶列表和下载命令中)。当使用 s3cmd 时,它表示 ERROR: S3 error: Access Denied存储桶的权限似乎不再允许访问。您应该联系存储桶的所有者请求访问。

this page arXiv 的底部解释说 s3cmd 被拒绝是因为它不支持作为 non-owner 访问请求者支付存储桶并且您必须对 s3cmd 的源代码应用补丁.但是,他们使用的s3cmd版本已经过时,补丁不适用于最新版本的s3cmd。

基本上,您需要允许 s3cmd 添加 "x-amz-request-payer" header 到其对存储桶的 HTTP 请求。修复方法如下:

  1. 下载s3cmd源码
  2. 用文本编辑器打开 S3/S3.py。
  3. __init__函数底部添加这两行代码:

    if self.s3.config.extra_headers:
        self.headers.update(self.s3.config.extra_headers)
    
  4. 按照说明安装 s3cmd。

尝试下载 s3cmd 版本 1.6.0http://sourceforge.net/projects/s3tools/files/s3cmd/

$ s3cmd --configure

输入您在 Amazon AWS 网站界面的账户管理选项卡中找到的凭据。

$ s3cmd get --recursive --skip-existing s3://arxiv/src/ --requester-pays

对我来说,问题是我的 IAM 用户没有足够的权限。 设置 AmazonS3FullAccess 是我的解决方案。

希望它能为某人节省时间

不想抢风头,但 OttoV 的评论实际上给出了对我有用的正确命令。

aws s3 ls --request-payer requester s3://arxiv/src/

我的 EC2 位于 us-east-2 区域,但 arXiv s3 存储桶位于 us-east-1 区域,所以我认为这就是需要 --request-payer requester 的原因。

来自 https://aws.amazon.com/s3/pricing/?nc=sn&loc=4 :

You pay for all bandwidth into and out of Amazon S3, except for the following:

• Data transferred in from the internet.

• Data transferred out to an Amazon Elastic Compute Cloud (Amazon EC2) instance, when the instance is in the same AWS Region as the S3 bucket (including to a different account in the same AWS region).

• Data transferred out to Amazon CloudFront (CloudFront).