【问题标题】:Connection closed error from Amazon S3 after changing to boto get_bucket更改为 boto get_bucket 后来自 Amazon S3 的连接关闭错误
【发布时间】:2014-01-31 06:31:11
【问题描述】:

昨天我开始使用带有 boto 的 Amazon S3,我设置了一个 python 脚本来创建一个存储桶并将图像上传到一个目录中。跑了好几遍,好像没问题。

我不想经常创建存储桶,所以我将我的脚本调整为 get_bucket:

import os
import boto

s3 = boto.connect_s3()
bucket = s3.get_bucket('images')

# Run Selenium test process to create images


for root, dirs, files in os.walk(imagesPath):
for name in files:       
   filename = os.path.join(root, name)
   key = bucket.new_key('{0}/{1}/{2}'.format(revisionNumber, images_process, name)) 
   print "Uploading " + filename + " to Amazon S3"
   key.set_contents_from_filename(filename)
   key.set_acl('public-read')

错误来自key.set_contents_from_filename(filename)这一行

此代码本质上是来自 S3 入门指南的 boto 示例代码,我已将其放入循环中。我认为问题在于第一次做事情很棒,但不够强大,无法应对覆盖等问题。我是否需要为 boto 提供更多信息而不仅仅是要上传的文件名?

脚本的输出是:

 [exec] Uploading images/Add_Employer_Process/20227M/1.png to Amazon S3
 [exec] Traceback (most recent call last):
 [exec]   File "addEmployerProcess.py", line 121, in <module>
 [exec]     k.set_contents_from_filename(filename)
 [exec]   File "C:\Python26\lib\site-packages\boto\s3\key.py", line 969, inset_contents_from_filename
 [exec]     encrypt_key=encrypt_key)
 [exec]   File "C:\Python26\lib\site-packages\boto\s3\key.py", line 902, inset_contents_from_file
 [exec]     size=size)
 [exec]   File "C:\Python26\lib\site-packages\boto\s3\key.py", line 660, insend_file
 [exec]     query_args=query_args)
 [exec]   File "C:\Python26\lib\site-packages\boto\s3\connection.py", line 449, in make_request
 [exec]     override_num_retries=override_num_retries)
 [exec]   File "C:\Python26\lib\site-packages\boto\connection.py", line 829, in make_request
 [exec]     return self._mexe(http_request, sender, override_num_retries)
 [exec]   File "C:\Python26\lib\site-packages\boto\connection.py", line 794, in _mexe
 [exec]     raise e
 [exec] socket.error: [Errno 10054] An existing connection was forcibly closed by the remote host

我对这一切都是新手,包括 python,所以任何帮助将不胜感激:)

【问题讨论】:

    标签: python amazon-web-services amazon-s3 boto


    【解决方案1】:

    您的代码看起来不错,尽管有一个不相关的小建议是在您编写文件时设置文件的 ACL 策略,而不是作为一个单独的步骤,如下所示:

    key.set_contents_from_filename(filename, policy='public-read')
    

    我在本地尝试了您的代码,效果很好。我不确定您为什么会收到套接字异常,但真正奇怪的是 boto 应该捕获该异常并自动重试请求。

    获取一些调试日志会很有用。您可以像这样对控制台启用完整的调试日志记录:

    import boto
    boto.set_stream_logger('foo')
    ...
    s3 = boto.connect_s3(debug=2)
    

    这可能会提供有关正在发生的事情的更多信息。

    【讨论】:

    • 谢谢。该 set_acl 是直接从示例代码中取出的。该错误似乎是我设法修复的超时问题,但我现在在家并且不记得修复了。我确实将get_bucket() 更改为lookup(),所以我不确定它的影响。我当然会记下该调试命令,以防出现进一步的问题。谢谢。
    • 顺便说一句,lookup() 实际上调用了 get_bucket()。它们之间的唯一区别是 get_bucket() 如果未找到存储桶并且查找返回 None 则抛出异常。所以看起来应该没有任何区别。
    • 好吧,我会回到 get_bucket() 。我现在可以在代码中看到的唯一区别是我在循环之后添加了time.sleep(2),这就是文件的本地副本被删除的地方。
    猜你喜欢
    • 1970-01-01
    • 2015-03-28
    • 1970-01-01
    • 2014-06-20
    • 1970-01-01
    • 1970-01-01
    • 2016-08-05
    • 2010-11-08
    • 1970-01-01
    相关资源
    最近更新 更多