在 Amazon S3 中使用分段上傳來上傳和複製物件 - Amazon Simple Storage Service

在 Amazon S3 中使用分段上傳來上傳和複製物件

您可利用分段上傳,將單一物件以一組組件上傳至 Amazon S3。每個組件都是物件資料的接續部分。您可依任何順序分別上傳這些物件組件。上傳時,已更新的 AWS 用戶端會自動計算物件的檢查總和,並將其連同物件大小作為請求的一部分一起傳送至 Amazon S3。若任何組件的傳輸失敗,您可再次傳輸該組件,而不會影響其他組件。當物件的所有組件都上傳完後,Amazon S3 會將這些組件組合起來建立該物件。最佳實務是針對 100 MB 或更大的物件使用分段上傳,而不是以單一操作進行上傳。

使用分段上傳具備下列優勢:

  • 改善輸送量 - 您可平行上傳各組件以改進輸送量。

  • 快速從任何網路問題復原 - 組件大小若較小,對於重新開始因為網路發生錯誤而上傳失敗的影響可降到最低。

  • 暫停及繼續上傳物件 - 您可在一段時間內上傳物件組件。啟動分段上傳之後就不會過期;您必須明確地完成或中止分段上傳。

  • 在您知道最終物件大小前開始上傳 - 您可在建立物件的同時上傳物件。

建議您依照下列方式使用分段上傳:

  • 如果您透過穩定的高頻寬網路上傳大型物件,使用分段上傳可同時上傳多個物件組件以取得多執行緒效能,因而充分利用可用的頻寬。

  • 如果您透過不穩定的網路進行上傳,使用分段上傳可避免上傳重新開始,因而更快從網路錯誤中復原。使用分段上傳時,只有上傳期間遭到中斷的組件才需要重試上傳。您不需要從頭開始重新上傳物件。

注意

如需將 Amazon S3 Express One Zone 儲存類別與目錄儲存貯體搭配使用的詳細資訊,請參閱 S3 Express One Zone使用目錄儲存貯體。如需使用分段上傳搭配 S3 Express One Zone 和目錄儲存貯體的詳細資訊,請參閱 搭配目錄儲存貯體使用分段上傳

分段上傳程序

分段上傳是三步驟的程序:啟動上傳、上傳物件的各組件,以及在上傳完所有組件後,完成分段上傳。Amazon S3 一收到完成分段上傳請求,就會從上傳的組件建構物件,然後您即可像存取儲存貯體中的任何其他物件一樣存取該物件。

您可以列出所有進行中的分段上傳,或是取得特定分段上傳之已上傳組件的清單。本節會一一說明這些操作。

啟動分段上傳

當您傳送啟動分段上傳的請求時,請務必指定檢查總和類型。然後,Amazon S3 會傳回包含上傳 ID 的回應,這是分段上傳的唯一識別碼。當您上傳組件、列出組件、完成上傳或停止上傳時,都需要此上傳 ID。如果您想要提供中繼資料來描述正在上傳的物件,則必須在啟動分段上傳的請求中提供。

組件上傳

上傳組件時,除了上傳 ID 之外,還必須指定組件編號。您可選擇 1 到 10,000 之間的任何組件編號。組件編號可找出獨特的某個組件,以及其在上傳中物件內的位置。您選擇的組件編號無須為連續的號碼 (例如,其可為 1、5 和 14)。請注意,如果您使用與先前上傳組件相同的組件編號上傳新組件,則會覆寫先前上傳的組件。

當您上傳組件時,Amazon S3 會傳回檢查總和演算法類型,並以每個組件的檢查總和值作為回應中的標頭。您必須記錄每個上傳組件的組件編號與 ETag 值。後續的要求中必須包含這些值,才能完成分段上傳。每個組件在上傳時都會有自己的 ETag。不過,分段上傳完成並合併所有組件之後,所有組件會屬於一個 ETag,作為多個檢查總和的檢查總和。

重要

在您啟動分段上傳及上傳一或多個組件之後,您必須完成或停止分段上傳,才能停止產生儲存已上傳組件的費用。只有在您完成或停止分段上傳「之後」,Amazon S3 才會釋出組件儲存空間,並停止向您收取儲存組件的費用。

停止分段上傳之後,即無法再次使用該上傳 ID 上傳任何組件。如有組件正在進行上傳,即使在您停止上傳之後,這些上傳仍有可能成功或失敗。若要確保釋出所有組件耗用的所有儲存空間,您必須等到所有組件上傳完成,再停止分段上傳。

完成分段上傳

當您完成分段上傳時,Amazon S3 會根據組件編號以遞增順序串連各個組件,建立物件。啟動分段上傳要求中若已提供任何物件中繼資料,Amazon S3 就會建立該中繼資料與物件之間的關聯性。成功完成請求之後,這些片段就不再存在。

