跳至內容

如何使用 AWS CLI 將大型檔案分成多個部分上傳到 Amazon S3?

3 分的閱讀內容
0

我想要將一個大檔案分成多個部分複製到 Amazon Simple Storage Service (Amazon S3) 儲存貯體,或使用分段上傳。我想使用 AWS Command Line Interface (AWS CLI) 上傳檔案。

簡短說明

使用具有高階 aws s3 命令或低階 aws s3api 命令的 AWS CLI,將大型檔案上傳至 Amazon S3。有關更多這兩個命令層的資訊,請參閱將 Amazon S3 與 AWS CLI 搭配使用

**重要:**最佳實務是使用 aws s3 命令 (例如 aws s3 cp) 進行分段上傳和下載。這是因為 aws s3 命令會根據檔案大小自動執行分段上傳和下載。只有當 aws s3 命令不支援特定上傳作業時,才使用 aws s3api 命令 (例如 aws s3api create-multipart-upload)。例如,分段上傳涉及多個伺服器,或者您手動停止分段上傳並在之後繼續時。或者,aws s3 命令不支援必要的請求參數。

解決方法

**注意:**如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤,請參閱AWS CLI 錯誤疑難排解。此外,請確認您使用的是最新的 AWS CLI 版本

上傳檔案前,請計算檔案的 MD5 總和檢查碼值,作為上傳後完整性檢查的參考依據。

使用 aws s3 命令

若要使用高階 aws s3 命令進行分段上傳,請執行以下 cp 命令:

aws s3 cp large_test_file s3://DOC-EXAMPLE-BUCKET/

注意: 請將 DOC-EXAMPLE-BUCKET 替換為您的儲存貯體名稱。

上述範例使用 aws s3 cp 命令,當物件較大時會自動執行分段上傳。您也可以使用其他 aws s3 命令,將物件上傳至 S3 儲存貯體。例如,使用 aws s3 syncaws s3 mv

以多個部分上傳至 Amazon S3 的物件,其 ETag 格式與使用 PUT 請求上傳的物件不同。若要將來源檔案的 MD5 總和檢查碼值作為參考儲存,請在上傳檔案時,將該總和檢查碼值作為自訂中繼資料一併上傳。若要將 MD5 檢查碼 值新增為自訂中繼資料,請在上傳命令中加入選用參數 --metadata,如以下範例所示:

aws s3 cp large_test_file s3://DOC-EXAMPLE-BUCKET/ --metadata md5="examplemd5value1234"

注意: 請將 large_test_file 替換為要上傳的檔案名稱,將 DOC-EXAMPLE-BUCKET 替換為您的儲存貯體名稱,並將 examplemd5value1234 替換為您的 MD5 值。

若要使用更多主機的頻寬與資源,請提高在 AWS CLI S3 組態中設定的最大並行請求數。依預設,AWS CLI 使用最多 10 個並行請求。請執行以下 configure 命令,將最大並行請求數設定為 20:

aws configure set default.s3.max_concurrent_requests 20

使用 aws s3api 命令

  1. 將您要上傳的檔案分割為多個部分。
    **提示:**如果您使用的是 Linux 作業系統,請使用 split 命令。

  2. 若要啟動分段上傳並擷取相關的上傳 ID,請執行以下 create-multipart-upload 命令:

    aws s3api create-multipart-upload --bucket DOC-EXAMPLE-BUCKET --key large_test_file

    注意: 請將 DOC-EXAMPLE-BUCKET 替換為您的儲存貯體名稱,並將 large_test_file 替換為要上傳的檔案名稱。

    此命令會傳回包含 UploadID 的回應。

  3. 請複製 UploadID 值,作為後續步驟的參考。

  4. 若要上傳檔案的第一個部分,請執行以下 upload-part 命令:

    aws s3api upload-part --bucket DOC-EXAMPLE-BUCKET --key large_test_file --part-number 1 --body large_test_file.001 --upload-id exampleTUVGeKAk3Ob7qMynRKqe3ROcavPRwg92eA6JPD4ybIGRxJx9R0VbgkrnOVphZFK59KCYJAO1PXlrBSW7vcH7ANHZwTTf0ovqe6XPYHwsSp7eTRnXB1qjx40Tk --content-md5 exampleaAmjr+4sRXUwf0w==
    

    注意: 請將 DOC-EXAMPLE-BUCKET 替換為您的儲存貯體名稱,並將 large_test_file 替換為要上傳的檔案名稱。請將 upload-id 值替換為 create-multipart-upload 命令輸出中的值。

    該命令會傳回一個回應,其中包含您上傳的檔案部分 ETag 值。

  5. 請將 ETag 的值複製下來,作為後續步驟的參考依據。

  6. 請對檔案的每個部分重複執行步驟 4 和 5。請確保每次上傳新的部分時,部份編號都有依序遞增。

  7. 在上傳所有檔案部分之後,請執行以下 list-parts 命令以列出已上傳的部分,並確認清單完整:

    aws s3api list-parts --bucket DOC-EXAMPLE-BUCKET --key large_test_file --upload-id exampleTUVGeKAk3Ob7qMynRKqe3ROcavPRwg92eA6JPD4ybIGRxJx9R0VbgkrnOVphZFK59KCYJAO1PXlrBSW7vcH7ANHZwTTf0ovqe6XPYHwsSp7eTRnXB1qjx40Tk
    

    注意: 請將 DOC-EXAMPLE-BUCKET 替換為您的儲存貯體名稱,並將 large_test_file 替換為要上傳的檔案名稱。請將 upload-id 值替換為 create-multipart-upload 命令輸出中的值。

  8. 將您上傳的每個檔案部分的 ETag 值彙整成一個 JSON 格式的檔案。
    JSON 檔案範例:

    {
        "Parts": [{
            "ETag": "example8be9a0268ebfb8b115d4c1fd3",
            "PartNumber":1
        },
    
        ....
    
        {
            "ETag": "example246e31ab807da6f62802c1ae8",
            "PartNumber":4
        }]
    }
  9. 請將檔案命名為 fileparts.json

  10. 若要完成分段上傳,請執行以下 complete-multipart-upload 命令:

