教學課程:透過分段上傳上傳物件,並驗證其資料完整性 - Amazon Simple Storage Service

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

教學課程:透過分段上傳上傳物件,並驗證其資料完整性

您可利用分段上傳,將單一物件以一組組件進行上傳。每個組件都是物件資料的接續部分。您可依任何順序分別上傳這些物件組件。若任何組件的傳輸失敗,您可再次傳輸該組件,而不會影響其他組件。當物件的所有組件都全部上傳完後,Amazon S3 會將這些組件組合起來建立該物件。一般而言,當物件大小達到 100 MB 時,應考慮使用分段上傳,而不是以單次操作上傳物件。如需分段上傳 的詳細資訊,請參閱 使用分段上傳來上傳和複製物件。如需與分段上傳相關的限制,請參閱 Amazon S3 分段上傳限制

您可以使用總和檢查碼來確認複製資產時未變更。執行檢查總和包含使用演算法,在檔案中的每個位元組上依序迭代。Amazon S3 提供多個檢查總和選項,用於檢查資料的完整性。我們建議您執行這些完整性檢查作為耐久性最佳實務,並確認每個位元組都傳輸,而不會變更。Amazon S3 也支援下列演算法:SHA-1、SHA-256、CRC32 和 CRC32C。Amazon S3 使用一或多個這些演算法來計算額外的檢查總和值,並將其儲存為物件中繼資料的一部分。如需總和檢查的詳細資訊,請參閱 檢查物件完整性

目標

在本教學課程中,您將了解如何透過 AWS 命令列介面 (AWS Word),使用分段上傳和額外的 SHA-256 檢查總和,將物件上傳至 Amazon S3CLI。您也將了解如何透過計算上傳物件的 MD5 雜湊和 SHA-256 檢查總和來檢查物件的資料完整性。

必要條件

  • 開始本教學課程之前,請確定您能夠存取可上傳的 Amazon S3 儲存貯體。如需詳細資訊,請參閱建立儲存貯體

  • 您必須安裝並設定 AWS CLI。如果您沒有安裝 AWS CLI,請參閱 AWS Command Line Interface 使用者指南中的安裝或更新至最新版本的 AWS CLI

  • 或者,您可以使用 AWS CloudShell. AWS CloudShell 是一種瀏覽器型、預先驗證的 Shell,直接從 啟動,從主控台執行 AWS CLI 命令 AWS Management Console。如需詳細資訊,請參閱 AWS CloudShell 使用者指南中的什麼 is CloudShell?入門 AWS CloudShell

步驟 1:建立大型檔案

如果您已經準備好上傳檔案,則可以將檔案用於本教學課程。否則,請使用下列步驟建立 15 MB 檔案。如需與分段上傳相關的限制,請參閱 Amazon S3 分段上傳限制

建立大型檔案

使用下列其中一個命令來建立檔案,具體取決於您使用的作業系統。

Linux 或 macOS

若要建立 15 MB 檔案,請開啟本機終端機並執行下列命令:

dd if=/dev/urandom of=census-data.bin bs=1M count=15

此命令會建立名為 的檔案,census-data.bin其中填充了隨機位元組,大小為 15 MB。

Windows

若要建立 15 MB 檔案,請開啟本機終端機並執行下列命令:

fsutil file createnew census-data.bin 15728640

此命令會建立名為 的檔案,其大小census-data.bin為 15 MB 的任意資料 (15728640 位元組)。

步驟 2:將檔案分割成多個檔案

若要執行分段上傳,您必須將大型檔案分割為較小的部分。然後,您可以使用分段上傳程序來上傳較小的部分。此步驟示範如何將步驟 1 中建立的大型檔案分割為較小的部分。下列範例使用名為 的 15 MB 檔案census-data.bin

將大型檔案分割為部分

Linux 或 macOS

若要將大型檔案分割為 5 MB 部分,請使用 split命令。開啟您的終端機並執行下列動作:

split -b 5M -d census-data.bin census-part

此命令會分割census-data.bin為 5 MB 的 部分census-part**,其中 ** 是從 開始的數字尾碼00

Windows

