获取 boto.exception.S3ResponseError: S3ResponseError: 400 错误请求异常

2 投票
1 回答
4102 浏览
提问于 2025-04-18 16:21

我正在尝试使用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

撰写回答