在使用其鍵作為前綴列出物件的所有版本的情況下:
import boto3
bucket = 'bucket name'
key = 'key'
s3 = boto3.resource('s3')
versions = s3.Bucket(bucket).object_versions.filter(Prefix=key)
for version in versions:
obj = version.get()
print(obj.get('VersionId'), obj.get('ContentLength'), obj.get('LastModified'))
是否僅對列出與前綴匹配的物件收費?
如果是這樣,列出的每個物件/版本是否都被視為單獨的串列請求?
uj5u.com熱心網友回復:
不,列出的每個物件/版本不被視為單獨的串列請求。您只需為 S3 的 API 請求付費(大約為每 1000 個 API 請求 0.005 美元)。單個 API 請求將回傳許多(最多 1000 個)與指定前綴匹配的物件/版本。前綴過濾本身發生在 S3 的服務器端。
解決此問題的方法是了解 AWS 開發工具包呼叫最終會導致對 AWS 服務端點(例如S3 API)的API 請求。您需要做的是弄清楚您的 SDK 客戶端請求如何映射到底層 API 請求,以確定可能發生的情況。
如果您的請求是一個簡單的“在我的存盤桶中列出物件”的情況,boto3 SDK 將進行一個或多個ListObjectsV2 API 呼叫。我說“或更多”是因為 SDK 可能需要發出多個 API 請求,因為 API 請求通常會產生最大數量的結果(例如 ListObjectsV2 回應中的 1000 個物件)。例如,如果有 2500 個具有指定前綴的物件,則將向 S3 API 發出 3x ListObjectsV2 請求。
如果您的請求是“使用給定前綴列出我的存盤桶中的物件”,那么您需要知道ListObjectsV2 API 呼叫中存在哪些功能。重要的prefix是,是引數之一。這就是您如何知道 S3 本身正在對您提供的前綴(您.filter(Prefix=key)在代碼中指明的位置)進行過濾的方式。如果這不是底層 S3 API 的功能,那么您的 SDK(boto3 等)將是對前綴進行過濾的那個,這將是一個更昂貴且速度更慢的操作,因為 SDK 必須列出所有物件,可能會導致更多的 LIST 請求,并在客戶端過濾它們。注意:ListObjectVersions API 在這方面類似于 ListObjectsV2,并且都支持prefix.
另請注意VersionId,Size、 和LastModifed都是出現在ListObjectVersions 回應中的屬性,因此不需要進一步的 API 請求來獲取此資訊。
因此,在您的情況下,假設與您指定的前綴匹配的物件版本少于 1000 個,我認為這等同于對 ListObjectVersions 的一個 S3 API 請求(這被視為 LIST 請求而不是 GET 請求以進行計費 afaik,即使它是對幕后的 GET HTTP 請求https://mybucket.s3.amazonaws.com/?versions)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/367892.html
