本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
教學課程:透過分段上傳上傳物件,並驗證其資料完整性
您可利用分段上傳,將單一物件以一組組件進行上傳。每個組件都是物件資料的接續部分。您可依任何順序分別上傳這些物件組件。若任何組件的傳輸失敗,您可再次傳輸該組件,而不會影響其他組件。當物件的所有組件都全部上傳完後,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。您需要使用 UploadId
、 Key
和 Bucket
值進行後續步驟,因此請務必儲存這些值。
此外,如果您使用分段上傳搭配其他檢查總和,則零件編號必須為連續。如果您使用非連續的零件編號,complete-multipart-upload
請求可能會導致 HTTP 500 Internal Server Error
。
步驟 4:上傳分段上傳的部分
在此步驟中,您會將分段上傳的部分上傳至 S3 儲存貯體。使用 upload-part
命令個別上傳每個部分。此程序需要指定上傳 ID、零件編號,以及每個零件要上傳的檔案。
上傳組件
-
上傳零件時,除了上傳 ID 之外,您還必須使用
--part-number
引數指定零件編號。您可選擇 1 到 10,000 之間的任何組件編號。組件編號可找出獨特的某個組件,以及其在上傳中物件內的位置。您選擇的零件編號必須連續排列 (例如,可以是 1、2 或 3)。若使用和前一個上傳組件相同的組件編號上傳新的組件,將會覆寫前一個已上傳的組件。 -
使用
upload-part
命令來上傳分段上傳的每個部分。與步驟 3 中create-multipart-upload
命令建立的輸出中的--upload-id
相同。若要上傳資料的第一部分,請使用下列命令:aws s3api upload-part --bucket
amzn-s3-demo-bucket1
--key 'census_data_file
' --part-number1
--bodycensus-part00
--upload-id "cNV6KCSNANFZapz1LUGPC5XwUVi1n6yUoIeSP138sNOKPeMhpKQRrbT9k0ePmgoOTCj9K83T4e2Gb5hQvNoNpCKqyb8m3.oyYgQNZD6FNJLBZluOIUyRE.qM5yhDTdhz
" --checksum-algorithmSHA256
完成每個
upload-part
命令後,您應該會看到輸出,如下所示:{ "ServerSideEncryption": "AES256", "ETag": "\"e611693805e812ef37f96c9937605e69\"", "ChecksumSHA256": "QLl8R4i4+SaJlrl8ZIcutc5TbZtwt2NwB8lTXkd3GH0=" }
-
對於後續的零件,相應地增加零件編號:
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 SHA256Amazon S3 會傳回實體標籤 (ETag) 和每個上傳部分的其他檢查總和,作為回應中的標頭。
-
繼續使用
upload-part
命令,直到您已上傳物件的所有部分為止。
步驟 5:列出分段上傳的所有部分
若要完成分段上傳,您需要已上傳該特定分段上傳的所有分段清單。list-parts
命令的輸出提供儲存貯體名稱、金鑰、上傳 ID、零件編號、eTag、其他總和檢查碼等資訊。將此輸出儲存在檔案中很有幫助,以便您可以在完成分段上傳程序時將其用於下一個步驟。您可以使用下列方法建立名為 parts.json
的 JSON 輸出檔案。
建立列出所有部分的檔案
-
若要產生包含所有上傳部分詳細資訊的 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.jsonparts.json
會產生名為 的新檔案。檔案包含所有已上傳部分的 JSON 格式資訊。parts.json
檔案包含分段上傳每個部分的基本資訊,例如分段編號及其對應的 ETag 值,這些都是完成分段上傳程序的必要資訊。 -
使用任何文字編輯器或透過終端機
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 檢查總和驗證物件完整性
-
若要擷取上傳物件的 ETag,請執行
head-object
請求:aws s3api head-object --bucket
amzn-s3-demo-bucket1
--keycensus_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" 附加至結尾。這表示物件是使用分段上傳以三個部分的方式上傳。
-
接下來,使用
md5sum
命令計算每個部分的 MD5 檢查總和。請確定您為零件檔案提供正確的路徑:md5sum census-part*
以下是輸出範例:
e611693805e812ef37f96c9937605e69 census-part00 63d2d5da159178785bfd6b6a5c635854 census-part01 95b87c7db852451bb38b3b44a4e6d310 census-part02
-
對於此步驟,手動將 MD5 雜湊合併為一個字串。然後,執行下列命令,將字串轉換為二進位,並計算二進位值的 MD5 檢查總和:
echo "
e611693805e812ef37f96c9937605e6963d2d5da159178785bfd6b6a5c63585495b87c7db852451bb38b3b44a4e6d310
" | xxd -r -p | md5sum以下是輸出範例:
f453c6dccca969c457efdf9b1361e291 -
此雜湊值應與步驟 1 中原始 ETag 值的雜湊值相符,這會驗證
census_data_file
物件的完整性。
當您指示 Amazon S3 使用額外的檢查總和時,Amazon S3 會計算每個部分的檢查總和值並儲存這些值。如果您想要擷取仍在進行分段上傳之個別部分的檢查總和值,您可以使用 list-parts
。
如需檢查總和如何使用分段上傳物件的詳細資訊,請參閱 檢查物件完整性。
步驟 9:使用額外的檢查總和驗證物件完整性
在此步驟中,本教學課程使用 SHA-256 作為額外的檢查總和,以驗證物件完整性。如果您已使用不同的額外檢查總和,請改用該檢查總和值。
使用 SHA256 驗證物件完整性
-
在終端機中執行下列命令,包括
--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": {} }
-
使用下列命令將個別部分
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 -
執行下列命令來計算 的 SHA256 檢查總和
outfile
:sha256sum outfile
以下是輸出範例:
688f04a24b42768b6353c06ae3a0eb3c2c50086b8670f221279d67a16b3a86f9 outfile
在下一個步驟中,取得雜湊值並將其轉換為二進位值。此二進位值應與步驟 1 中的
ChecksumSHA256
值相符。 -
將步驟 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