您的「完成分段上傳」請求必須包含上傳 ID,以及組件編號和其對應 ETag 值的清單。Amazon S3 回應包含的 ETag 可識別獨特的物件資料組合。這個 ETag 不一定是物件數據的 MD5 雜湊。

當您在分段上傳期間提供完整物件檢查總和時,AWS SDK 會將檢查總和傳遞至 Amazon S3,而 S3 會在伺服器端驗證物件完整性,並將其與收到的值進行比較。如果值相符,則 S3 會儲存物件。如果這兩個值不相符,Amazon S3 的請求會失敗並顯示 BadDigest 錯誤。物件的檢查總和也會儲存在物件中繼資料內,以供稍後用來驗證物件的資料完整性。

分段上傳呼叫範例

在此範例中,假設您正在為 100 GB 的檔案產生分段上傳。在此情況下,您會為整個程序執行以下 API 呼叫。總共會有 1,002 個 API 呼叫。

分段上傳清單

您可列出特定分段上傳的組件或所有進行中之分段上傳。列出組件操作會傳回特定分段上傳之已上傳組件的資訊。Amazon S3 會為每項列出的組件要求,傳回指定分段上傳組件的資訊,上限為 1,000 個組件。如果分段組件上傳中有超過 1,000 個組件,您必須傳送一連串的列出組件請求,才可擷取所有組件。請注意,傳回的組件清單不包含尚未完成之上傳的組件。使用列出分段上傳操作,即可取得正在進行中的分段上傳清單。

進行中的分段上傳是您已啟動但尚未完成或已停止的上傳。每個要求最多可傳回 1,000 個分段上傳。若正在進行超過 1,000 個的分段上傳,您必須另行傳送請求以擷取剩餘的分段上傳。傳回的清單僅用於進行驗證。

重要

傳送完成分段上傳請求時,請不要使用此清單的結果。而是在上傳 Amazon S3 傳回的組件與相對應之 ETag 值時,保有您自己的組件編號清單。

使用分段上傳操作的檢查總和

當您將物件上傳到 Amazon S3 時,可指定用於 Amazon S3 使用的檢查總和演算法。根據預設,AWS SDK 和 S3 主控台會針對所有物件上傳使用一個演算法,而您可以覆寫該演算法。如果您使用的是舊版 SDK,且上傳的物件沒有指定的檢查總和,Amazon S3 會自動使用 CRC-64NVME 檢查總和演算法 (這也是有效率地驗證資料完整性的建議選項)。使用 CRC-64NVME 時,Amazon S3 會在分段上傳或單一組件上傳完成之後計算完整物件的檢查總和。CRC-64NVME 檢查總和演算法用於計算整個物件的直接檢查總和,或每個組件的檢查總和。

使用分段上傳將物件上傳至 S3 之後,Amazon S3 會計算每個組件或完整物件的檢查總和值,並儲存這些值。您可以使用 S3 API 或 AWS SDK,透過下列方式來擷取檢查總和值:

  • 對於個別組件,您可以使用 GetObjectHeadObject。如果您想要在分段上傳仍在進行時,擷取個別組件的檢查總和值,則可以使用 ListParts

  • 對於整個物件,您可以使用 PutObject。如果您想要執行具有完整物件檢查總和的分段上傳,請指定完整物件檢查總和類型來使用 CreateMultipartUploadCompleteMultipartUpload。若要驗證整個物件的檢查總和值,或是確認在分段上傳中使用的檢查總和類型,請使用 ListParts

重要

如果您搭配檢查總和使用分段上傳,則分段上傳中每個上傳組件的組件編號都必須使用連續的組件編號。使用檢查總和時,如果您嘗試使用非連續的組件編號完成分段上傳請求,Amazon S3 會產生 HTTP 500 Internal Server 錯誤。

如需如何搭配分段上傳物件使用檢查總和的詳細資訊,請參閱在 Amazon S3 中檢查物件完整性

如需示範如何搭配額外檢查總和使用分段上傳來上傳物件的端對端程序,請參閱教學課程:透過分段上傳來上傳物件並驗證其資料完整性

並行分段上傳操作

在分散式開發環境中,您的應用程式有可能同時對相同的物件啟動數項更新。您的應用程式可能使用相同的物件金鑰,啟動數項分段上傳。然後針對這些每一個上傳,應用程式會上傳各組件,並對 Amazon S3 傳送完成上傳要求,以建立物件。當儲存貯體啟用 S3 版本控制之後,完成分段上傳一律會建立新的版本。當您在已啟用版本控制的儲存貯體中啟動多個使用相同物件金鑰的分段上傳時,物件的目前版本取決於最近開始的上傳 (createdDate)。

