如何執行條件式刪除
您可以在刪除物件之前,使用條件式刪除來評估物件是否存在或保持不變。您可以使用 S3 一般用途和目錄儲存貯體中的 DeleteObject 或 DeleteObjects API 操作,執行條件式刪除。首先,當您提出條件式刪除請求時,可以使用附帶先決條件值 * 的 HTTP If-Match 標頭來檢查物件是否存在,或使用具有您提供的 ETag 的 If-Match 標頭來檢查物件是否已修改。
您可以使用 S3 儲存貯體或 Identity and Access Management (IAM) 政策,在一般用途儲存貯體層級強制執行條件式刪除。如需更多詳細資訊,請參閱 在 Amazon S3 儲存貯體上強制執行條件式刪除。
注意
條件式刪除評估僅適用於物件的目前版本。
如何在刪除物件之前檢查您的物件是否已修改
透過條件式刪除,可以預防您的應用程式免於意外刪除物件。您可以搭配 ETag 值使用 HTTP If-Match 標頭,檢查物件是否已修改。如果 S3 儲存貯體中的物件 ETag 值,與您在刪除作業期間提供的 ETag 不相符,操作會失敗。要使用 DeleteObjects 操作有條件地刪除多個物件,您必須在 XML 請求內文的物件 ETag 元素中提供 ETag 值。如需更多詳細資訊,請參閱 使用 Content-MD5 和 ETag 驗證上傳的物件。
注意
要使用具有 ETag 值的 If-Match 標頭執行條件式刪除,您必須擁有 s3:DeleteObject 和 s3:GetObject 許可權。
具有 ETag 值的 If-Match 標頭,會根據儲存貯體中的現有物件進行評估。如果現有的物件具有相同的金鑰名稱和相符的 ETag,則 DeleteObject 請求會成功,且會傳回 204 No content 回應。如果 ETag 不相符,使用 412 Precondition Failed 回應的刪除操作會失敗。如果成功,DeleteObjects API 會以 200 OK 回應,並提供批次刪除請求的回應內文中每個物件的狀態。如果不符合 DeleteObjects 請求的先決條件,Amazon S3 會刪除物件,並傳回 Pre-condition 失敗的錯誤回應。
如果對物件的 DELETE 或 PUT 請求在對該物件執行條件刪除操作完成之前成功,則在並行發出請求的情況下,您也可能會收到 409 Conflict 錯誤回應。如果對物件的並行刪除請求在該物件的條件式寫入操作完成之前成功,您將會收到 404 Not
Found 回應,因為物件金鑰不再存在。
對於下列 API,您可以搭配 ETag 值使用 If-Match 標頭:
下列 delete-object 範例命令會嘗試使用提供的 ETag 值 6805f2cfc46c0f04559748bb039d69al,執行條件式刪除。
aws s3api delete-object --bucketamzn-s3-demo-bucket--key dir-1/my_images.tar.bz2--if-match "6805f2cfc46c0f04559748bb039d69al"
如需詳細資訊,請參閱《AWS CLI 命令參考》中的 delete-object
下列 delete-objects 範例命令會嘗試使用提供的 ETag 值 6805f2cfc46c0f04559748bb039d69al,執行條件式刪除。
aws s3api delete-objects --bucketamzn-s3-demo-bucket--delete '{"Objects":[{"Key":"my_images.tar.bz2", "ETag": "6805f2cfc46c0f04559748bb039d69al"}]}'
如需詳細資訊,請參閱《AWS CLI 命令參考》中的 delete-objects
如需 AWS CLI 的資訊,請參閱《AWS Command Line Interface使用者指南》中的什麼是 AWS Command Line Interface?。
如何在刪除物件之前檢查您的物件是否存在
您可以搭配 * 值使用 If-Match 標頭,在嘗試刪除物件之前,先檢查物件是否存在。此 * 值表示,只有在物件存在時才需繼續進行操作,無論物件是否已修改。
刪除標記是版本控制的 S3 一般用途儲存貯體中的特殊物件,表示物件已刪除。它們是預留位置,可讓物件在保留先前版本時,顯示為刪除。因此,當您搭配 DeleteObject API 使用 If-Match:* 時,只有當物件存在時,操作才會成功並傳回 204 No Content。如果物件的最新版本是刪除標記,則物件不存在,且 DeleteObject API 會失敗,並傳回 412 Precondition Failed 回應。如需刪除標記的詳細資訊,請參閱「使用刪除標記」。
若要使用 DeleteObjects 操作以有條件地刪除多個物件,您可以在 XML 請求內文中物件的 ETag 元素中,提供 *。如果先決條件成功,DeleteObjects 操作會以 200 OK 回應,並提供回應內文中每個物件的狀態。如果先決條件成功,則會在回應內文的 <Deleted> 元素中擷取該物件的回應。如果先決條件失敗,則會在回應內文的 <Error> 元素中擷取該物件的回應。如果物件在評估任一先決條件時不存在,S3 會拒絕請求,並傳回 Not Found 錯誤回應。
注意
若要使用 If-Match:* 執行條件式刪除,您必須具有 s3:DeleteObject 許可權。
對於下列 API,您可以搭配 * 值使用 If-Match 標頭:
下列 delete-object 範例命令會嘗試對金鑰名稱為 ,且值 my_images.tar.bz2* 代表任何 ETag 的物件,執行條件式刪除。
aws s3api delete-object --bucketamzn-s3-demo-bucket--key dir-1/my_images.tar.bz2--if-match "*"
如需詳細資訊,請參閱《AWS CLI 命令參考》中的 delete-object
下列 delete-objects 範例命令會嘗試對金鑰名稱為 ,且值 my_images.tar.bz2* 代表任何 ETag 的物件,執行條件式刪除。
aws s3api delete-objects --bucketamzn-s3-demo-bucket--delete '{"Objects":[{"Key":"my_images.tar.bz2", "ETag": "*"}]}'
如需詳細資訊,請參閱《AWS CLI 命令參考》中的 delete-objects
如需 AWS CLI 的資訊,請參閱《AWS Command Line Interface使用者指南》中的什麼是 AWS Command Line Interface?。