如何绕过boto3函数,不允许在存储桶名称中使用大写字母?

时间:2019-01-14 17:04:41

标签: python amazon-s3 boto3 boto

我需要从存储桶中获取s3键的列表。我有一个非常适合boto3的脚本。问题是我正在使用的存储桶名称具有大写字母,并且boto3引发了错误。

在查看connect to bucket having uppercase letter时,它使用了boto,但我想使用boto3,但是OrdinaryCallingFormat()似乎不是boto3的选择。

或者,我可以修改脚本以使其适用于boto,但是我不确定如何做到这一点。我尝试过:

s3 = boto.connect_s3(aws_access_key_id,aws_secret_access_key, 
calling_format = OrdinaryCallingFormat())

Bucketname = s3.get_bucket('b-datasci/x-DI-S')

但是出现错误boto.exception.S3ResponseError: S3ResponseError: 404 Not Found.

尝试:

    conn = boto.s3.connect_to_region('us-east-1',
   aws_access_key_id=AWS_ACCESS_KEY_ID,
   aws_secret_access_key=AWS_SECRET_ACCESS_KEY,               
   calling_format = boto.s3.connection.OrdinaryCallingFormat(),
   )
    bucket = conn.get_bucket(Bucketname)

我得到了错误:xml.sax._exceptions.SAXParseException: <unknown>:1:0: no element found

如何使它与boto一起使用,或者将OrdinaryCallingFormat()集成到boto3中以列出密钥?

2 个答案:

答案 0 :(得分:0)

问题不是大写字符。是斜线。

存储桶名称必须与此正则表达式匹配:

^[a-zA-Z0-9.\-_]{1,255}$

要列出存储区“ mybucket”中带有前缀“ b-datasci / x-DI-S”的对象,您的级别太低了。改用它:

import boto3
client = boto3.client('s3')
for obj in client.list_objects_v2(Bucket="mybucket", Prefix="b-datasci/x-DI-S"):
    ...

答案 1 :(得分:0)

@John Rotenstein指出,所有存储桶名称必须符合DNS,因此存储桶名称不允许使用直接斜杠。

  

实际上,当我添加此代码时,上面的第二段代码确实起作用:   输入bucket.get_all_keys(prefix ='s-DI-S /',delimiter ='/')并输入   桶名称的真正前缀是什么。

从以上OP注释来看,似乎OP可能误解了带有文件目录系统的S3对象存储。每个s3对象都不会以层次结构格式存储。所谓的“前缀”只是一个文本过滤器,它检索对象名称,该名称在对象名称中包含相似的“前缀”。

在OP中,有一个存储桶名称调用b-datasci,而在存储桶下方存储着许多带有前缀x-DI-S的对象。

此外,delimiterget_all_keys的使用不是OP的想法。如果您查看Listing Keys Hierarchically Using a Prefix and Delimiter上的AWS文档,您将了解它只是辅助过滤器。即

  

prefix和delimiter参数限制列表操作返回的结果类型。前缀将结果限制为仅以指定前缀开头的那些键,并且定界符使列表将共享公共前缀的所有键汇总到单个摘要列表结果中。

p / s:OP应该使用boto3,因为AWS不赞成使用boto 2年以上。