aws s3api complete-multipart-upload --multipart-upload file://fileparts.json --bucket DOC-EXAMPLE-BUCKET --key large_test_file --upload-id exampleTUVGeKAk3Ob7qMynRKqe3ROcavPRwg92eA6JPD4ybIGRxJx9R0VbgkrnOVphZFK59KCYJAO1PXlrBSW7vcH7ANHZwTTf0ovqe6XPYHwsSp7eTRnXB1qjx40Tk

注意: 請將 --multipart-upload 的值替換為包含您所建立之 ETags 的 JSON 格式檔案路徑。請將 DOC-EXAMPLE-BUCKET 替換為您的儲存貯體名稱,並將 large_test_file 替換為要上傳的檔案名稱。請將 upload-id 值替換為 list-multipart-uploads 命令輸出中的值。

  1. 如果上述命令成功執行,那麼您會收到類似以下內容的回應:
{
    "ETag": "\\"exampleae01633ff0af167d925cad279-2\\"",
    "Bucket": "DOC-EXAMPLE-BUCKET",
    "Location": "https://DOC-EXAMPLE-BUCKET.s3.amazonaws.com/large_test_file",

    "Key": "large_test_file"
}

解決上傳失敗問題

如果您使用高階 aws s3 命令進行分段上傳時上傳失敗,則必須啟動新的分段上傳。分段上傳失敗通常是因為逾時或手動取消所導致。大多數情況下,AWS CLI 會自動取消分段上傳,然後移除您建立的所有分段檔案。此程序可能需要幾分鐘。如果您使用 aws s3api 命令且該程序中斷,請移除未完成的上傳部分,然後重新上傳這些部分。

若要移除未完成的部分,請使用 AbortIncompleteMultipartUpload 生命週期動作。或者,使用 aws s3api 命令移除不完整的部分。

  1. 若要列出未完成的分段檔案上傳,請執行以下 list-multipart-uploads 命令:

    aws s3api list-multipart-uploads --bucket DOC-EXAMPLE-BUCKET
    

    注意: 請將 DOC-EXAMPLE-BUCKET 替換為您的儲存貯體名稱。

  2. 此命令會傳回包含任何未處理檔案部分的訊息,如以下範例所示:

    {
        "Uploads": [
            {
    
        "Initiator": {
                    "DisplayName": "multipartmessage",
                    "ID": "290xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
        "
                },
                "Initiated": "2016-03-31T06:13:15.000Z",
    
        "UploadId": "examplevQpHp7eHc_J5s9U.kzM3GAHeOJh1P8wVTmRqEVojwiwu3wPX6fWYzADNtOHklJI6W6Q9NJUYgjePKCVpbl_rDP6mGIr2AQJNKB_A-",
                "StorageClass": "STANDARD",
    
        "Key": "",
                "Owner": {
                    "DisplayName": "multipartmessage",
    
        "ID": "290xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx "
                }
            }
       ]
    }
  3. 若要移除未完成的部分,請執行以下 abort-multipart-upload 命令:

    aws s3api abort-multipart-upload --bucket DOC-EXAMPLE-BUCKET --key large_test_file --upload-id examplevQpHp7eHc_J5s9U.kzM3GAHeOJh1P8wVTmRqEVojwiwu3wPX6fWYzADNtOHklJI6W6Q9NJUYgjePKCVpbl_rDP6mGIr2AQJNKB

    注意: 請將 DOC-EXAMPLE-BUCKET 替換為您的儲存貯體名稱,並將 large_test_file 替換為要上傳的檔案名稱。請將 upload-id 值替換為 list-multipart-uploads 命令輸出中的值。

相關資訊

在 Amazon S3 中使用分段上傳功能上傳複製物件