2016-11-07 54 views
0

你好我试图用博托2.43到Python连接到S3在法兰克福地区,我想打印区名称内容... 以下是我的代码:Python的博托连接到S3投掷的错误

from boto.s3.connection import S3Connection 
hostname='s3.eu-central-1.amazonaws.com' 
conn = S3Connection(aws_access_key_id,aws_secret_access_key, host=hostname) 
bucket_name = conn.get_bucket('jd-eu01-isg-analytics-data-from-us01', validate=False) 
for key in bucket_name.list(prefix='EU_Scripts_For_Frankfurt/'): 
    print key 
    continue 

当我执行它时,会抛出以下错误:

File "/usr/lib/python2.7/site-packages/boto/s3/bucketlistresultset.py", line 34, in bucket_lister 
    encoding_type=encoding_type) 
    File "/usr/lib/python2.7/site-packages/boto/s3/bucket.py", line 473, in get_all_keys 
    '', headers, **params) 
    File "/usr/lib/python2.7/site-packages/boto/s3/bucket.py", line 399, in _get_all 
    query_args=query_args) 
    File "/usr/lib/python2.7/site-packages/boto/s3/connection.py", line 668, in make_request 
    retry_handler=retry_handler 
    File "/usr/lib/python2.7/site-packages/boto/connection.py", line 1071, in make_request 
    retry_handler=retry_handler) 
    File "/usr/lib/python2.7/site-packages/boto/connection.py", line 927, in _mexe 
    request.authorize(connection=self) 
    File "/usr/lib/python2.7/site-packages/boto/connection.py", line 377, in authorize 
    connection._auth_handler.add_auth(self, **kwargs) 
    File "/usr/lib/python2.7/site-packages/boto/auth.py", line 727, in add_auth 
    **kwargs) 
    File "/usr/lib/python2.7/site-packages/boto/auth.py", line 546, in add_auth 
    string_to_sign = self.string_to_sign(req, canonical_request) 
    File "/usr/lib/python2.7/site-packages/boto/auth.py", line 486, in string_to_sign 
    sts.append(self.credential_scope(http_request)) 
    File "/usr/lib/python2.7/site-packages/boto/auth.py", line 468, in credential_scope 
    region_name = self.determine_region_name(http_request.host) 
    File "/usr/lib/python2.7/site-packages/boto/auth.py", line 662, in determine_region_name 
    return region_name 
UnboundLocalError: local variable 'region_name' referenced before assignment 

如何解决此问题?这是因为博托版本?任何解决方案请

回答

-1

使用boto3,它更容易。 boto2不被AWS支持,boto已经被弃用,并且不打算使用功能

由于找不到区域而弹出错误。 Boto/boto3 API将检查boto/boto3服务初始化阶段内的区域名称。如果你没有指定它,它会在凭证文件或环境变量(例如〜/ .aws/config)中查找默认区域名称定义。

即使您明确指定了S3端点URL,情况也是如此。如果您不想对凭证,区域名称进行硬编码,则必须按照此处指定的方式设置AWS凭证:credential configuration

使用凭证文件/环境变量制作boto/boto3将使您的代码更加清晰和灵活,例如,你甚至可以在不改变代码的情况下使用STS。例如: -

import boto3 
# You can choose between service resource or service client. 
s3 = boto3.client("s3") 

response = s3.list_objects_v2(
    Bucket="jd-eu01-isg-analytics-data-from-us01", 
    Prefix="EU_Scripts_For_Frankfurt" 
) 

for content in response["Contents"]: 
    print content["Key"] 

尽管如此,你仍然可以通过将参数在初始化博托/ boto3资源硬编码的访问密钥ID,secre_key,区域名称等。 (boto API是类似的)

import boto3 
s3 = boto3.client(
    "s3", 
    region_name = "eu-central-1", 
    aws_access_key_id = 'xxxxxxxx", 
    aws_secret_access_key= = "yyyyyyy")