Windows上的Boto文件上传到S3失败[错误号:10054]

时间:2014-05-14 03:44:18

标签: python amazon-s3 boto

我试图在Windows 7计算机上使用boto将文件上传到S3,但我一直收到错误 [Errno 10054] An existing connection was forcibly closed by the remote host

我与S3交互的代码如下所示

from boto.s3.connection import S3Connection
from boto.s3.key import Key

conn = S3Connection(Access_Key_ID, Secret_Key)
bucket = conn.lookup(bucket_name)

k = Key(bucket)
k.key = 'akeynameformyfile'
k.set_contents_from_filename(source_path_of_file_to_upload)

使用AWS CLI使用以下命令

在同一台计算机上上传工作正常
aws s3 cp filename.exe s3://bucketname/ttt

该文件约为200MB

我的操作系统是Windows 7,python正在通过anaconda运行,所有包都是最新的。 Boto是版本2.25

此代码在同一网络上的CentOS框中运行良好。这是一个Windows问题吗?

非常感谢任何帮助 谢谢! ç

调试输出

  

发送:' HEAD / HTTP / 1.1 \ r \ n主机:   ACCESS_KEY_ID.test7.s3.amazonaws.com \ r \ nAccept编码:   身份\ r \ n日期:2014年5月14日星期三22:44:31 GMT \ r \ n内容 - 长度:   0 \ r \ n授权:AWS ACCESS_KEY_ID:SOME_STUFF = \ r \ n用户代理:   宝途/ 2.25。 0 Python / 2.7.5 Windows / 7 \ r \ n \ r \ n'
  回复:' HTTP / 1.1 307临时重定向\ r \ n'
  header:x-amz-request-id:8A3D34FB0E0FD8E4
  header:x-amz-id-2:   PwG9yzOVwxy21LmcpQ0jAaMchG0baCrfEhAU9fstlPUI307Qxth32uNAOVv72B2L
  标题:位置:   https://ACCESS_KEY_ID.test7.s3-ap-southeast-2.amazonaws.com/
  header:Content-Type:application / xml
  header:Transfer-Encoding:chunked
  标题:日期:2014年5月14日星期三格林尼治标准时间22:44:31   标题:服务器:AmazonS3
  发送:' HEAD / HTTP / 1.1 \ r \ n主机:   ACCESS_KEY_ID.test7.s3-ap-southeast-2.amazonaws.com \ r \ nAccept编码:   身份\ r \ n日期:我们d,2014年5月14日22:44:31 GMT \ r \ n内容 - 长度:   0 \ r \ n授权:AWS ACCESS_KEY_ID:SOME_STUFF = \ r \ n \ nUser-Ag ent:   Boto / 2.25.0 Python / 2.7.5 Windows / 7 \ r \ n \ r \ n'
  回复:' HTTP / 1.1 200 OK \ r \ n'
  header:x-amz-id-2:   erataRIpbOrEwOU72VUAqU9AGJ4 / kX5z1 / UD7rJQy9laKDgOyTyVKABMab8f6wGN
  header:x-amz-request-id:2A7BECC45C9BAE7A
  标题:日期:2014年5月14日星期三格林尼治标准时间22:44:33   header:Content-Type:application / xml
  header:Transfer-Encoding:chunked
  标题:服务器:AmazonS3
  发送:' PUT / akeynameformyfile HTTP / 1.1 \ r \ nHost:   ACCESS_KEY_ID.test7.s3.amazonaws.com \ r \ nAccept编码:   身份\ r \ nContent   -Length:242642944 \ r \ nContent-MD5:xYOiNcyFKGY1Y / HsYwHQeg == \ r \ n \ n \ n期望:100-Continue \ r \ n日期:2014年5月14日星期三22:44:33 GMT \ r \ n用户代理:   Boto / 2.25.0 Python / 2.7.5 Windows / 7 \ r \ n内容类型:   application / octet-stream \ r \ n授权:AWS   ACCESS_KEY_ID:pWs3KwRv9Q5wDnz4dHD3JwvCy / W = \ r \ n \ r \ n'

     