例如,您可以在上午 10:00 開始對物件提出 CreateMultipartUpload 請求。然後,您可以在上午 11:00 對相同的物件提交第二個 CreateMultipartUpload 請求。由於第二個請求是最近提交的,因此上午 11:00 的請求所上傳的物件會成為目前版本,即使第一個上傳是在第二個上傳之後完成也一樣。若是未啟用版本控制的儲存貯體,可能會在分段上傳啟動與完成之間收到任何其他請求,這些其他請求可能會先完成。

並行分段上傳請求可能會優先的另一個範例是,如有另一個操作在您使用金鑰啟動分段上傳之後刪除該金鑰。在您完成操作之前,完成分段上傳回應可能會在您甚至未看到物件的情況下,指出物件建立成功。

防止在分段上傳期間上傳具有相同金鑰名稱的物件

您可以在上傳操作時使用條件式寫入,在建立物件之前,檢查物件是否已存在於您的儲存貯體中。這可以防止覆寫現有資料。條件式寫入會在上傳時,驗證您的儲存貯體中不存在具有相同金鑰名稱的現有物件。

您可以針對 PutObjectCompleteMultipartUpload 請求使用條件式寫入。

如需條件式請求的詳細資訊,請參閱使用條件式請求將先決條件新增至 S3 操作

分段上傳與定價

啟動分段上傳之後,Amazon S3 就會保留所有組件,直到您完成或停止上傳為止。在其整個生命週期內,您都要支付此分段上傳及其相關組件的儲存體、頻寬與要求之費用。

這些組件會根據上傳組件時指定的儲存類別計費。不過,如果這些組件上傳至 S3 Glacier Flexible Retrieval 或 S3 Glacier Deep Archive,則不會向您收取這些組件的費用。PUT 請求中正在分段上傳至 S3 Glacier Flexible Retrieval 儲存類別的組件,會按 S3 Glacier Flexible Retrieval 暫存儲存體以 S3 Standard 儲存體費率計費,直到上傳完成為止。此外,CreateMultipartUploadUploadPart 都會以 S3 Standard 費率計費。只有 CompleteMultipartUpload 請求會以 S3 Glacier Flexible Retrieval 費率計費。同樣地,PUT 中正在分段上傳至 S3 Glacier Deep Archive 儲存類別的組件,會按 S3 Glacier Flexible Retrieval 暫存儲存體以 S3 Standard 儲存體費率計費,直到上傳完成為止。只有 CompleteMultipartUpload 請求會以 S3 Glacier Deep Archive 費率計費。

如果停止分段上傳,Amazon S3 會刪除上傳成品及所有已上傳的組件。您無須支付這些成品的費用。無論指定的儲存空間類別為何,刪除不完整的分段上傳都不會收取提前刪除費用。如需定價的詳細資訊,請參閱 Amazon S3 定價

注意

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

分段上傳的 API 支援

Amazon Simple Storage Service API 參考中的下列章節說明了分段上傳的 REST API。

如需使用 AWS Lambda 函數的分段上傳逐步解說,請參閱使用分段上傳和 Transfer Acceleration 將大型物件上傳至 Amazon S3

分段上傳的 AWS Command Line Interface 支援

AWS Command Line Interface 中的下列主題說明如何進行分段上傳。

分段上傳的 AWS SDK 支援

您可以使用 AWS SDK 分段上傳物件。如需 API 動作支援的 AWS SDK 清單,請參閱:

分段上傳 API 與許可

您必須要有必要許可,才可使用分段上傳操作。您可以使用存取控制清單 (ACL)、儲存貯體政策或使用者政策,為個人授予執行這些操作的許可。下表列出使用 ACL、儲存貯體政策或使用者政策時,各種分段上傳操作所需的許可。

動作 必要許可

建立分段上傳

您必須有權對物件執行 s3:PutObject 動作,才可建立分段上傳請求。

儲存貯體擁有者可允許其他委託人執行 s3:PutObject 動作。

啟動分段上傳

您必須有權對物件執行 s3:PutObject 動作,才可啟動分段上傳。

儲存貯體擁有者可允許其他委託人執行 s3:PutObject 動作。

啟動者

識別分段上傳啟動者的容器元素。若啟動者是 AWS 帳戶,此元素會提供和擁有者元素相同的資訊。若啟動者是 IAM 使用者,此元素會提供使用者 ARN 與顯示名稱。

上傳片段

您必須有權對物件執行 s3:PutObject 動作,才可分段上傳。

儲存貯體擁有者必須允許啟動者對物件執行 s3:PutObject 動作,啟動者才可分段上傳該物件。

上傳片段 (複製)

您必須有權對物件執行 s3:PutObject 動作,才可分段上傳。因為您分段上傳現有物件,所以必須要能對來源物件進行 s3:GetObject

啟動者若要分段上傳該物件,儲存貯體擁有者必須允許啟動者對物件執行 s3:PutObject 動作。

