无法使用boto连接aws s3存储桶

时间:2014-03-17 12:41:06

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

AWS_ACCESS_KEY_ID = '<access key>'
AWS_SECRET_ACCESS_KEY = '<my secret key>'
Bucketname = 'Bucket-name' 
import boto
from boto.s3.key import Key
import boto.s3.connection
conn = boto.connect_s3(AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEY,
        host ='s3.ap-southeast-1.amazonaws.com',
        is_secure=True,               # uncommmnt if you are not using ssl
        calling_format = boto.s3.connection.OrdinaryCallingFormat(),
        )
bucket = conn.get_bucket(Bucketname)

错误:

  Traceback (most recent call last):
   File "uploads3.py", line 69, in <module>
    upload_hello_file_s3()
  File "uploads3.py", line 25, in upload_hello_file_s3
    bucket = conn.get_bucket(Bucketname)
  File "/usr/local/lib/python2.7/dist-packages/boto/s3/connection.py", line 431, in get_bucket
    bucket.get_all_keys(headers, maxkeys=0)
  File "/usr/local/lib/python2.7/dist-packages/boto/s3/bucket.py", line 364, in get_all_keys
    '', headers, **params)
  File "/usr/local/lib/python2.7/dist-packages/boto/s3/bucket.py", line 321, in _get_all
    query_args=s)
  File "/usr/local/lib/python2.7/dist-packages/boto/s3/connection.py", line 543, in make_request
    override_num_retries=override_num_retries)
  File "/usr/local/lib/python2.7/dist-packages/boto/connection.py", line 937, in make_request
    return self._mexe(http_request, sender, override_num_retries)
  File "/usr/local/lib/python2.7/dist-packages/boto/connection.py", line 899, in _mexe
    raise e
socket.gaierror: [Errno -2] Name or service not known

请帮我解决这个问题,桶名和访问密钥和密钥没有问题。

6 个答案:

答案 0 :(得分:41)

您还可以使用以下(boto.s3.connect_to_region):

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

AWS_ACCESS_KEY_ID = '<access key>'
AWS_SECRET_ACCESS_KEY = '<my secret key>'
Bucketname = 'Bucket-name' 


conn = boto.s3.connect_to_region('ap-southeast-1',
       aws_access_key_id=AWS_ACCESS_KEY_ID,
       aws_secret_access_key=AWS_SECRET_ACCESS_KEY,
       is_secure=True,               # uncomment if you are not using ssl
       calling_format = boto.s3.connection.OrdinaryCallingFormat(),
       )
bucket = conn.get_bucket(Bucketname)

这样你就不必关心&#39;确切的&#39;具有完整主机名的端点。是的,就像@garnaat提到的那样,使用最新的boto API。

答案 1 :(得分:1)

对主机s3.ap-southeast-1.amazonaws.com的请求失败。我也无法解决这个问题。检查您的存储桶设置是否正确。

您的互联网连接或DNS服务器可能也存在问题。尝试从命令行手动ping主机,看看它是否解析。或者,尝试使用其他DNS。

编辑:快速谷歌搜索表明主机可能是s3-ap-southeast-1.amazonaws.com

答案 2 :(得分:1)

主机参数中存在拼写错误。正确的是:s3-ap-southeast-1.amazonaws.com

参考 Amazon Regions and Endpoints

答案 3 :(得分:1)

from boto3.session import Session

ACCESS_KEY='your_access_key'

SECRET_KEY='your_secret_key'

session = Session(aws_access_key_id=ACCESS_KEY,aws_secret_access_key=SECRET_KEY)

s3 = session.resource('s3')

my_bucket = s3.Bucket('bucket_name')

for s3_file in my_bucket.objects.all():

           print(s3_file.key)

答案 4 :(得分:0)

问题:捕获以太网链路上的流量并确保DNS查询中的CNAME NOT 包含&#39; \ r&#39;字符例如在桶名称中。

答案 5 :(得分:0)

这个问题已经回答,但我想提供一些对我有帮助的其他信息。请记住,最新的boto是boto3,但是我在传统环境中只能使用Python 2.7。

身份验证

至少有3种通过boto进行身份验证的方法:首先,您可以在connect_to_region()调用中包括凭据(访问密钥,秘密密钥)。第二种方法是定义环境变量AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY,然后在connect_to_region()调用中不提供凭证。最后,如果使用boto 2.5.1或更高版本,则boto可以对实例使用IAM角色来创建临时凭据。

对于前两个,您需要使用AWS控制台来创建有权访问存储桶的用户。在第三种方法中,创建一个具有对存储桶访问权限的IAM角色,并将其分配给实例。第三种方法通常是最好的,因为这样就不必在源代码管理中存储凭据,也不必在环境中管理凭据。

访问存储桶

现在我所犯的错误导致了与OP相同的消息。 S3中的顶级对象是存储桶,下面的所有内容都是键。在我的情况下,我要访问的对象位于s3:top / level / next-level / object。我试图这样访问它:

bucket = conn.get_bucket('top-level/next-level')

重点是,下一级不是存储桶而是密钥,如果存储桶不存在,您将收到“名称或服务未知”消息。