无法使用boto连接AWS S3桶

13 投票
6 回答
41750 浏览
提问于 2025-04-17 22:39
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 个回答

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角色,并将其分配给实例。第三种方法通常是最好的,因为这样你就不需要在源代码管理中存储凭证,也不需要在环境中管理凭证。

访问存储桶

接下来是我犯的一个错误,这个错误导致我收到了和提问者一样的错误信息。S3中的顶层对象是存储桶,下面的所有内容都是键。在我的例子中,我想访问的对象位于s3:顶层/下一级/对象。我尝试这样访问它:

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

关键是,next-level不是一个存储桶,而是一个键,如果存储桶不存在,你会收到“名称或服务未知”的错误信息。

1

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

参考资料: 亚马逊的区域和端点

1

请求访问主机 s3.ap-southeast-1.amazonaws.com 失败了。我这边也无法解决这个问题。请检查你的存储桶设置,确保主机地址是正确的。

可能你的网络连接或者DNS服务器也有问题。你可以尝试在命令行手动ping一下这个主机,看看能不能找到它。或者,试试换一个DNS。

补充:快速搜索一下,似乎这个主机应该是 s3-ap-southeast-1.amazonaws.com

4

在编程中,有时候我们会遇到一些问题,像是代码运行不正常或者出现错误。这种情况下,我们可以去一些技术论坛,比如StackOverflow,寻求帮助。在这些论坛上,很多人会分享他们的经验和解决方案。

当你在这些论坛上提问时,最好能把你的问题描述得清楚一些。比如,告诉大家你在做什么,遇到了什么具体的问题,以及你尝试过哪些解决办法。这样,其他人才能更好地理解你的情况,给出有效的建议。

另外,看到别人提问时,大家也可以积极参与,分享自己的看法和解决方案。通过这样的互动,大家都能学到更多的知识,提升自己的编程能力。

总之,技术论坛是一个很好的学习和交流的平台,利用好它,可以帮助我们更快地解决问题,提升技能。

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

撰写回答