Đề bài: Sử dụng thư viện boto3 trong Python để phân trang qua các phiên bản đối tượng (object versions) của một bucket S3 từ AWS Glue Data Catalog được tạo trong tài khoản của bạn.
Cách tiếp cận / Thuật toán
Bước 1: Import boto3 và botocore.exceptions để xử lý ngoại lệ.
Bước 2: max_items, page_size và starting_token là tham số tùy chọn, trong khi bucket_name là bắt buộc.
max_items chỉ định tổng số bản ghi trả về. Nếu số bản ghi có sẵn > max_items, một NextToken sẽ được cung cấp để tiếp tục phân trang.
page_size chỉ định kích thước mỗi trang.
starting_token giúp phân trang, sử dụng NextKeyMarker từ phản hồi trước.
Bước 3: Tạo phiên làm việc AWS bằng boto3. Đảm bảo region_name được cấu hình; nếu không, truyền rõ ràng.
Bước 4: Tạo client AWS cho dịch vụ S3.
Bước 5: Tạo đối tượng paginator chứa chi tiết các phiên bản đối tượng của bucket S3 bằng list_object_versions.
Bước 6: Gọi hàm paginate và truyền max_items, page_size, starting_token như PaginationConfig, bucket_name như Bucket.
Bước 7: Trả về số bản ghi dựa trên max_items và page_size.
Bước 8: Xử lý ngoại lệ chung nếu có lỗi khi phân trang.
Mã ví dụ
Sử dụng mã sau để phân trang qua các phiên bản đối tượng:
import boto3
from botocore.exceptions import ClientError
def paginate_through_object_version_s3_bucket(bucket_name, 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_object_versions')
response = paginator.paginate(
Bucket=bucket_name,
PaginationConfig={
'MaxItems': max_items,
'PageSize': page_size,
'StartingToken': starting_token
}
)
return response
except ClientError as e:
raise Exception("Lỗi client boto3 trong paginate_through_object_version_s3_bucket: " + e.__str__())
except Exception as e:
raise Exception("Lỗi không mong muốn trong paginate_through_object_version_s3_bucket: " + e.__str__())
# Lần chạy 1
a = paginate_through_object_version_s3_bucket('s3-test-bucket', 2, 5)
print(*a)
# Lần chạy 2
for items in a:
next_token = items['NextKeyMarker']
b = paginate_through_object_version_s3_bucket('s3-test-bucket', 2, 5, next_token)
print(*b)
Kết quả
#1st Run
{'ResponseMetadata': {'RequestId': 'XEVY**************CD0', 'HostId': **************, 'HTTPStatusCode': 200, 'HTTPHeaders': {'x-amz-id-2': *******************, 'x-amz-request-id': 'XEVYV***************', 'date': 'Sat, 03 Apr 2021 07:14:49 GMT', 'content-type': 'application/xml', 'transfer-encoding': 'chunked', 'server': 'AmazonS3'}, 'RetryAttempts': 0}, 'IsTruncated': True, 'KeyMarker': '', 'VersionIdMarker': '', 'NextKeyMarker': 'analytics-s3/template.json', 'NextVersionIdMarker': 'null', 'Versions': [{'ETag': '"e66659e02"', 'Size': 1554, 'StorageClass': 'STANDARD', 'Key': 'analytics-s3i/param.json', 'VersionId': 'null', 'IsLatest': True, 'LastModified': datetime.datetime(2020, 10, 29, 19, 50, 55, tzinfo=tzutc()), 'Owner': {'DisplayName': 'AWS.Development', 'ID': '928b5bd**************3d70'}}, {'ETag': '"22a4bf7**************9c1ed2612"', 'Size': 1756, 'StorageClass': 'STANDARD', 'Key': 'analytics-s3i/params.json', 'VersionId': 'null', 'IsLatest': True, 'LastModified': datetime.datetime(2021, 3, 10, 20, 10, 47, tzinfo=tzutc()), 'Owner': {'DisplayName': 'AWS.Development', 'ID': '928b5bde*****************2d4423d70'}}], 'Name': 's3-test-bucket', 'Prefix': '', 'MaxKeys': 5, 'EncodingType': 'url', 'DeleteMarkers': None, 'CommonPrefixes': None}
#2nd Run
{'ResponseMetadata': {'RequestId': '3V9*********703V', 'HostId': ****************, 'HTTPStatusCode': 200, 'HTTPHeaders': {'x-amz-id-2': '************************', 'x-amz-request-id': '3V9****************V', 'date': 'Sat, 03 Apr 2021 07:18:56 GMT', 'content-type': 'application/xml', 'transfer-encoding': 'chunked', 'server': 'AmazonS3'}, 'RetryAttempts': 0}, 'IsTruncated': True, 'KeyMarker': 'analytics-s3i2/template.json', 'VersionIdMarker': '', 'NextKeyMarker': 'analytics-s3l/params.json', 'NextVersionIdMarker': 'null', 'Versions': [{'ETag': '"dbd336ff00cb5af3d"', 'Size': 1557, 'StorageClass': 'STANDARD', 'Key': 'analytics-s3i3/param.json', 'VersionId': 'null', 'IsLatest': True, 'LastModified': datetime.datetime(2020, 10, 28, 18, 16, 38, tzinfo=tzutc()), 'Owner': {'DisplayName': 'AWS.Development', 'ID': '*****************'}}, {'ETag': '"66b49598df6"', 'Size': 21334, 'StorageClass': 'STANDARD', 'Key': 'analytics-s3i3/template.json', 'VersionId': 'null', 'IsLatest': True, 'LastModified': datetime.datetime(2020, 10, 28, 18, 16, 38, tzinfo=tzutc()), 'Owner': {'DisplayName': 'AWS.Development', 'ID': '****************'}}], 'Name': 's3-test-bucket', 'Prefix': '', 'MaxKeys': 5, 'EncodingType': 'url', 'DeleteMarkers': None, 'CommonPrefixes': None}