若要分割大型檔案,請使用 PowerShell。開啟 Powershell,然後執行下列指令碼:

$inputFile = "census-data.bin" $outputFilePrefix = "census-part" $chunkSize = 5MB $fs = [System.IO.File]::OpenRead($inputFile) $buffer = New-Object byte[] $chunkSize $fileNumber = 0 while ($fs.Position -lt $fs.Length) { $bytesRead = $fs.Read($buffer, 0, $chunkSize) $outputFile = "{0}{1:D2}" -f $outputFilePrefix, $fileNumber $fileStream = [System.IO.File]::Create($outputFile) $fileStream.Write($buffer, 0, $bytesRead) $fileStream.Close() $fileNumber++ } $fs.Close()

此 PowerShell 指令碼會以 5 MB 的區塊讀取大型檔案,並將每個區塊寫入具有數值尾碼的新檔案。

執行適當的命令後,您應該會在執行命令的目錄中看到這些部分。每個部分都會有一個對應其零件號碼的尾碼,例如:

census-part00 census-part01 census-part02

步驟 3:使用額外的總和檢查碼建立分段上傳

若要開始分段上傳程序,您需要建立分段上傳請求。此步驟涉及啟動分段上傳,並指定額外的資料完整性檢查總和。下列範例使用 SHA-256 檢查總和。如果您想要提供任何描述要上傳之物件的中繼資料,您必須在請求中提供該中繼資料,以啟動分段上傳。

注意

在此步驟和後續步驟中,本教學課程使用 SHA-256 其他演算法。您可以選擇性地針對這些步驟使用其他檢查總和,例如 CRC32、CRC32C 或 SHA-1。如果您使用不同的演算法,則必須在整個教學步驟中使用它。

若要開始分段上傳

在終端機中,使用下列create-multipart-upload命令來啟動儲存貯體的分段上傳。amzn-s3-demo-bucket1 以實際儲存貯體名稱取代 。此外,請將 取代census_data_file為您選擇的檔案名稱。此檔案名稱會在上傳完成時成為物件金鑰。

aws s3api create-multipart-upload --bucket amzn-s3-demo-bucket1 --key 'census_data_file' --checksum-algorithm sha256

如果您的請求成功,您會看到如下所示的 JSON 輸出:

{ "ServerSideEncryption": "AES256", "ChecksumAlgorithm": "SHA256", "Bucket": "amzn-s3-demo-bucket1", "Key": "census_data_file", "UploadId": "cNV6KCSNANFZapz1LUGPC5XwUVi1n6yUoIeSP138sNOKPeMhpKQRrbT9k0ePmgoOTCj9K83T4e2Gb5hQvNoNpCKqyb8m3.oyYgQNZD6FNJLBZluOIUyRE.qM5yhDTdhz" }
注意

當您傳送要求要啟動分段上傳時,Amazon S3 會傳回具有上傳 ID 的回應,其為分段上傳的唯一識別符。每次上傳分段各組件、列出各組件、完成上傳或停止上傳時,都必須納入此上傳 ID。您需要使用 UploadIdKeyBucket值進行後續步驟,因此請務必儲存這些值。

此外,如果您使用分段上傳搭配其他檢查總和,則零件編號必須為連續。如果您使用非連續的零件編號,complete-multipart-upload請求可能會導致 HTTP 500 Internal Server Error

步驟 4:上傳分段上傳的部分

在此步驟中,您會將分段上傳的部分上傳至 S3 儲存貯體。使用 upload-part命令個別上傳每個部分。此程序需要指定上傳 ID、零件編號,以及每個零件要上傳的檔案。

