如何使用boto获取S3密钥的创建日期?

时间:2015-01-02 18:26:59

标签: amazon-web-services amazon-s3 boto

Boto的S3 Key对象包含last_modified日期(通过parse_ts很好地提供,感谢@Gaarnat!)但是base_field" date" (即ctime)似乎无法访问,即使它已在key.base_fields中列出。

根据http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingMetadata.html处的表格,它似乎总是自动创建(我无法想象它不会出现的原因)。它可能只是在对象属性中找到它的一个简单问题,但到目前为止我还没有找到它,尽管我确实找到了包含' date&#39的base_fields属性。 ;。 (他们只是一套,似乎没有可用的方法,我也无法找到有关检查方法的文件。)

  

例如,Amazon S3维护对象创建日期和大小元数据,并将此信息用作对象管理的一部分。

有趣的是,尽管last_modified可见,但create_time(系统元数据字段"日期"在上面的链接中)也未显示在AWS S3控制台中。

4 个答案:

答案 0 :(得分:2)

经过进一步研究后,似乎从list()返回的S3密钥对象可能不包含此元数据字段!

  

迭代器返回的Key对象是通过解析存储桶上的GET结果获得的,也称为列表对象请求。 此请求返回的XML仅包含有关每个密钥的信息的子集。 XML中不提供某些元数据字段,如Content-Type和用户元数据。因此,如果您需要这些额外的元数据字段,则必须对存储桶中的密钥执行HEAD请求。 (docs

换句话说,循环键:

for key in conn.get_bucket(bucket_name).list():
     print key.date

... 返回包含创建日期和其他一些系统元数据的完整密钥。 (例如,它也缺少ACL数据)。

相反,要检索完整的密钥元数据,请使用以下方法:

key = bucket.get_key(key.name)
print key.date

这需要额外的HTTP请求,因为文档明确说明了上述内容。(另请参阅my original issue report。)

其他代码详情:

import boto

# get connection
conn = boto.connect_s3()

# get first bucket
bucket = conn.get_all_buckets()[0]

# get first key in first bucket
key = list(bucket.list())[0]

# get create date if available
print getattr(key, "date", False)
# (False)

# access key via bucket.get_key instead:
k = bucket.get_key(key.name)

# check again for create_date
getattr(k, "date", False)
# 'Sat, 03 Jan 2015 22:08:13 GMT'
# Wait, that's the current UTC time..?

# Also print last_modified...
print k.last_modified
# 'Fri, 26 Apr 2013 02:41:30 GMT'

答案 1 :(得分:2)

回答旧问题,以防其他人遇到相同问题。

  

Amazon S3仅维护每个对象的最后修改日期。   例如,Amazon S3控制台在对象“属性”窗格中显示“上次修改日期”。最初创建新对象时,该日期反映了创建对象的日期。如果更换对象,则日期会相应更改。因此,当我们使用术语创建日期时,它与术语上次修改日期同义。

参考:https://docs.aws.amazon.com/AmazonS3/latest/dev/intro-lifecycle-rules.html

答案 2 :(得分:0)

我建议使用 key.last_modified,因为key.date似乎在您上次查看文件时返回
像这样:

key = bucket.get_key(key.name)
print(key.last_modified)

答案 3 :(得分:0)

如果您为 S3 存储桶启用了版本控制,您可以使用 list_object_versions 并找到您要查找的对象的最小日期,该日期应该是它的创建日期