เมื่อผู้ใช้ต้องการใช้ Wait Functionality เพื่อตรวจสอบว่า Key ใน Bucket มีอยู่หรือไม่ในโค้ดโปรแกรม
ข้อกำหนดปัญหา
ใช้ไลบรารี Boto3 ใน Python เพื่อตรวจสอบว่า Key มีอยู่ใน Bucket โดยใช้ Waiter Functionality เช่น ใช้ Waiter ตรวจสอบว่า Key test.zip มีอยู่ใน Bucket_1
ขั้นตอนการแก้ปัญหา
- ขั้นตอนที่ 1 – นำเข้า
boto3และbotocore.exceptionsเพื่อจัดการข้อยกเว้น - ขั้นตอนที่ 2 –
bucket_nameและkeyเป็นพารามิเตอร์ 2 ตัวในฟังก์ชัน - ขั้นตอนที่ 3 – สร้าง AWS Session ด้วย Boto3
- ขั้นตอนที่ 4 – สร้าง AWS Client สำหรับ S3
- ขั้นตอนที่ 5 – สร้าง Wait Object สำหรับ object_exists โดยใช้
get_waiter - ขั้นตอนที่ 6 – ใช้ wait Object ตรวจสอบว่า Key มีอยู่หรือไม่ใน Bucket ที่กำหนด โดย Default จะตรวจสอบทุก 5 วินาทีจนถึงสถานะสำเร็จ Error จะถูกคืนหลังจาก 20 ครั้งที่ล้มเหลว อย่างไรก็ตาม ผู้ใช้สามารถกำหนด Polling Time และ Max Attempts เองได้
- ขั้นตอนที่ 7 – คืนค่า None
- ขั้นตอนที่ 8 – จัดการข้อยกเว้นทั่วไปหากเกิดข้อผิดพลาดขณะตรวจสอบ Bucket
ตัวอย่างโค้ด
ใช้โค้ดต่อไปนี้เพื่อใช้ Waiter ตรวจสอบว่า Key มีอยู่ใน Bucket หรือไม่:
import boto3
from botocore.exceptions import ClientError
def use_waiters_check_object_exists(bucket_name, key_name):
session = boto3.session.Session()
s3_client = session.client('s3')
try:
waiter = s3_client.get_waiter('object_exists')
waiter.wait(Bucket=bucket_name, Key=key_name,
WaiterConfig={'Delay': 2, 'MaxAttempts': 5})
print('Object exists: ' + bucket_name + '/' + key_name)
except ClientError as e:
raise Exception("boto3 client error in use_waiters_check_object_exists: " + e.__str__())
except Exception as e:
raise Exception("Unexpected error in use_waiters_check_object_exists: " + e.__str__())
print(use_waiters_check_object_exists("Bucket_1", "testfolder/test.zip"))
print(use_waiters_check_object_exists("Bucket_1", "testfolder/test1.zip"))
ผลลัพธ์
Object exists: Bucket_1/testfolder/test.zip
None
botocore.exceptions.WaiterError: Waiter ObjectExists failed: Max attempts exceeded
"Unexpected error in use_waiters_check_object_exists: " + e.__str__())
Exception: Unexpected error in use_waiters_check_object_exists: Waiter ObjectExists failed: Max attempts exceed
สำหรับ Bucket_1/testfolder/test.zip ผลลัพธ์คือ Print Statement และ None เนื่องจาก Response ไม่คืนค่าอะไร จึงพิมพ์ None
สำหรับ Bucket_1/testfolder/test1.zip ผลลัพธ์คือ Exception เนื่องจาก Object นี้ไม่มีอยู่
ใน Exception สามารถอ่านได้ว่า Max attempts exceeded