----------------------------------------------- ----------------------------错误追溯(最近的电话   最后一个)
   in()

 12 k = Key(bucket)                                                                                                            
 13 k.key = 'akeynameformyfile'                                                                                                
     

---> 14 k.set_contents_from_filename(full_path_of_file_to_upload)
                                                                                                                                      C:\ Users \用户名\ AppData \本地\连续\蟒蛇\ LIB \站点包\博托\ S3 \ key.pyc   在set_contents_from_filename中(sel f,filename,headers,replace,cb,   num_cb,policy,md5,reduced_redundancy,encrypt_key)
  1313 num_cb,政策,   md5,1314
  reduced_redundancy,

     

- > 1315 encrypt_key = encrypt_key)
  1316
  1317 def set_contents_from_string(self,string_data,headers = None,   取代=真,
                                                                                                                                      C:\ Users \用户名\ AppData \本地\连续\蟒蛇\ LIB \站点包\博托\ S3 \ key.pyc   在set_contents_from_file中(self,f p,headers,replace,cb,num_cb,   policy,md5,reduced_redundancy,query_args,encrypt_key,size,   倒带)1244
  self.send_file(fp,headers = headers,cb = cb,num_cb = num_cb,
  1245 query_args = query_args,

     

- > 1246 chunked_transfer = chunked_transfer,size = size)1247

     

返回写入的字节数。 1248返回self.size

                                                                                                                                C:\Users\username\AppData\Local\Continuum\Anaconda\lib\site-packages\boto\s3\key.pyc
     send_file中的

(self,fp,headers,c b,num_cb,query_args,   chunked_transfer,size)

723         self._send_file_internal(fp, headers=headers, cb=cb, num_cb=num_cb,                                                
724                                  query_args=query_args,                                                                    
     

- > 725 chunked_transfer = chunked_transfer,size = size)

726                                                                                                                            
727     def _send_file_internal(self, fp, headers=None, cb=None, num_cb=10,                                                    
                                                                                                                                C:\Users\username\AppData\Local\Continuum\Anaconda\lib\site-packages\boto\s3\key.pyc
     _send_file_internal中的

(self,fp,headers,cb,num_cb,query_args,   chunked_transfer,size,hash_algs)

912             headers,                                                                                                       
913             sender=sender,                                                                                                 
     

- > 914 query_args = query_args
      915)
      916 self.handle_version_headers(resp,force = True)
                                                                                                                                      C:\ Users \用户名\ AppData \本地\连续\蟒蛇\ LIB \站点包\博托\ S3 \ connection.pyc   在make_request中(self,meth od,bucket,key,headers,data,query_args,   sender,override_num_retries,retry_handler)

631             data, host, auth_path, sender,                                                                                 
632             override_num_retries=override_num_retries,                                                                     
     

- > 633 retry_handler = retry_handler
      634)
                                                                                                                                      C:\ Users \用户名\ AppData \本地\连续\蟒蛇\ LIB \站点包\博托\ connection.pyc   在make_request中(self,method,path,headers,data,host,auth_path,   sender,override_num_retries,params,retry_handler)
  1028参数,   标题,数据,主持人)
  1029返回self._mexe(http_request,发件人,   override_num_retries,

     

- > 1030 retry_handler = retry_handler)1031
  1032 def close(self):

                                                                                                                                C:\Users\username\AppData\Local\Continuum\Anaconda\lib\site-packages\boto\connection.pyc
     _mexe中的

(self,request,sende r,override_num_retries,retry_handler)

905                 if callable(sender):                                                                                       
906                     response = sender(connection, request.method, request.path,                                         
     

- > 907 request.body,request.headers)