完成分段上傳

您必須有權對物件執行 s3:PutObject 動作,才可完成分段上傳。

儲存貯體擁有者必須允許啟動者對物件執行 s3:PutObject 動作,啟動者才可完成該物件的分段上傳。

停止分段上傳

您必須有權對物件執行 s3:AbortMultipartUpload 動作,才可停止分段上傳。

根據預設,儲存貯體擁有者和分段上傳啟動者可以根據 IAM 和 S3 儲存貯體政策來執行此動作。若啟動者是 IAM 使用者,則該使用者的 AWS 帳戶 也可以停止該分段上傳。使用 VPC 端點政策,分段上傳的啟動者不會自動獲得執行 s3:AbortMultipartUpload 動作的許可。

除了這些預設值之外,儲存貯體擁有者可允許其他委託人對物件執行 s3:AbortMultipartUpload 動作。儲存貯體擁有者可拒絕任何委託人執行 s3:AbortMultipartUpload 動作。

列出組件

您必須有權執行 s3:ListMultipartUploadParts 動作,才可列出分段上傳的各組件。

儲存貯體擁有者預設具備許可,可對儲存貯體列出任何分段上傳之組件。分段上傳的啟動者則有列出特定分段上傳組件的許可。若分段上傳啟動者是 IAM 使用者,則控制該 IAM 使用者的 AWS 帳戶 也有列出該上傳組件的許可。

除了這些預設值之外,儲存貯體擁有者可允許其他委託人對物件執行 s3:ListMultipartUploadParts 動作。儲存貯體擁有者也可拒絕任何委託人執行 s3:ListMultipartUploadParts 動作。

列出分段上傳

您必須有權對儲存貯體執行 s3:ListBucketMultipartUploads 動作,才可列出該儲存貯體進行中的分段上傳。

除此預設值外,儲存貯體擁有者可允許其他委託人對儲存貯體執行 s3:ListBucketMultipartUploads 動作。

AWS KMS 加密與解密相關許可

若要使用 AWS Key Management Service (AWS KMS) KMS 金鑰執行加密的分段上傳,請求者必須具備下列許可:

這些許可是必要的,因為在加密檔案完成分段上傳之前,Amazon S3 必須從部分加密檔案解密並讀取資料。您也需要 kms:Decrypt 許可以及使用客戶提供加密金鑰的伺服器端加密,才能取得物件的檢查總和值。如果您在使用 CompleteMultipartUpload API 時沒有這些必要的許可,則會建立不帶檢查總和值的物件。

若您的 IAM 使用者或角色位於和 KMS 金鑰相同的 AWS 帳戶 中,您必須在金鑰政策上具備這些許可。若您的 IAM 使用者或角色屬於與 CMK 不同的帳戶,您必須同時在金鑰政策和您的 IAM 使用者或角色上具備這些許可。

SSE-C (使用客戶提供加密金鑰的伺服器端加密)

使用 CompleteMultipartUpload API 時,您必須提供 SSE-C (使用客戶提供加密金鑰的伺服器端加密),否則會建立不帶檢查總和的物件,也不會傳回檢查總和值。

如需 ACL 許可與存取原則許可之間關聯性的資訊,請參閱「ACL 許可與存取政策許可的對應」。如需 IAM 使用者、角色與最佳實務的詳細資訊,請參閱《IAM 使用者指南》中的 IAM 身分 (使用者、群組和角色)

使用分段上傳操作的檢查總和

有三個 Amazon S3 API 用於執行實際分段上傳:CreateMultipartUploadUploadPartCompleteMultipartUpload。下表指出必須為每個 API 提供的檢查總和標頭和值:

檢查總和演算法 檢查總和類型 CreateMultipartUpload UploadPart CompleteMultipartUpoad

CRC-64NVME

完整物件 必要標頭:

x-amz-checsum-algorithm

選用標頭:

x-amz-checksum-CRC64nvme

選用標頭:

x-amz-checksum-algorithm

x-amz-crc64

CRC-32

CRC-32C

完整物件

必要標頭:

x-amz-checksum-algorithm

x-amz-checksum-type

選用標頭:

x-amz-checksum-crc64nvme

選用標頭:

x-amz-checksum-algorithm

x-amz-crc32

x-amz-crc32c

CRC-32

CRC-32C

SHA-1

SHA-256

複合

必要標頭:

x-amz-checksum-algorithm

必要標頭:

x-amz-checksum-crc32

x-amz-checksum-crc32c

x-amz-checksum-sha1

x-amz-checksum-sha256

必要標頭:

CompleteMultiPartUpload 請求中必須包含所有組件層級檢查總和。

選用標頭:

x-amz-crc32

x-amz-crc32c

x-amz-sha1

x-amz-sha256