如何將所有物件從一個 Amazon S3 儲存貯體複製到另一個儲存貯體?

上次更新日期:2022 年 11 月 10 日

我想將所有物件從一個 Amazon Simple Storage Service (Amazon S3) 儲存貯體複製或至另一個儲存貯體。如何在 S3 儲存貯體之間遷移物件?

簡短描述

若要將物件從一個 S3 儲存貯體複製到另一個,請執行以下步驟:

1.    建立一個新的 S3 儲存貯體。

2.    安裝並設定 AWS Command Line Interface (AWS CLI)。

3.    在 S3 儲存貯體之間複製物件。

注意:在大型儲存貯體 (包含 1,000 萬個物件或更多) 上使用 aws s3 lsaws s3 sync 命令可能會很昂貴,從而導致逾時。若您因大型儲存貯體而遇到逾時,那麼請考慮使用 Amazon CloudWatch 指標來計算儲存貯體中物件的大小和數目。此外,請考慮使用 S3 批次操作來複製物件。

4.    驗證物件是否已複製。

5.    將現有 API 呼叫更新為目標儲存貯體名稱。

在開始之前,請考慮以下事項:

解決方案

建立一個新的 S3 儲存貯體

1.    開啟 Amazon S3 console (Amazon S3 主控台)。

2.    選擇 Create Bucket (建立儲存貯體)。

3.    為您的新儲存貯體選擇一個 DNS 合規名稱

4.    選擇您的 AWS 區域。

提示:為避免跨區域流量導致的效能問題,請在與來源儲存貯體相同的區域中建立目標儲存貯體。

5.    或者,選擇 Copy settings from an existing bucket (從現有儲存貯體中複製設定),以鏡像來源儲存貯體的組態。

安裝並設定 AWS CLI

1.    安裝 AWS CLI

2.    透過執行以下命令來設定 AWS CLI:

aws configure

注意:如果您在執行 AWS CLI 命令時收到錯誤,請確保您使用的是最新版 AWS CLI

3.    輸入您的存取金鑰 (存取金鑰 ID 和私密存取金鑰)

4.    按 Enter 跳過預設區域和預設輸出選項。如需有關 Amazon S3 區域參數的詳細資訊,請參閱 AWS 服務端點

注意:AWS CLI 輸出是 JSON、文字或表格,但並非所有命令均支援每種類型的輸出。如需詳細資訊,請參閱控制 AWS CLI 的命令輸出

在 S3 儲存貯體之間複製物件

1.    如果您在 Amazon Simple Storage Service Glacier 儲存類別中封存了 S3 物件,那麼請還原物件

2.    使用 AWS CLI 執行以下 sync 命令,在來源儲存貯體和目標儲存貯體之間複製物件:

aws s3 sync s3://DOC-EXAMPLE-BUCKET-SOURCE s3://DOC-EXAMPLE-BUCKET-TARGET

注意:更新 sync 命令,以包含您的來源和目標儲存貯體名稱。

sync 命令使用 CopyObject API 在 S3 儲存貯體之間複製物件。sync 命令列出來源儲存貯體和目標儲存貯體,以識別在源儲存貯體但不在目標儲存貯體的物件。該命令還會識別來源儲存貯體與目標儲存貯體中,具有不同 LastModified 日期的物件。在版本控制儲存貯體上使用 sync 命令時,只會複製物件的目前版本 - 不會複製之前的版本。根據預設,此行為會保留物件中繼資料。

如果來源儲存貯體啟用了存取控制清單 (ACL),那麼 ACL 就不會被複製到目標儲存貯體。不論是否在目標儲存貯體上啟用 ACL,情況都是如此。如果來源和目標儲存貯體均啟用了 ACL,則目標物件 ACL 會向執行複製的帳戶授與 FUL_CONTROL。如果操作失敗,那麼您可以再次執行 sync 命令,而無需複製之前複製的物件。若要對 sync 操作問題進行疑難排解,請參閱為什麼不能在兩個 Amazon S3 儲存貯體之間複製物件?

3.    (選用) 如果遇到逾時,那麼請使用 cloudwatch get-metric-statistics 命令來計算儲存貯體中的物件數目:

$ aws cloudwatch get-metric-statistics --namespace AWS/S3 --metric-name NumberOfObjects --dimensions Name=BucketName,Value=DOC-EXAMPLE-BUCKET-SOURCE Name=StorageType,Value=AllStorageTypes --start-time 2021-05-11T00:00 --end-time 2021-05-11T00:10 --period 600 --statistic Average --output json

4.    (選用) 如果遇到逾時,那麼請使用 cloudwatch get-metric-statistics 命令來擷取您的儲存貯體大小:

$ aws cloudwatch get-metric-statistics --namespace AWS/S3 --metric-name BucketSizeBytes --dimensions Name=BucketName,Value=DOC-EXAMPLE-BUCKET-SOURCE Name=StorageType,Value=StandardStorage --start-time 2021-05-11T00:00 --end-time 2021-05-11T00:10 --period 3600 --statistics Average --unit Bytes --output json

注意:Listcalls 可能非常昂貴,導致命令逾時。針對大型儲存貯體,請考慮使用 Amazon CloudWatch 指標,來計算儲存貯體的大小和物件總數。但是,由於 Amazon CloudWatch 指標每天僅提取一次,因此,報告的物件計數和儲存貯體大小可能與 list 命令結果不同。

驗證物件是否已複製

1.    執行以下命令來驗證來源和目標儲存貯體的內容:

aws s3 ls --recursive s3://DOC-EXAMPLE-BUCKET-SOURCE --summarize > bucket-contents-source.txt
        
aws s3 ls --recursive s3://DOC-EXAMPLE-BUCKET-TARGET --summarize > bucket-contents-target.txt

注意:更新 list 命令,以包含您的來源和目標儲存貯體名稱。

2.    使用儲存至 AWS CLI 目錄中檔案的輸出,來比較來源儲存貯體和目標儲存貯體中的物件。請參閱以下範例輸出:

$ aws s3 ls --recursive s3://DOC-EXAMPLE-BUCKET --summarize
2017-11-20 21:17:39      15362 s3logo.png

  Total Objects: 1        Total Size: 15362

將現有 API 呼叫更新為目標儲存貯體名稱

更新任何現有的應用程式或工作負載,以便其使用目標儲存貯體名稱。如果您頻繁寫入,可能需要執行 sync 命令,來解決來源儲存貯體和目標儲存貯體之間的差異。