คำชี้แจงปัญหา − ใช้ไลบรารี boto3 ใน Python เพื่อรับรายการไฟล์จาก S3 ซึ่งจะถูกแก้ไขหลังจากประทับวันที่ที่กำหนด
ตัวอย่าง − แสดงรายการ test.zip จาก Bucket_1/testfolder ของ S3 หากมีการแก้ไขหลังปี 2021-01-21 13:19:56.986445+00:00
แนวทาง/อัลกอริทึมในการแก้ปัญหานี้
ขั้นตอนที่ 1 - นำเข้าข้อยกเว้น boto3 และ botocore เพื่อจัดการกับข้อยกเว้น
ขั้นตอนที่ 2 − s3_path และ last_modified_timestamp เป็นพารามิเตอร์สองตัวในฟังก์ชัน list_all_objects_based_on_last_modified "last_modified_timestamp" ควรอยู่ในรูปแบบ “2021-01-22 13:19:56.986445+00:00” โดยค่าเริ่มต้น boto3 จะเข้าใจเขตเวลา UTC โดยไม่คำนึงถึงตำแหน่งทางภูมิศาสตร์
ขั้นตอนที่ 3 − ตรวจสอบความถูกต้อง s3_path ถูกส่งผ่านในรูปแบบ AWS เป็น s3://bucket_name/key
ขั้นตอนที่ 4 − สร้างเซสชัน AWS โดยใช้ไลบรารี boto3
ขั้นตอนที่ 5 − สร้างทรัพยากร AWS สำหรับ S3
ขั้นตอนที่ 6 - ตอนนี้แสดงรายการวัตถุทั้งหมดของคำนำหน้าที่กำหนดโดยใช้ฟังก์ชัน list_objects และจัดการข้อยกเว้น หากมี
ขั้นตอนที่ 7 − ผลลัพธ์ของฟังก์ชันข้างต้นคือพจนานุกรมและประกอบด้วยข้อมูลระดับไฟล์ทั้งหมดในคีย์ที่ชื่อว่า "เนื้อหา" ตอนนี้แยกรายละเอียดระดับที่เก็บข้อมูลในวัตถุ
ขั้นตอนที่ 8 − ตอนนี้ object ยังเป็นพจนานุกรมที่มีรายละเอียดทั้งหมดของไฟล์อีกด้วย ตอนนี้ ดึงข้อมูล LastModified รายละเอียดของแต่ละไฟล์และเปรียบเทียบกับวันที่ประทับเวลาที่กำหนด
ขั้นตอนที่ 9 − ถ้า LastModified มากกว่าการประทับเวลาที่กำหนด บันทึกชื่อไฟล์ทั้งหมด มิฉะนั้น ให้ข้ามไป
ขั้นตอนที่ 10 − ส่งคืนรายการไฟล์ที่แก้ไขหลังจากวันที่ระบุ
ตัวอย่าง
รหัสต่อไปนี้รับรายการไฟล์จาก AWS S3 ตามการประทับวันที่แก้ไขล่าสุด -
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 []