无法使用boto连接AWS S3桶
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 个回答
这个问题已经有答案了,但我想分享一些对我有帮助的额外信息。请记住,最新的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不是一个存储桶,而是一个键,如果存储桶不存在,你会收到“名称或服务未知”的错误信息。
在主机参数中有个拼写错误。正确的应该是:s3-ap-southeast-1.amazonaws.com
参考资料: 亚马逊的区域和端点
请求访问主机 s3.ap-southeast-1.amazonaws.com
失败了。我这边也无法解决这个问题。请检查你的存储桶设置,确保主机地址是正确的。
可能你的网络连接或者DNS服务器也有问题。你可以尝试在命令行手动ping一下这个主机,看看能不能找到它。或者,试试换一个DNS。
补充:快速搜索一下,似乎这个主机应该是 s3-ap-southeast-1.amazonaws.com
。
在编程中,有时候我们会遇到一些问题,像是代码运行不正常或者出现错误。这种情况下,我们可以去一些技术论坛,比如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)
你还可以使用下面这个方法(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。