上傳組件
  1. 上傳零件時,除了上傳 ID 之外,您還必須使用 --part-number 引數指定零件編號。您可選擇 1 到 10,000 之間的任何組件編號。組件編號可找出獨特的某個組件,以及其在上傳中物件內的位置。您選擇的零件編號必須連續排列 (例如,可以是 1、2 或 3)。若使用和前一個上傳組件相同的組件編號上傳新的組件,將會覆寫前一個已上傳的組件。

  2. 使用 upload-part命令來上傳分段上傳的每個部分。與步驟 3create-multipart-upload命令建立的輸出中的--upload-id相同。若要上傳資料的第一部分,請使用下列命令:

    aws s3api upload-part --bucket amzn-s3-demo-bucket1 --key 'census_data_file' --part-number 1 --body census-part00 --upload-id "cNV6KCSNANFZapz1LUGPC5XwUVi1n6yUoIeSP138sNOKPeMhpKQRrbT9k0ePmgoOTCj9K83T4e2Gb5hQvNoNpCKqyb8m3.oyYgQNZD6FNJLBZluOIUyRE.qM5yhDTdhz" --checksum-algorithm SHA256

    完成每個upload-part命令後,您應該會看到輸出,如下所示:

    { "ServerSideEncryption": "AES256", "ETag": "\"e611693805e812ef37f96c9937605e69\"", "ChecksumSHA256": "QLl8R4i4+SaJlrl8ZIcutc5TbZtwt2NwB8lTXkd3GH0=" }
  3. 對於後續的零件,相應地增加零件編號:

    aws s3api upload-part --bucket amzn-s3-demo-bucket1 --key 'census_data_file' --part-number <part-number> --body <file-path> --upload-id "<your-upload-id>" --checksum-algorithm SHA256

    例如,使用下列命令來上傳第二個部分:

    aws s3api upload-part --bucket amzn-s3-demo-bucket1 --key 'census_data_file' --part-number 2 --body census-part01 --upload-id "cNV6KCSNANFZapz1LUGPC5XwUVi1n6yUoIeSP138sNOKPeMhpKQRrbT9k0ePmgoOTCj9K83T4e2Gb5hQvNoNpCKqyb8m3.oyYgQNZD6FNJLBZluOIUyRE.qM5yhDTdhz" --checksum-algorithm SHA256

    Amazon S3 會傳回實體標籤 (ETag) 和每個上傳部分的其他檢查總和,作為回應中的標頭。

  4. 繼續使用 upload-part命令,直到您已上傳物件的所有部分為止。

步驟 5:列出分段上傳的所有部分

若要完成分段上傳,您需要已上傳該特定分段上傳的所有分段清單。list-parts 命令的輸出提供儲存貯體名稱、金鑰、上傳 ID、零件編號、eTag、其他總和檢查碼等資訊。將此輸出儲存在檔案中很有幫助,以便您可以在完成分段上傳程序時將其用於下一個步驟。您可以使用下列方法建立名為 parts.json的 JSON 輸出檔案。

建立列出所有部分的檔案
  1. 若要產生包含所有上傳部分詳細資訊的 JSON 檔案,請使用下列list-parts命令。amzn-s3-demo-bucket1 將 取代為您實際的儲存貯體名稱,並將 <your-upload-id>取代為您在步驟 3 中收到的上傳 ID。如需 list-parts 命令的詳細資訊,請參閱 list-parts (在 AWS Command Line Interface 使用者指南中)

    aws s3api list-parts --bucket amzn-s3-demo-bucket1 --key 'census_data_file' --upload-id <your-upload-id> --query '{Parts: Parts[*].{PartNumber: PartNumber, ETag: ETag, ChecksumSHA256: ChecksumSHA256}}' --output json > parts.json

    parts.json 會產生名為 的新檔案。檔案包含所有已上傳部分的 JSON 格式資訊。parts.json 檔案包含分段上傳每個部分的基本資訊,例如分段編號及其對應的 ETag 值,這些都是完成分段上傳程序的必要資訊。

  2. 使用任何文字編輯器或透過終端機parts.json開啟 。以下是輸出範例:

    { "Parts": [ { "PartNumber": 1, "ETag": "\"3c3097f89e2a2fece47ac54b243c9d97\"", "ChecksumSHA256": "fTPVHfyNHdv5VkR4S3EewdyioXECv7JBxN+d4FXYYTw=" }, { "PartNumber": 2, "ETag": "\"03c71cc160261b20ab74f6d2c476b450\"", "ChecksumSHA256": "VDWTa8enjOvULBAO3W2a6C+5/7ZnNjrnLApa1QVc3FE=" }, { "PartNumber": 3, "ETag": "\"81ae0937404429a97967dffa7eb4affb\"", "ChecksumSHA256": "cVVkXehUlzcwrBrXgPIM+EKQXPUvWist8mlUTCs4bg8=" } ] }

