本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
教學課程:透過分段上傳來上傳物件並驗證其資料完整性
您可利用分段上傳,將單一物件以一組組件進行上傳。每個組件都是物件資料的接續部分。您可依任何順序分別上傳這些物件組件。若任何組件的傳輸失敗,您可再次傳輸該組件,而不會影響其他組件。當物件的所有組件都全部上傳完後,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。您必須使用 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
命令上傳分段上傳的每個組件。--upload-id
與步驟 3 中create-multipart-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
命令的詳細資訊,請參閱《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 值),完成分段上傳程序需要這些資訊。 -
使用任何文字編輯器或透過終端機開啟
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 檢查總和來驗證物件完整性
-
若要擷取上傳物件的 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
。
如需如何搭配分段上傳物件使用檢查總和的詳細資訊,請參閱在 Amazon S3 中檢查物件完整性。
步驟 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 -
執行下列命令來計算
outfile
的 SHA256 檢查總和: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