S3オブジェクトの一覧を取得するサンプル
まずはAPIを使用してS3オブジェクトの一覧を取得するサンプルを紹介します。
def get_s3_object_list(prefix, bucketName): # S3バケットオブジェクトを取得 s3BucketObj = s3.Bucket(bucketName) # S3オブジェクト一覧を取得 objs = s3BucketObj.meta.client.list_objects_v2(Bucket=bucketName, Prefix=prefix) # エラーハンドリング if not('Contents' in objs): print('対象S3にファイルが存在しないため、処理を終了します。bucketName={0}, folderName={1}'.format(bucketName, prefix)) return [] return objs['Contents']
list_objects_v2のprefixはS3のどの配下のアイテムを取得するかの指定になります。
例えば、Bucketが「SampleBucket」、Prefixが「folder/subfolder/」であれば、「SapmleBucket/folder/subfolder/」配下にあるオブジェクトの一覧を取得します。
他にもオプションを指定することができます。
詳細は公式ドキュメントを参照ください。
オブジェクト一覧は以下のようなjson形式で取得されます。
{ 'ResponseMetadata': { 'RequestId': 'D07A77BCCC49661C', 'HostId': 'QnnXWjHK7XXKoFgBUuPekdmiaZB+6D+YmBy/S9fMNcVlNHNMhSzcWDCDQLCNYSGRlRp+UlnHtKA=', 'HTTPStatusCode': 200, 'HTTPHeaders': { 'x-amz-id-2': 'aZBNQLCNYSGQRcW+6D+YmBy/S9fMNcVllRpnnX+UlHNMhSWjHK7XXKomizDCDnFgBUuPekdHtKA=', 'x-amz-request-id': '761BCCCD07C496A7', 'date': 'Sun, 15 Sep 2019 12:50:46 GMT', 'x-amz-bucket-region': 'ap-northeast-1', 'content-type': 'application/xml', 'transfer-encoding': 'chunked', 'server': 'AmazonS3' }, 'RetryAttempts': 0 }, 'IsTruncated': False, 'Contents': [ { 'Key': 'folder/subfolder/', 'LastModified': datetime.datetime(2019, 9, 15, 12, 22, 13, tzinfo=tzlocal()), 'ETag': '"d41df00b20cd988ecf84e9800998427e"', 'Size': 0, 'StorageClass': 'STANDARD' }, { 'Key': 'folder/subfolder/FileName1.txt', 'LastModified': datetime.datetime(2019, 9, 15, 12, 22, 13, tzinfo=tzlocal()), 'ETag': '"d41df00b20cd988ecf84e9800998427e"', 'Size': 714, 'StorageClass': 'STANDARD' }, { 'Key': 'folder/subfolder/FileName2.txt', 'LastModified': datetime.datetime(2019, 9, 15, 12, 22, 13, tzinfo=tzlocal()), 'ETag': '"d41df00b20cd988ecf84e9800998427e"', 'Size': 714, 'StorageClass': 'STANDARD' } ], 'Name': 'SampleBucket', 'Prefix': 'folder/subfolder/', 'MaxKeys': 1000, 'EncodingType': 'url', 'KeyCount': 2 }
オブジェクトの一覧は、Contents配下に配列として格納されます。
なので、エラーハンドリングでは、json内にContentsのキーがあるかどうかで判定を行っています。
S3オブジェクトリストを1000件以上取得する場合
上記の方法だとS3オブジェクトを最大で1000件までしか取得することができません。
1000件以上取得する場合は、リターン値に含まれる「NextContinuationToken」を使って再びlist_objects_v2を呼び出せばよいです。
# S3オブジェクト一覧を取得
objs = s3BucketObj.meta.client.list_objects_v2(Bucket=bucketName, Prefix=prefix, NextContinuationToken=XXXXXX)
こんな感じでパラメータを追加してみてください。
そうすることでオブジェクトの一覧を続きから取得することができます。