34

我想直接从 Internet 上获取一个文件并将其粘贴到 S3 存储桶中,然后将其复制到 PIG 集群中。由于文件的大小和我不太好的互联网连接,首先将文件下载到我的 PC 上,然后将其上传到亚马逊可能不是一个选择。

有什么办法可以抓取互联网文件并将其直接粘贴到 S3 中?

4

4 回答 4

32

通过下载数据curl并将内容直接传输到 S3。数据直接流式传输到 S3,而不是存储在本地,避免了任何内存问题。

curl "https://download-link-address/" | aws s3 cp - s3://aws-bucket/data-file

如上所述,如果本地计算机上的下载速度太慢,请启动 EC2 实例,ssh并在那里执行上述命令。

于 2017-10-29T16:45:08.057 回答
16

对于经验不足的任何人(如我),以下是通过 EC2 对该过程的更详细描述:

  1. 在与目标 S3 存储桶相同的区域中启动 Amazon EC2 实例。最小的可用(默认 Amazon Linux)实例应该没问题,但请确保为其提供足够的存储空间来保存您的文件。如果您需要高于 ~20MB/s 的传输速度,请考虑选择具有较大管道的实例。

  2. 启动到新 EC2 实例的 SSH 连接,然后下载文件,例如使用wget. (例如,要通过 FTP 下载整个目录,您可以使用wget -r ftp://name:passwd@ftp.com/somedir/.)

  3. 使用 AWS CLI(请参阅Amazon 的文档),将文件上传到您的 S3 存储桶。例如,aws s3 cp myfolder s3://mybucket/myfolder --recursive(对于整个目录)。(在此命令生效之前,您需要将 S3 安全凭证添加到配置文件中,如 Amazon 文档中所述。)

  4. 终止/销毁您的 EC2 实例。

于 2015-04-03T23:02:04.507 回答
13

[2017 年编辑] 我在 2013 年给出了原始答案。今天我建议使用AWS Lambda下载文件并将其放在 S3 上。这是预期的效果 - 将对象放置在不涉及服务器的 S3 上。

[原答案] 不能直接做。

为什么不使用 EC2 实例而不是本地 PC 来执行此操作?从 EC2 到 S3 在同一区域的上传速度非常好。

关于从/到s3的流读/写我使用python的smart_open

于 2013-10-08T13:43:10.930 回答
3

您可以使用 Python 将文件从 Internet 流式传输到 AWS S3。

s3=boto3.resource('s3')
http=urllib3.PoolManager()

urllib.request.urlopen('<Internet_URL>')   #Provide URL
s3.meta.client.upload_fileobj(http.request('GET', 'Internet_URL>', preload_content=False), s3Bucket, key, 
    ExtraArgs={'ServerSideEncryption':'aws:kms','SSEKMSKeyId':'<alias_name>'})
于 2020-06-09T15:42:13.217 回答