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

13
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个回答

42

你也可以使用以下方式(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)
这样,您就不必关心完整主机名的“精确”端点。是的,就像@garnaat提到的那样,使用最新的boto API。

我正在使用最新的boto,连接也正常,但是在连接后获取bucket需要很长时间,并返回socket.gaierror: [Errno -2] Name or service not known。 - MONTYHS
你能否实际对该端点进行ping测试?ping s3-ap-southeast-1.amazonaws.com - Rico
谢谢 Rico,因为你的“连接到区域”函数,问题已经解决了。 - MONTYHS
@Rico- 我该如何将你的代码整合到我的程序中,以连接到另一个AWS账户中的不同S3存储桶,并在解密后上传文件。 - asur

4
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)

接受的答案对我没用,但这个可以。谢谢! - bartgras

1

1
对主机s3.ap-southeast-1.amazonaws.com的请求失败了。 我也无法从我的端解决它。 请检查您的存储桶设置以获取正确的主机。
您的互联网连接或DNS服务器可能也存在问题。 尝试从命令行手动ping主机并查看是否解析。 或者,尝试使用不同的DNS。
编辑:快速搜索表明主机可能是s3-ap-southeast-1.amazonaws.com

你是否检查了存储桶设置,确认你使用的主机是正确的? - vivekagr
正确的端点是s3-ap-southeast-1.amazonaws.com。我检查了最新版本的boto,这就是使用的端点,所以您必须有一个旧版本,其中s3端点定义存在错误。您能否更新到最新版本的boto? - garnaat
最新版本是2.27.0。2.9.0已经发布11个月了。 - garnaat

1
问题已经得到解答,但我想补充一些有用的信息。请注意,最新的boto是boto3,但我被困在使用Python 2.7的传统环境中。 身份验证 至少有三种方法可以使用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:顶层/下一级/对象。我尝试像这样访问它:

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

重点是,next-level不是一个桶(bucket),而是一个关键字(key),如果该桶不存在,您将收到“名称或服务未知”的消息。

0

小技巧:捕获以太网链路上的流量,并确保 DNS 查询中的 CNAME 不包含 '\r' 字符,例如在存储桶名称中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接