步驟 6:完成分段上傳

上傳分段上傳的所有部分並列出後,最後一個步驟是完成分段上傳。此步驟會將所有上傳的部分合併到 S3 儲存貯體中的單一物件。

注意

您可以在呼叫 之前計算物件總和檢查碼,complete-multipart-upload方法是將 納入您的請求--checksum-sha256中。如果總和檢查碼不相符,Amazon S3 會失敗請求。如需詳細資訊,請參閱 complete-multipart-upload (在 AWS Command Line Interface 使用者指南中)

若要完成分段上傳

若要完成分段上傳,請使用 complete-multipart-upload命令。此命令需要步驟 5 中建立parts.json的檔案、儲存貯體名稱和上傳 ID。<amzn-s3-demo-bucket1> 將 取代為您的儲存貯體名稱,並將 <your-upload-id>取代為上傳 IDparts.json

aws s3api complete-multipart-upload --multipart-upload file://parts.json --bucket amzn-s3-demo-bucket1 --key 'census_data_file' --upload-id <your-upload-id>

以下是輸出範例:

{ "ServerSideEncryption": "AES256", "Location": "https://amzn-s3-demo-bucket1.s3.us-east-2.amazonaws.com/census_data_file", "Bucket": "amzn-s3-demo-bucket1", "Key": "census_data_file", "ETag": "\"f453c6dccca969c457efdf9b1361e291-3\"", "ChecksumSHA256": "aI8EoktCdotjU8Bq46DrPCxQCGuGcPIhJ51noWs6hvk=-3" }
注意

還不要刪除個別的零件檔案。您需要個別的 部分,才能對它們執行檢查總和,以驗證合併在一起物件的完整性。

步驟 7:確認物件已上傳至您的儲存貯體

完成分段上傳後,您可以驗證物件是否已成功上傳至 S3 儲存貯體。若要列出儲存貯體中的物件並確認新上傳的檔案是否存在,請使用 list-objects-v2命令

列出上傳的物件

若要列出 中的物件,請使用 list-objects-v2 命令儲存貯體。amzn-s3-demo-bucket1 以實際儲存貯體名稱取代:

aws s3api list-objects-v2 --bucket amzn-s3-demo-bucket1

此命令會傳回儲存貯體中的物件清單。在物件清單中尋找上傳的檔案 (例如 census_data_file)。

如需詳細資訊,請參閱 AWS Command Line Interface 使用者指南中的 list-objects-v2命令的範例一節。

步驟 8:使用 MD5 檢查總和驗證物件完整性

當您上傳物件時,您可以指定 Amazon S3 要使用的檢查總和演算法。根據預設,Amazon S3 會將位元組的 MD5 摘要儲存為物件的 ETag。對於分段上傳,ETag 不是整個物件的檢查總和,而是每個部分檢查總和的複合。

使用 MD5 檢查總和驗證物件完整性
  1. 若要擷取上傳物件的 ETag,請執行head-object請求:

    aws s3api head-object --bucket amzn-s3-demo-bucket1 --key census_data_file

    以下是輸出範例:

    { "AcceptRanges": "bytes", "LastModified": "2024-07-26T19:04:13+00:00", "ContentLength": 16106127360, "ETag": "\"f453c6dccca969c457efdf9b1361e291-3\"", "ContentType": "binary/octet-stream", "ServerSideEncryption": "AES256", "Metadata": {} }

    此 etag 已將 "-3" 附加至結尾。這表示物件是使用分段上傳以三個部分的方式上傳。

  2. 接下來,使用 md5sum命令計算每個部分的 MD5 檢查總和。請確定您為零件檔案提供正確的路徑:

    md5sum census-part*

    以下是輸出範例:

    e611693805e812ef37f96c9937605e69 census-part00 63d2d5da159178785bfd6b6a5c635854 census-part01 95b87c7db852451bb38b3b44a4e6d310 census-part02
  3. 對於此步驟,手動將 MD5 雜湊合併為一個字串。然後,執行下列命令,將字串轉換為二進位,並計算二進位值的 MD5 檢查總和:

    echo "e611693805e812ef37f96c9937605e6963d2d5da159178785bfd6b6a5c63585495b87c7db852451bb38b3b44a4e6d310" | xxd -r -p | md5sum

    以下是輸出範例:

    f453c6dccca969c457efdf9b1361e291 -

    此雜湊值應與步驟 1 中原始 ETag 值的雜湊值相符,這會驗證census_data_file物件的完整性。

