Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

วิธีใช้ Boto3 Library ใน Python ดึงรายการไฟล์จาก S3 ตาม Last Modified Date โดยใช้ AWS Resource


ข้อกำหนดปัญหา

ใช้ไลบรารี Boto3 ใน Python เพื่อดึงรายการไฟล์จาก S3 ที่ถูกแก้ไขหลังจาก Date Timestamp ที่กำหนด

ตัวอย่าง

แสดงรายการ test.zip จาก Bucket_1/testfolder ของ S3 หากถูกแก้ไขหลังจาก 2021-01-21 13:19:56.986445+00:00

ขั้นตอนการแก้ปัญหา

  1. ขั้นตอนที่ 1 – นำเข้า boto3 และ botocore.exceptions เพื่อจัดการข้อยกเว้น
  2. ขั้นตอนที่ 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. ขั้นตอนที่ 3 – ตรวจสอบว่า s3_path ถูกส่งในรูปแบบ AWS คือ s3://bucket_name/key
  4. ขั้นตอนที่ 4 – สร้าง AWS Session ด้วย Boto3
  5. ขั้นตอนที่ 5 – สร้าง AWS Resource สำหรับ S3
  6. ขั้นตอนที่ 6 – แสดงรายการ Object ทั้งหมดของ Prefix ที่กำหนดโดยใช้ฟังก์ชัน list_objects และจัดการ Exception หากมี
  7. ขั้นตอนที่ 7 – ผลลัพธ์ของฟังก์ชันข้างต้นเป็น Dictionary และมีข้อมูลระดับไฟล์ทั้งหมดใน Key ชื่อ 'Contents' ตอนนี้ ดึงรายละเอียดระดับ Bucket ไปเก็บใน Object
  8. ขั้นตอนที่ 8 – Object ก็เป็น Dictionary ที่มีรายละเอียดของไฟล์ทั้งหมด ตอนนี้ ดึง LastModified ของแต่ละไฟล์และเปรียบเทียบกับ Date Timestamp ที่กำหนด
  9. ขั้นตอนที่ 9 – หาก LastModified มากกว่าหรือเท่ากับ Timestamp ที่กำหนด ให้บันทึกชื่อไฟล์เต็ม มิฉะนั้นให้ข้าม
  10. ขั้นตอนที่ 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
[]