获取 boto.exception.S3ResponseError: S3ResponseError: 400 错误请求异常
我正在尝试使用boto下载存储在S3桶里的日志文件。我不想用s3cmd和其他工具的原因是,我希望我的代码不依赖于某种软件或工具,这样其他人也可以直接使用我的代码,而不必担心下载其他依赖项。
我遇到了以下错误信息。我看过很多相关的帖子,但没有一个能解决我的问题。
Traceback (most recent call last):
File "/Library/Python/2.7/site-packages/fabric/main.py", line 743, in main
*args, **kwargs
File "/Library/Python/2.7/site-packages/fabric/tasks.py", line 405, in execute
results['<local-only>'] = task.run(*args, **new_kwargs)
File "/Library/Python/2.7/site-packages/fabric/tasks.py", line 171, in run
return self.wrapped(*args, **kwargs)
File "/pgbadger/pgbadger_html.py", line 86, in dlogs
s3 = S3()
File "/pgbadger/pgbadger_html.py", line 46, in __init__
self.bucket = self._get_bucket(self.log_bucket)
File "/pgbadger/pgbadger_html.py", line 65, in _get_bucket
return self.s3_conn.get_bucket(bucket)
File "/Library/Python/2.7/site-packages/boto/s3/connection.py", line 471, in get_bucket
return self.head_bucket(bucket_name, headers=headers)
File "/Library/Python/2.7/site-packages/boto/s3/connection.py", line 518, in head_bucket
response.status, response.reason, body)
boto.exception.S3ResponseError: S3ResponseError: 400 Bad Request
我看过代码,但我不知道为什么会出现这个错误。我的代码如下:
from fabric.api import task
from fabric.api import env
S3_LOG_BUCKET = BUCKET-NAME
class S3(object):
s3_conn = None
log_bucket = S3_LOG_BUCKET
region = region
bucket = None
env.host_string = REGION-NAME
def __init__(self):
self._s3_connect()
self.bucket = self._get_bucket(self.log_bucket)
def _s3_connect(self):
if not self.s3_conn:
self.s3_conn = boto.s3.connect_to_region(
self.region,
aws_access_key_id=AWS_ACCESS_KEY_ID,
aws_secret_access_key=AWS_SECRET_ACCESS_KEY,
)
if not self.s3_conn:
raise ValueError('Invalid Region Name: {}'.format(region))
def download_s3_logs(self):
for l in self.bucket.list():
key_string = str(l.key)
l.get_contents_to_filename("/tempLogFiles/" + key_string)
print l.key
def _get_bucket(self, bucket):
return self.s3_conn.get_bucket(bucket)
@task
def dlogs():
s3 = S3()
s3.download_s3_logs()
1 个回答
0
问题解决了:在我的S3日志存储桶中,我之前提到的是我存储桶的完整路径。比如说,我有一个存储桶,里面有多个文件夹。所以我一直在提到完整的路径,但BOTO(一个用来和AWS服务交互的工具)并不需要这样做。因此,我只需要提到存储桶的名称,而不是整个路径。
之前我做的是-->
log_bucket = Bucket/Inner Folder 1/Inner Folder 2/.../ which was wrong
正确的做法是-->
log_bucket = Bucket