我试图在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
send_file中的C:\Users\username\AppData\Local\Continuum\Anaconda\lib\site-packages\boto\s3\key.pyc
(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)
_send_file_internal中的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
(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):_mexe中的C:\Users\username\AppData\Local\Continuum\Anaconda\lib\site-packages\boto\connection.pyc
(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]现有连接被强行关闭 远程主机
答案 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个文件进入大型上传,没有任何问题。