从Internet下载文件到S3存储桶

时间:2013-10-08 07:30:36

标签: amazon-web-services amazon-s3

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

我有什么方法可以抓取互联网文件并将其直接插入S3?

4 个答案:

答案 0 :(得分:10)

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

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

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

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

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

答案 1 :(得分:6)

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

[原始答案] 不可能直接这样做。

为什么不使用EC2实例而不是本地PC呢?在同一地区从EC2到S3的上传速度非常好。

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

答案 2 :(得分:4)

通过from flask import Flask app = Flask(__name__) app.config['SERVER_NAME'] = 'localhost:5000' @app.route('/') def hello_world(): return 'Hello World!' if __name__ == '__main__': app.run(debug=True) 下载数据并将内容直接传送到S3。数据直接流式传输到S3,不会存储在本地,从而避免了任何内存问题。

curl

如上所述,如果本地计算机上的下载速度太慢,请启动EC2实例curl "https://download-link-address/" | aws s3 cp - s3://aws-bucket/data-file 并在其中执行上述命令。

答案 3 :(得分:0)

您可以使用Python将文件从互联网流式传输到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>'})