ข้อกำหนดปัญหา: ใช้ไลบรารี 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 — โค้ดข้างต้นได้แก้ไขให้ถูกต้องแล้ว