當您指示 Amazon S3 使用額外的檢查總和時,Amazon S3 會計算每個部分的檢查總和值並儲存這些值。如果您想要擷取仍在進行分段上傳之個別部分的檢查總和值,您可以使用 list-parts

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

步驟 9:使用額外的檢查總和驗證物件完整性

在此步驟中,本教學課程使用 SHA-256 作為額外的檢查總和,以驗證物件完整性。如果您已使用不同的額外檢查總和,請改用該檢查總和值。

使用 SHA256 驗證物件完整性
  1. 在終端機中執行下列命令,包括--checksum-mode enabled引數,以顯示物件ChecksumSHA256的值:

    aws s3api head-object --bucket amzn-s3-demo-bucket1 --key census_data_file --checksum-mode enabled

    以下是輸出範例:

    { "AcceptRanges": "bytes", "LastModified": "2024-07-26T19:04:13+00:00", "ContentLength": 16106127360, "ChecksumSHA256": "aI8EoktCdotjU8Bq46DrPCxQCGuGcPIhJ51noWs6hvk=-3", "ETag": "\"f453c6dccca969c457efdf9b1361e291-3\"", "ContentType": "binary/octet-stream", "ServerSideEncryption": "AES256", "Metadata": {} }
  2. 使用下列命令將個別部分ChecksumSHA256的值解碼為 base64,並將其儲存到名為 的二進位檔案中outfile。這些值可在您的parts.json檔案中找到。將範例 base64 字串取代為您的ChecksumSHA256實際值。

    echo "QLl8R4i4+SaJlrl8ZIcutc5TbZtwt2NwB8lTXkd3GH0=" | base64 --decode >> outfile echo "xCdgs1K5Bm4jWETYw/CmGYr+m6O2DcGfpckx5NVokvE=" | base64 --decode >> outfile echo "f5wsfsa5bB+yXuwzqG1Bst91uYneqGD3CCidpb54mAo=" | base64 --decode >> outfile
  3. 執行下列命令來計算 的 SHA256 檢查總和outfile

    sha256sum outfile

    以下是輸出範例:

    688f04a24b42768b6353c06ae3a0eb3c2c50086b8670f221279d67a16b3a86f9 outfile

    在下一個步驟中,取得雜湊值並將其轉換為二進位值。此二進位值應與步驟 1 中的ChecksumSHA256值相符。

  4. 步驟 3 的 SHA256 檢查總和轉換為二進位,然後將其編碼為 base64,以確認其符合步驟 1 ChecksumSHA256的值:

    echo "688f04a24b42768b6353c06ae3a0eb3c2c50086b8670f221279d67a16b3a86f9" | xxd -r -p | base64

    以下是輸出範例:

    aI8EoktCdotjU8Bq46DrPCxQCGuGcPIhJ51noWs6hvk=

    此輸出應確認 base64 輸出符合head-object來自命令輸出ChecksumSHA256的值。如果輸出符合總和檢查值,則物件有效。

重要
  • 當您指示 Amazon S3 使用其他檢查總和時,Amazon S3 會計算每個部分的檢查總和值,並存放這些值。

  • 如果您想要擷取仍在進行分段上傳之個別部分的檢查總和值,您可以使用 list-parts命令。

步驟 10:清理您的資源

如果您想要清除在本教學課程中建立的檔案,請使用下列方法。如需刪除上傳至 S3 儲存貯體的檔案的說明,請參閱 刪除 Amazon S3 物件

刪除在步驟 1 中建立的本機檔案:

若要移除您為分段上傳建立的檔案,請從您的工作目錄中執行下列命令:

rm census-data.bin census-part* outfile parts.json