ข้อกำหนดปัญหา
ใช้ไลบรารี Boto3 ใน Python เพื่อดึงรายการไฟล์จาก S3 ที่ถูกแก้ไขหลังจาก Date Timestamp ที่กำหนด
ตัวอย่าง
แสดงรายการ test.zip จาก Bucket_1/testfolder ของ S3 หากถูกแก้ไขหลังจาก 2021-01-21 13:19:56.986445+00:00
ขั้นตอนการแก้ปัญหา
- ขั้นตอนที่ 1 – นำเข้า
boto3และbotocore.exceptionsเพื่อจัดการข้อยกเว้น - ขั้นตอนที่ 2 – s3_path และ last_modified_timestamp เป็นพารามิเตอร์ 2 ตัวในฟังก์ชัน list_all_objects_based_on_last_modified "last_modified_timestamp" ควรอยู่ในรูปแบบ "2021-01-22 13:19:56.986445+00:00" โดย Default Boto3 เข้าใจ Timezone เป็น UTC ไม่ว่าจะอยู่ที่ไหน
- ขั้นตอนที่ 3 – ตรวจสอบว่า
s3_pathถูกส่งในรูปแบบ AWS คือs3://bucket_name/key - ขั้นตอนที่ 4 – สร้าง AWS Session ด้วย Boto3
- ขั้นตอนที่ 5 – สร้าง AWS Resource สำหรับ S3
- ขั้นตอนที่ 6 – แสดงรายการ Object ทั้งหมดของ Prefix ที่กำหนดโดยใช้ฟังก์ชัน list_objects และจัดการ Exception หากมี
- ขั้นตอนที่ 7 – ผลลัพธ์ของฟังก์ชันข้างต้นเป็น Dictionary และมีข้อมูลระดับไฟล์ทั้งหมดใน Key ชื่อ 'Contents' ตอนนี้ ดึงรายละเอียดระดับ Bucket ไปเก็บใน Object
- ขั้นตอนที่ 8 – Object ก็เป็น Dictionary ที่มีรายละเอียดของไฟล์ทั้งหมด ตอนนี้ ดึง LastModified ของแต่ละไฟล์และเปรียบเทียบกับ Date Timestamp ที่กำหนด
- ขั้นตอนที่ 9 – หาก LastModified มากกว่าหรือเท่ากับ Timestamp ที่กำหนด ให้บันทึกชื่อไฟล์เต็ม มิฉะนั้นให้ข้าม
- ขั้นตอนที่ 10 – คืนค่ารายการไฟล์ที่ถูกแก้ไขหลังจาก Date Timestamp ที่กำหนด
ตัวอย่างโค้ด
โค้ดต่อไปนี้ดึงรายการไฟล์จาก AWS S3 ตาม Last Modified Date Timestamp:
import boto3
from botocore.exceptions import ClientError
def list_all_objects_based_on_last_modified(s3_files_path, last_modified_timestamp):
if 's3://' not in s3_files_path:
raise Exception('Given path is not a valid s3 path.')
session = boto3.session.Session()
s3_resource = session.resource('s3')
bucket_token = s3_files_path.split('/')
bucket = bucket_token[2]
folder_path = bucket_token[3:]
prefix = ""
for path in folder_path:
prefix = prefix + path + '/'
try:
result = s3_resource.meta.client.list_objects(Bucket=bucket, Prefix=prefix)
except ClientError as e:
raise Exception("boto3 client error in list_all_objects_based_on_last_modified function: " + e.__str__())
except Exception as e:
raise Exception("Unexpected error in list_all_objects_based_on_last_modified function of s3 helper: " + e.__str__())
filtered_file_names = []
for obj in result['Contents']:
if str(obj["LastModified"]) >= str(last_modified_timestamp):
full_s3_file = "s3://" + bucket + "/" + obj["Key"]
filtered_file_names.append(full_s3_file)
return filtered_file_names
# give a timestamp to fetch test.zip
print(list_all_objects_based_on_last_modified("s3://Bucket_1/testfolder", "2021-01-21 13:19:56.986445+00:00"))
# give a timestamp no file is modified after that
print(list_all_objects_based_on_last_modified("s3://Bucket_1/testfolder", "2021-01-21 13:19:56.986445+00:00"))
ผลลัพธ์
# give a timestamp to fetch test.zip
['s3://Bucket_1/testfolder/test.zip']
# give a timestamp no file is modified after that
[]