概要
S3の特定のキーを含むオブジェクトのサイズを集計するメモです。
ポイントはコード内にコメントしたので、必要であればご参照ください。
コード
count_s3_objects.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import boto3
client = boto3.client('s3', aws_access_key_id='', aws_secret_access_key='', region_name='')
size = 0
start_after = ''
def getObjectList(size, start_after=''):
next_start = ''
param = {
'Bucket': 'hoge',
# 一部分まででOK
# 2020を含むオブジェクトが取得対象になります
'Prefix': 'access-log/2020',
# 指定したKEYの次から取得するようになる
'StartAfter': start_after
}
# s3.Bucket().objects.all()は非推奨のため、list_objects_v2を使います
# https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html#S3.Client.list_objects_v2
res = client.list_objects_v2(**param)
# オブジェクトがなければContentsは空になります
if 'Contents' in res:
# オブジェクトの数
print('object counts:' + str(len(res['Contents'])))
for con in res['Contents']:
# サイズを加算する
size += con['Size']
next_start = con['Key']
# 一度に1000までしか取得しないため、1000ある場合はTrueになる
# その場合は次の処理で継続して取得する
# Falseの場合は削除し、再帰処理を停止させる
if res['IsTruncated'] == False:
next_start = ''
return size, next_start
# 初回実行
size, start_after = getObjectList(size, start_after)
# 後続がある場合は、再帰処理で取得する
while start_after != '':
print('start_after: ' + start_after)
size, start_after = getObjectList(size, start_after)
# 合計サイズを表示
print('size:' + str(size))