特定の拡張子に限定した取得
S3のlist_objects_v2オペレーションではダウンロード対象のフィルタリングはPrefixを用いた前方一致のみ可能で、中間一致や後方一致はできません。
そのため、拡張子で絞り込んでダウンロードする場合には、ファイル保存時にオブジェクトのキーを /.../zip/file.zip などのようにprefixで拡張子を絞り込めるようにしておく必要があります。
ただし、ダウンロード後にプログラム内で絞り込みすることは可能で、例えば
result = client.list_objects(Bucket=Bucket)
objects = result['Contents']
zip_objects = [obj for obj in objects if obj['Key'].endswith('.zip')]
などと書くことができます。
あくまでローカルでの絞り込みですので、例えばバケットに全部で1000件あってzipが1件の場合、1000件ともダウンロードしてから1件だけzip_objectsに代入する、という挙動になるので十分ご注意ください
更新日時の取得・ソート
result = client.list_objects(Bucket=Bucket)
objects = result['Contents']
# 先頭のオブジェクトの更新日時
last_modified = objects[0]['LastModified']
# 更新日時(古い順)でソートしたオブジェクトのlist
oldest_objects = sorted(objects, key= lambda obj: obj['LastModified'])
などと書くことができます
更新日時の古いものから削除し、ファイル数を1にする
result = client.list_objects(Bucket=Bucket)
objects = result['Contents']
# 更新日時(古い順)でソートしたオブジェクトのlist
oldest_objects = sorted(objects, key=lambda obj: obj['LastModified'])
# 削除対象のオブジェクト
target_objects = oldest_objects[:-1]
# 削除
client.delete_objects(
Bucket=Bucket,
Delete={
'Objects': [{'Key': obj['Key']} for obj in target_objects]
}
)
などと書くことができます
https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html#S3.Client.delete_objects
補足
-
list_objectsは古いバージョンのメソッドで、不具合があるわけではありませんが現在非推奨となっていますので、list_objects_v2を使うことにも是非挑戦してみてください
- boto3には
高レベルAPIと呼ばれるメソッドもあり、今回のケースであればそちらを使ったほうが扱いやすいかもしれません。こちらも余裕があればぜひ挑戦してみてください。