如何检查S3存储桶最后一次更新的时间?

时间:2016-03-18 20:42:44

标签: python amazon-web-services amazon-s3 boto aws-cli

S3存储桶是否有关于上次更新时间的信息?如何查找存储桶中任何对象的最后时间?

4 个答案:

答案 0 :(得分:6)

存储桶last modified time无原生支持。我这样做的方法是使用aws cli,对输出进行排序,获取底线并打印前两个字段。

$ aws s3 ls mybucket --recursive | sort | tail -n 1 | cut -d ' ' -f1,2
2016-03-18 22:46:48

答案 1 :(得分:1)

推荐,tl; dr

在编写基于简单性测试的时间时,对于执行简单的命令的最佳折衷方案是aws s3 ls --recursive(选项2)


获取最后修改的对象的三种方法

1。使用s3cmd

(请参见s3cmd Usage,或在installing之后使用sudo pip install s3cmd浏览手册页)

s3cmd ls s3://the-bucket | sort| tail -n 1

2。使用AWS CLI的s3

aws s3 ls the-bucket --recursive --output text | sort | tail -n 1 | awk '{print $1"T"$2","$3","$4}'

(请注意,上面的awk是指GNU awk。如果需要安装它以及macOS上的任何其他GNU实用程序,请参见this


3。使用AWS CLI的s3api

(带有list-objectslist-objects-v2

aws s3api list-objects-v2 --bucket the-bucket | jq  -r '.[] | max_by(.LastModified) | [.Key, .LastModified, .Size]|@csv'

请注意,这两个s3api命令都是分页的,处理分页是列表对象v2中的fundamental improvement

如果存储桶中有1000个以上的对象(使用s3cmd du "s3://ons-dap-s-logs" | awk '{print $2}'获取对象数),则您需要处理API的分页并进行多次调用以获取自返回的结果中,sort orderUTF-8 binary order,而不是“最后修改时间”。


性能比较

这里是对相同存储桶执行的上述三种方法的简单性能比较。为简单起见,存储桶中的对象少于1000个。这是查看执行时间的一面文字:

export bucket_name="the-bucket" && \
( \
time ( s3cmd     ls --recursive           "s3://${bucket_name}"             | awk '{print $1"T"$2","$3","$4}' | sort | tail -n 1                       ) & ; \
time ( aws s3    ls --recursive           "${bucket_name}"    --output text | awk '{print $1"T"$2","$3","$4}' | sort | tail -n 1                       ) & ; \
time ( aws s3api list-objects-v2 --bucket "${bucket_name}"                  | jq  -r '.[] | max_by(.LastModified) | [.LastModified, .Size, .Key]|@csv' ) & ; \
time ( aws s3api list-objects    --bucket "${bucket_name}"                  | jq  -r '.[] | max_by(.LastModified) | [.LastModified, .Size, .Key]|@csv' ) &
) >! output.log

({output.log将存储每个命令列出的最后修改的对象)

上面的输出如下:

( s3cmd ls --recursive ...)      1.10s user 0.10s system 79% cpu 1.512 total
( aws s3 ls --recursive ...)     0.72s user 0.12s system 74% cpu 1.128 total
( aws s3api list-objects-v2 ...) 0.54s user 0.11s system 74% cpu 0.867 total
( aws s3api list-objects ...)    0.57s user 0.11s system 75% cpu 0.900 total

对于相同数量的返回对象,aws s3api调用的性能明显更高;但是,要处理API的分页还有额外的(脚本)复杂性。

有用的链接: 请参阅Leveraging s3 and s3api以了解aws s3aws s3api

之间的区别

答案 2 :(得分:0)

正如其他人所评论的那样,没有元数据可以存储此信息。您只需要遍历对象即可。

使用boto3执行此操作的代码:

import boto3
from datetime import datetime

def bucket_last_modified(bucket_name: str) -> datetime:
    """
    Given an S3 bucket, returns the last time that any of its objects was
    modified, as a timezone-aware datetime.
    """
    s3 = boto3.resource('s3')
    bucket = s3.Bucket(bucket_name)
    objects = list(bucket.objects.all())
    return max(obj.last_modified for obj in objects)

答案 3 :(得分:-1)

关于GET BUCKET对象版本的Amazon S3 API规范(可在:http://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGETVersion.html获得)表示返回了LastModified属性 - 但我不确定它是否会针对每个对象更新更新...