Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

วิธีใช้ Boto3 แบ่งหน้า (Paginate) ผ่าน Multipart Upload Objects ของ S3 Bucket ใน AWS Glue

ข้อกำหนดปัญหา: ใช้ไลบรารี boto3 ใน Python เพื่อแบ่งหน้าผ่าน multipart upload objects ของ S3 bucket จาก AWS Glue Data Catalog

ขั้นตอนการแก้ปัญหา

  • ขั้นตอน 1: นำเข้า boto3 และ botocore.exceptions

  • ขั้นตอน 2: พารามิเตอร์: bucket_name (บังคับ), prefix_name, max_items, page_size, starting_token (เลือกได้)

    • Prefix_name: โฟลเดอร์ย่อยที่ต้องการแบ่งหน้า
    • max_items: จำนวนระเบียนสูงสุดที่ต้องการคืน หากมากกว่านี้จะมี NextToken สำหรับดึงต่อ
    • page_size: ขนาดของแต่ละหน้า
    • starting_token: ใช้ Marker จาก response ก่อนหน้าเพื่อดึงหน้าต่อไป

  • ขั้นตอน 3: สร้าง AWS session ด้วย boto3 พร้อมระบุ region_name

  • ขั้นตอน 4: สร้าง AWS client สำหรับ S3

  • ขั้นตอน 5: สร้าง paginator object ด้วย list_multipart_uploads

  • ขั้นตอน 6: เรียก paginate พร้อมส่ง PaginationConfig และพารามิเตอร์ต่างๆ

  • ขั้นตอน 7: คืนค่าระเบียนตาม max_items และ page_size

  • ขั้นตอน 8: จัดการข้อยกเว้นทั่วไป

โค้ดตัวอย่าง

import boto3
from botocore.exceptions import ClientError

def paginate_through_multipart_upload_s3_bucket(bucket_name, prefix_name=None, max_items=None, page_size=None, starting_token=None):
    session = boto3.session.Session()
    s3_client = session.client('s3')
    try:
        paginator = s3_client.get_paginator('list_multipart_uploads')
        response = paginator.paginate(
            Bucket=bucket_name,
            Prefix=prefix_name,
            PaginationConfig={
                'MaxItems': max_items,
                'PageSize': page_size,
                'StartingToken': starting_token
            }
        )
        return response
    except ClientError as e:
        raise Exception("boto3 client error in paginate_through_multipart_upload_s3_bucket: " + e.__str__())
    except Exception as e:
        raise Exception("Unexpected error in paginate_through_multipart_upload_s3_bucket: " + e.__str__())

a = paginate_through_multipart_upload_s3_bucket('s3-test-bucket', 'testfolder', 2, 5)
print(*a)

ผลลัพธ์

{'ResponseMetadata': {'RequestId': 'YA9CGTAAX', 'HostId': '8dqJW******************', 'HTTPStatusCode': 200, 'HTTPHeaders': {'x-amz-id-2': '8dqJW*********************', 'x-amz-request-id': 'YA9CGTAAX', 'date': 'Sat, 03 Apr 2021 08:16:05 GMT', 'content-type': 'application/xml', 'transfer-encoding': 'chunked', 'server': 'AmazonS3'}, 'RetryAttempts': 0}, 'Bucket': 's3-test-bucket', 'KeyMarker': '', 'UploadIdMarker': '', 'NextKeyMarker': '', 'Prefix': 'testfolder', 'NextUploadIdMarker': '', 'MaxUploads': 5, 'IsTruncated': False, 'Uploads': [{'UploadId': 'YADF**************LK25', 'Key': 'testfolder/testfilemultiupload.csv', 'Initiated': datetime(2021,1,2), 'StorageClass': 'STANDARD', 'Owner': {'DisplayName': 'AmazonServicesJob', 'Id': '********************'}}, 'CommonPrefixes': None}

หมายเหตุ: โค้ดต้นฉบับใช้ list_objects แทน list_multipart_uploads — โค้ดข้างต้นได้แก้ไขให้ถูกต้องแล้ว