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

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

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

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

您可以使用檢查總和來驗證資產在複製之後保持不變。執行檢查總和涉及使用演算法來循序逐一查看檔案中的每個位元組。Amazon S3 提供多種檢查總和選項,用於檢查資料的完整性。建議您執行這些完整性檢查,以作為耐久性最佳實務,並確認每個位元組在未變更的情況下傳輸。Amazon S3 也支援下列演算法:SHA-1、SHA-256、CRC32 和 CRC32C。Amazon S3 使用上述一或多個演算法來計算額外檢查總和值,並將其儲存為物件中繼資料的一部分。如需總和檢查的詳細資訊,請參閱 在 Amazon S3 中檢查物件完整性

目標

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

先決條件

  • 開始本教學課程之前,請確定您能夠存取 Amazon S3 儲存貯體,以便上傳至其中。如需詳細資訊,請參閱建立一般用途儲存貯體

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

  • 或者,您也可以使用 ,從主控台執行 AWS CLI 命令 AWS CloudShell。 AWS CloudShell 是一種瀏覽器型、預先驗證的 Shell,您可以直接從 啟動 AWS Management Console。如需詳細資訊,請參閱《AWS CloudShell 使用者指南》中的什麼是 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 中建立的大型檔案分割成較小的組件。下列範例使用名為 census-data.bin 的 15 MB 檔案。

將大型檔案分割成組件

Linux 或 macOS

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

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

此命令會將 census-data.bin 分割成名為 census-part** 的 5 MB 組件,其中 ** 是從 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 命令上傳分段上傳的每個組件。--upload-id步驟 3create-multipart-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 命令的詳細資訊,請參閱《AWS Command Line Interface 使用者指南》中的list-parts

    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 儲存貯體中的單一物件。

注意

您可以在請求中加入 --checksum-sha256 來計算物件檢查總和,再呼叫 complete-multipart-upload。如果檢查總和不相符,Amazon S3 的請求會失敗。如需詳細資訊,請參閱《AWS Command Line Interface 使用者指南》中的 complete-multipart-upload

完成分段上傳

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

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

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

步驟 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. 執行下列命令來計算 outfile 的 SHA256 檢查總和:

    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