BBH
-Biz Branding Hub-
投稿日 : 
2019/11/18
更新日 : 
2019/11/18

boto3のS3.getObjectで1000件以上のオブジェクトを取得する方法

S3オブジェクトの一覧を取得するサンプル

まずはAPIを使用してS3オブジェクトの一覧を取得するサンプルを紹介します。

getS3list.py

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形式で取得されます。

response.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)


こんな感じでパラメータを追加してみてください。
そうすることでオブジェクトの一覧を続きから取得することができます。

Profile

管理人プロフィール

都内でITエンジニアをやってます。
変遷:中規模SES→独立系SIer→Webサービス内製開発
使用技術はその時々でバラバラですが、C#、AWSが長いです。
どちらかと言うとバックエンドより開発が多かったです。
顧客との折衝や要件定義、マネジメント(10名弱程度)の経験あり。
最近はJava+SpringBootがメイン。

Recommend