

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

# 教學課程：透過分段上傳來上傳物件並驗證其資料完整性
<a name="tutorial-s3-mpu-additional-checksums"></a>

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

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

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

**Topics**
+ [先決條件](#mpu-prerequisites)
+ [步驟 1：建立大型檔案](#create-large-file-step1)
+ [步驟 2：將檔案分割成多個檔案](#split-large-file-step2)
+ [步驟 3：建立具有額外檢查總和的分段上傳](#create-multipart-upload-step3)
+ [步驟 4：上傳分段上傳的組件](#upload-parts-step4)
+ [步驟 5：列出分段上傳的所有組件](#list-parts-step5)
+ [步驟 6：完成分段上傳](#complete-multipart-upload-step6)
+ [步驟 7：確認物件已上傳至您的儲存貯體](#confirm-upload-step7)
+ [步驟 8：使用 MD5 檢查總和驗證物件完整性](#verify-object-integrity-step8)
+ [步驟 9：使用額外檢查總和驗證物件完整性](#verify-object-integrity-sha256-step9)
+ [步驟 10：清理您的資源](#clean-up-step10)

## 先決條件
<a name="mpu-prerequisites"></a>
+ 開始本教學課程之前，請確定您能夠存取 Amazon S3 儲存貯體，以便上傳至其中。如需詳細資訊，請參閱[建立一般用途儲存貯體](create-bucket-overview.md)。
+  您必須安裝並設定 AWS CLI。如果您未安裝 AWS CLI，請參閱《AWS Command Line Interface 使用者指南》**中的[安裝或更新至 AWS CLI的最新版本](https://docs.aws.amazon.com//cli/latest/userguide/getting-started-install.html)。
+ 或者，您可以使用 ，從主控台執行 AWS CLI 命令 AWS CloudShell。 AWS CloudShell 是一種以瀏覽器為基礎的預先驗證 Shell，您可以直接從 啟動 AWS 管理主控台。如需詳細資訊，請參閱《AWS CloudShell 使用者指南》**中的[什麼是 CloudShell](https://docs.aws.amazon.com//cloudshell/latest/userguide/welcome.html) 和[開始使用 AWS CloudShell](https://docs.aws.amazon.com//cloudshell/latest/userguide/getting-started.html)。

## 步驟 1：建立大型檔案
<a name="create-large-file-step1"></a>

如果您已有可供上傳的檔案，則可以在本教學課程中使用該檔案。否則，請使用下列步驟建立 15 MB 的檔案。如需分段上傳的相關限制，請參閱[Amazon S3 分段上傳限制](qfacts.md)。

**建立大型檔案**

請根據您使用的作業系統，使用下列其中一個命令來建立檔案。

**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：將檔案分割成多個檔案
<a name="split-large-file-step2"></a>

若要執行分段上傳，您必須將大型檔案分割成較小的組件。然後，您可以使用分段上傳程序來上傳較小的組件。此步驟示範如何將[步驟 1](#create-large-file-step1) 中建立的大型檔案分割成較小的組件。下列範例使用名為 `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](https://learn.microsoft.com/en-us/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：建立具有額外檢查總和的分段上傳
<a name="create-multipart-upload-step3"></a>

若要開始分段上傳程序，您必須建立分段上傳請求。此步驟涉及啟動分段上傳，並為資料完整性指定額外檢查總和。下列範例使用 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：上傳分段上傳的組件
<a name="upload-parts-step4"></a>

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

**上傳組件**

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

1. 使用 `upload-part` 命令上傳分段上傳的每個組件。`--upload-id` 與[步驟 3](#create-multipart-upload-step3) 中 `create-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="
   }
   ```

1. 對於後續組件，請相應地遞增組件編號：

   ```
   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) 和額外檢查總和作為回應中的標頭。

1. 繼續使用 `upload-part` 命令，直到您已上傳物件的所有組件為止。

## 步驟 5：列出分段上傳的所有組件
<a name="list-parts-step5"></a>

若要完成分段上傳，您需要該特定分段上傳已上傳的所有組件清單。`list-parts` 命令輸出提供儲存貯體名稱、金鑰、上傳 ID、組件編號、ETag、額外檢查總和等資訊。請將此輸出儲存在檔案中，以便您能夠在完成分段上傳程序時將其用於後續步驟。您可以使用下列方法建立名為 `parts.json`的 JSON 輸出檔案。

**建立列出所有組件的檔案**

1. 若要產生具有所有上傳組件詳細資訊的 JSON 檔案，請使用下列 `list-parts` 命令。將 **{{amzn-s3-demo-bucket1}}** 取代為您實際的儲存貯體名稱，並將 **<your-upload-id>** 取代為您在[步驟 3](#create-multipart-upload-step3) 中收到的上傳 ID。如需 `list-parts` 命令的詳細資訊，請參閱《AWS Command Line Interface 使用者指南》**中的[https://docs.aws.amazon.com/cli/latest/reference/s3api/list-parts.html](https://docs.aws.amazon.com/cli/latest/reference/s3api/list-parts.html)。

   ```
   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 值)，完成分段上傳程序需要這些資訊。

1. 使用任何文字編輯器或透過終端機開啟 `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：完成分段上傳
<a name="complete-multipart-upload-step6"></a>

在分段上傳的所有組件都上傳並列出之後，最後一個步驟是完成分段上傳。此步驟會將所有上傳的組件合併為 S3 儲存貯體中的單一物件。

**注意**  
您可以在請求中加入 `--checksum-sha256` 來計算物件檢查總和，再呼叫 `complete-multipart-upload`。如果檢查總和不相符，Amazon S3 的請求會失敗。如需詳細資訊，請參閱《*AWS Command Line Interface 使用者指南》*中的 [https://docs.aws.amazon.com/cli/latest/reference/s3api/complete-multipart-upload.html](https://docs.aws.amazon.com/cli/latest/reference/s3api/complete-multipart-upload.html)。

**完成分段上傳**

若要完成分段上傳，請使用 `complete-multipart-upload` 命令。此命令需要[步驟 5](#list-parts-step5) 中建立的 `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：確認物件已上傳至您的儲存貯體
<a name="confirm-upload-step7"></a>

完成分段上傳之後，您可以確認物件是否已成功上傳至 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` 命令的[範例](https://docs.aws.amazon.com/cli/latest/reference/s3api/list-objects-v2.html)一節。

## 步驟 8：使用 MD5 檢查總和驗證物件完整性
<a name="verify-object-integrity-step8"></a>

當您上傳物件時，可指定 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" 附加至結尾。這表示使用分段上傳，將物件分三個組件上傳。

1. 接下來，使用 `md5sum` 命令計算每個組件的 MD5 檢查總和。請務必提供正確的組件檔案路徑：

   ```
   md5sum census-part*
   ```

   以下是範例輸出：

   ```
   e611693805e812ef37f96c9937605e69 census-part00
   63d2d5da159178785bfd6b6a5c635854 census-part01
   95b87c7db852451bb38b3b44a4e6d310 census-part02
   ```

1. 在此步驟中，手動將 MD5 雜湊合併為一個字串。然後，執行下列命令，將字串轉換為二進位，並計算二進位值的 MD5 檢查總和：

   ```
   echo "{{e611693805e812ef37f96c9937605e6963d2d5da159178785bfd6b6a5c63585495b87c7db852451bb38b3b44a4e6d310}}" | xxd -r -p | md5sum
   ```

   以下是範例輸出：

   ```
   f453c6dccca969c457efdf9b1361e291 -
   ```

   此雜湊值應符合[步驟 1](#create-large-file-step1) 中原始 ETag 值的雜湊值，才能驗證 `census_data_file` 物件的完整性。

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

如需如何搭配分段上傳物件使用檢查總和的詳細資訊，請參閱[在 Amazon S3 中檢查物件完整性](checking-object-integrity.md)。

## 步驟 9：使用額外檢查總和驗證物件完整性
<a name="verify-object-integrity-sha256-step9"></a>

在此步驟中，本教學課程使用 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": {}
   }
   ```

1. 使用下列命令，將個別組件的 `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
   ```

1. 執行下列命令來計算 `outfile` 的 SHA256 檢查總和：

   ```
   sha256sum outfile
   ```

   以下是範例輸出：

   ```
   688f04a24b42768b6353c06ae3a0eb3c2c50086b8670f221279d67a16b3a86f9 outfile
   ```

   在下一個步驟中，取得雜湊值並將其轉換為二進位值。此二進位值應符合[步驟 1](#create-large-file-step1) 中的 `ChecksumSHA256` 值。

1. 將[步驟 3](#create-multipart-upload-step3) 中的 SHA256 檢查總和轉換為二進位，然後將其編碼為 base64，以確認其是否符合[步驟 1](#create-large-file-step1) 中的 `ChecksumSHA256` 值：

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

   以下是範例輸出：

   ```
   aI8EoktCdotjU8Bq46DrPCxQCGuGcPIhJ51noWs6hvk=
   ```

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

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

## 步驟 10：清理您的資源
<a name="clean-up-step10"></a>

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

**刪除在[步驟 1](#create-large-file-step1) 中建立的本機檔案：**

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

```
rm {{census-data.bin}} census-part* outfile parts.json
```