908                 else:                                                                                                      
909                     connection.request(request.method, request.path,                                                       
                                                                                                                                C:\Users\username\AppData\Local\Continuum\Anaconda\lib\site-packages\boto\s3\key.pyc
     发件人中的

(http_conn,方法,路径,数据,标题)

813                     http_conn.send('\r\n')                                                                                 
814                 else:                                                                                                      
     

- > 815 http_conn.send(chunk)
      蒸煮器中的alg为816:
      817个沼气池[alg] .update(chunk)
                                                                                                                                      C:\ Users \ username \ AppData \ Local \ Continuum \ Anaconda \ lib \ httplib.pyc in   发送(自我,数据)
      803数据块= data.read(blocksize)
      804否则:
   - > 805 self.sock.sendall(data)
      806个
      807 def _output(self,s):
                                                                                                                                      C:\ Users \ username \ AppData \ Local \ Continuum \ Anaconda \ lib \ ssl.pyc in   sendall(自我,数据,旗帜)
      227计数= 0
      228(while< amount):
   - > 229 v = self.send(data [count:])
      230计数+ = v
      231返还金额
                                                                                                                                      C:\ Users \ username \ AppData \ Local \ Continuum \ Anaconda \ lib \ ssl.pyc in   发送(自我,数据,标志)
      196同时为真:
      197尝试:
   - > 198 v = self._sslobj.write(data)
      199除了SSLError,x:
      200,如果x.args [0] == SSL_ERROR_WANT_READ:
                                                                                                                                      错误:[Errno 10054]现有连接被强行关闭   远程主机

3 个答案:

答案 0 :(得分:6)

@garnaat在上面的评论中提出了一个建议,为我解决了这个问题。谢谢!! 出于某种原因,连接到通用端点然后尝试专门上载到ap-southeast-2 S3端点失败。但是如果我们使用connect_to_region函数来启动连接并指定我们想要的端点,那么一切正常!再次感谢,以及下面的工作示例。

from boto.s3 import connect_to_region
from boto.s3.connection import Location
from boto.s3.key import Key

conn = connect_to_region(Location.APSoutheast2,
                         aws_access_key_id=conf.Access_Key_ID,
                         aws_secret_access_key=conf.Secret_Key)
bucket = conn.lookup(bucket_name) # bucket is located in Location.APSoutheast2

k = Key(bucket)
k.key = 'akeynameformyfile'
k.set_contents_from_filename(source_path_of_file_to_upload)

答案 1 :(得分:0)

set_contents_from_filename接受一个字符串作为S3上文件的源。您正在尝试上传现有文件。尝试使用set_contents_from_file指定要上载的现有文件。否则,请将该文件的内容作为字符串传递给set_contents_from_filename。

答案 2 :(得分:0)

以上所有答案都提供了技术解决方案,但我对此的第一次体验表明这是一个环境问题。

我的代码与原始问题基本相同。我第一次运行它时没有遇到任何问题,然后昨晚遇到了同样的错误信息。我找到了这个答案和许多其他人,但决定,因为它(我的代码)第一次工作得很好(上传的文件超过20K)我可能在我的机器上遇到问题或AWS是源(和/或可能是某些点)之间)。

我关闭了电脑,回家了,当我今天早上重新启动时,原始代码运行正常。

让我得出这个结论的一个观察结果是,当我在寻找答案的时候,我注意到很多关于这个问题的帖子似乎都在同一时间发生。这让我想到AWS可能有问题。同样,我无法确定它是我的计算机,AWS服务器还是某些流量点 - 介于原来的代码之后,当我今天早上再次使用它时,原始代码运行正常。

以下是我正在使用的代码(因为您可以看到与原始问题中的代码非常相似)

import boto
import glob
AWS_KEY = "mykey"
AWS_SECRET = "mySecret"
bucket_name = "myBucket"
numbers = [x for x in range(0,20000,500)]
to_upload = glob.glob('E:\MTurkTablesSelected\\*.htm')

s3 = boto.connect_s3(aws_access_key_id = AWS_KEY, aws_secret_access_key = AWS_SECRET)
bucket = s3.get_bucket(bucket_name)
for n, file_path in enumerate(to_upload):
    upload_key = file_path.split('\\')[-1]
    key = bucket.new_key(upload_key)
    key.set_contents_from_filename(file_path)
    key.set_acl('public-read')
    if n in numbers:
        print n

我现在有超过10,000个文件进入大型上传,没有任何问题。