我想洗掉昨天上傳的 s3 物件。我想每天運行一個 AWS Lambda 函式,該函式將洗掉前一天上傳的物件。
我在另一個執行緒上找到了一個示例代碼并嘗試使用它,但我收到一條錯誤訊息:
{ "errorMessage": "無法比較 offset-naive 和 offset-aware datetimes", "errorType": "TypeError"}
我在悉尼,S3 顯示lastmodified按照當地時區,但 Lambda 函式回傳 UTC 時區。我找到的代碼包含一個靜態日期,但我想對每日時間戳進行動態比較。
import os
import boto3
from datetime import datetime
bucket = os.environ["S3_BUCKET_NAME"]
s3 = boto3.client('s3', region_name='ap-southeast-2')
response = s3.list_objects_v2(Bucket=bucket)
keys_to_delete = [{'Key': object['Key']} for object in response['Contents'] if object['LastModified'] < datetime(2022, 1, 7)]
s3.delete_objects(Bucket=bucket, Delete={'Objects': keys_to_delete})
請幫助糾正這個問題,或者如果有人知道更好的方法來完成這個。我是 devops 的新手,沒有太多的編碼經驗。
謝謝。
uj5u.com熱心網友回復:
使用 S3 的存盤生命周期功能。
它允許將物件轉換到另一個存盤類(Standard、Standard-IA 等)或使物件過期(洗掉)。您可以創建生命周期規則以在創建后 1 天洗掉物件。
當物件根據其生命周期策略達到其生命周期的終點時,Amazon S3 將其排隊等待移除并異步移除。到期日期與 Amazon S3 洗掉物件的日期之間可能存在延遲。您無需為過期或與已過期物件關聯的存盤時間付費。
參考:
管理您的存盤生命周期
uj5u.com熱心網友回復:
看來,你的問題是,LastModified是時區感知,但你是一個比較它datetime是沒有時區感知。
您可以執行以下操作:
import pytz
from pytz import timezone
from datetime import datetime
# Convert time from Sydney into UTC
comparsion_datetime = datetime(2022, 1, 7).astimezone(timezone('Australia/Sydney')).astimezone(pytz.UTC)
這會將其轉換為匹配的 UTC 時區。
然后,comparsion_datetime在計算時使用keys_to_delete。
事實上,它可能只適用于:
comparsion_datetime = datetime(2022, 1, 7).astimezone(timezone('Australia/Sydney'))
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/409192.html
標籤:
