如何防止物件以條件式寫入覆寫 - Amazon Simple Storage Service

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

如何防止物件以條件式寫入覆寫

透過條件式寫入,您可以將額外的標頭新增至寫入請求,以指定 S3 操作的先決條件。這可以透過驗證儲存貯體中沒有具有相同金鑰名稱的現有物件來防止覆寫現有資料。條件式寫入會將 API 請求寫入一般用途儲存貯體和目錄儲存貯體。

當您將物件上傳至 Amazon S3 時,您會指定金鑰名稱。金鑰名稱是儲存貯體中物件的唯一、區分大小寫的識別符。如果您在未版本或版本已暫停的儲存貯體中上傳具有相同金鑰名稱的物件,則會覆寫物件。在版本控制的儲存貯體中,最近上傳的物件將成為物件的目前版本。

條件式寫入會在WRITE操作期間檢查物件是否存在。如果在儲存貯體中找到相同的金鑰名稱,WRITE操作將會失敗。透過條件式寫入,您可以讓多個用戶端寫入相同的儲存貯體,而不會覆寫現有的物件。

若要執行條件式寫入,您必須擁有 s3:PutObject許可。此許可可讓呼叫者檢查儲存貯體中是否存在物件。您可以搭配預先簽章的 URLs 與 AWS SDKs 使用條件式寫入。

注意

若要使用條件式寫入,您必須透過 HTTPS (TLS) 提出請求,或使用 AWS Signature 第 4 版簽署請求。

支援的 APIs

下列 S3 APIs 支援使用條件式寫入:

您可以使用下列標頭,根據物件金鑰名稱寫入物件。如需有關物件金鑰名稱的資訊,請參閱 命名 Amazon S3 物件

PutObject

  • If-None-Match — 只有在指定的儲存貯體中不存在具有相同金鑰名稱的現有物件時,才能上傳物件。您必須搭配此參數使用 * (星號) 值。

下列put-object範例命令說明如何使用 if-none-match 參數,使用 上傳具有條件式寫入標頭的 AWS CLI 物件。

aws s3api put-object --bucket amzn-s3-demo-bucket --key dir-1/my_images.tar.bz2 --body my_images.tar.bz2 --if-none-match "*"

如需詳細資訊,請參閱 put-objectAWS CLI 命令參考 中。

如需 的相關資訊 AWS CLI,請參閱 AWS Command Line Interface 使用者指南中的什麼是 AWS Command Line Interface?

如需此標頭的詳細資訊,請參閱 PutObject 在 Amazon Simple Storage Service API 參考中。

CompleteMultipartUpload

  • If-None-Match — 只有在指定的儲存貯體中不存在具有相同金鑰名稱的現有物件時,才能完成上傳。您必須搭配此參數使用 * (星號) 值。

下列complete-multipart-upload範例命令說明如何使用 if-none-match 參數 AWS CLI ,使用條件式寫入標頭完成分段上傳。

aws s3api complete-multipart-upload --multipart-upload file://mpustruct --bucket amzn-s3-demo-bucket --key dir-1/my_images.tar.bz2 --upload-id uploadID --if-none-match "*"

如需詳細資訊,請參閱 complete-multipart-uploadAWS CLI 命令參考 中。

如需 的相關資訊 AWS CLI,請參閱 AWS Command Line Interface 使用者指南中的什麼是 AWS Command Line Interface?

如需此標頭的詳細資訊,請參閱 CompleteMultipartUpload 在 Amazon Simple Storage Service API 參考中。

條件式寫入行為

條件式寫入會根據儲存貯體中的現有物件進行評估。如果儲存貯體中沒有具有相同金鑰名稱的現有物件,則寫入操作會成功,進而產生200回應。如果有現有物件,則寫入操作會失敗,導致412 Precondition Failed回應。對於已啟用版本控制的儲存貯體,S3 會檢查是否存在目前物件版本,該版本的名稱與條件式評估的一部分相同。如果沒有具有相同名稱的目前物件版本,或目前物件版本是刪除標記,則寫入操作會成功。否則,會導致寫入操作失敗,並產生412 Precondition Failed回應。

如果相同物件名稱發生多個條件式寫入,則要完成的第一個寫入操作會成功。然後,Amazon S3 會失敗後續寫入並顯示412 Precondition Failed回應。

如果對物件的刪除請求成功,在物件的條件式寫入操作完成之前,您也可以收到同時請求的409 Conflict回應。這是因為刪除請求優先於先前啟動的條件式寫入操作。搭配 使用條件式寫入時PutObject,在收到409錯誤後可能會重試上傳。使用 時CompleteMultipartUpload,分段上傳必須使用 重新啟動,CreateMultipartUpload以便在收到409錯誤後再次上傳物件。

請考慮下列案例,其中兩個用戶端正在相同儲存貯體上執行操作。

412 先決條件失敗回應

條件式寫入不會考慮任何進行中分段上傳請求,因為這些請求尚未完全寫入物件。請考慮下列 Client 1 使用分段上傳上傳物件的範例。在分段上傳期間,用戶端 2 能夠使用條件式寫入操作成功寫入相同的物件。隨後,當用戶端 1 嘗試使用條件式寫入來完成分段上傳時,上傳會失敗,因為物件已存在。

兩個用戶端撰寫具有相同金鑰名稱項目的範例。一個包含 UploadPart for MPU,一個包含 PutObject 和條件式寫入。之後開始的 CompleteMultipartUpload 操作會失敗。
409 衝突回應

如果刪除請求在條件式寫入請求完成之前成功,Amazon S3 會傳回寫入操作的409 Conflict回應。這是因為先前啟動的刪除請求優先於條件式寫入操作。請考慮下列檔案puppy.txt存在於儲存貯體中的範例。用戶端 1 會針對另一個名為 puppy.txt 的檔案啟動分段上傳,目的是使用條件式寫入來完成分段上傳。在上傳用戶端 2 期間, puppy.txt 會從儲存貯體中刪除。當用戶端 1 嘗試使用 CompleteMultipartUpload 上傳具有條件寫入的自己的puppy.txt檔案時,409 Conflict回應會失敗。在這種情況下,您必須啟動新的分段上傳。

兩個用戶端的範例,一個使用分段上傳,另一個在 MPU 啟動後傳送刪除請求。刪除請求會在條件式寫入開始之前完成。
注意

為了將儲存費用降至最低,建議您使用 AbortIncompleteMultipartUpload 動作,將生命週期規則設定為在指定天數後刪除不完整的分段上傳。如需詳細了解生命週期規則的建立,以刪除不完整分段上傳,請參閱設定儲存貯體生命週期組態,刪除不完整分段上傳