複製、移動和重新命名物件 - Amazon Simple Storage Service

複製、移動和重新命名物件

CopyObject 操作會為已儲存在 Amazon S3 中的物件建立複本。

單一非敗即成 (atomic operation) 操作最多可以為 5 GB 的物件建立複本。但若複製的物件大於 5 GB,則必須使用 AWS CLI 或 AWS SDK 進行分段上傳。如需更多詳細資訊,請參閱 使用分段上傳來複製物件

注意

若要維持使用分段上傳作業時所上傳之物件的效能優勢,您必須使用 AWS CLI 或 AWS SDK,而非 S3 主控台,然後使用分段上傳來複製物件。如需更多詳細資訊,請參閱 使用分段上傳來複製物件

使用 CopyObject 操作,您可以:

  • 為物件建立其他複本。

  • 透過複製物件並刪除原始物件來重新命名物件。

  • 將物件從一個儲存貯體複製到或移至另一個儲存貯體,包括跨 AWS 區域 (例如從 us-west-1eu-west-2)。當您移動物件時,Amazon S3 會將物件複製到指定的目的地,然後刪除來源物件。

    注意

    跨 AWS 區域複製或移動物件會產生頻寬費用。如需詳細資訊,請參閱 Amazon S3 定價

  • 變更物件中繼資料。每個 Amazon S3 物件都有中繼資料。此中繼資料是一組名稱/值對。您可以在上傳物件時設定物件中繼資料。上傳物件之後,即無法修改物件中繼資料。修改物件中繼資料唯一的方式是製作物件的複本,再設定中繼資料。若要執行這項操作,請在複製操作中,將同一個物件設定為來源和目標。

    其中一些物件中繼資料是系統中繼資料,另一些則是使用者定義的中繼資料。您可以控制其中一些系統中繼資料。例如,您可以控制要用於物件的儲存類別和伺服器端加密類型。當您複製物件時,也會一併複製使用者控制的系統中繼資料及使用者定義的中繼資料。Amazon S3 會重設系統控制的中繼資料。例如,複製物件時,Amazon S3 會重設複製物件的建立日期。您不需要在複製請求中,設定這些由系統所控制的中繼資料值。

    複製物件時,可能會決定要更新部分的中繼資料值。例如,若來源物件設定為使用 S3 Standard 儲存體,可以為物件複本選擇使用 S3 Intelligent-Tiering。也有可能決定要改變來源物件上一部分的使用者定義中繼資料值。如果選擇在複製期間更新任何物件之使用者可設定的中繼資料 (系統或使用者定義),則您必須在要求中明確指定存在於來源物件上之所有使用者可設定的中繼資料,即使只變更其中一個中繼資料值亦然。

    注意

    使用 Amazon S3 主控台複製物件時,可能會收到錯誤訊息「複製的中繼資料無法驗證。」 主控台會使用標頭來擷取和設定物件的中繼資料。如果您的網路或瀏覽器組態修改網路請求,此行為可能會導致意外中繼資料 (例如修改的 Cache-Control 標頭) 寫入您複製的物件。Amazon S3 無法驗證此非預期的中繼資料。

    若要解決此問題,請檢查您的網路和瀏覽器組態,確保標頭不會遭到修改,例如 Cache-Control。如需詳細資訊,請參閱共同責任模式

    如需物件中繼資料的詳細資訊,請參閱「使用物件中繼資料」。

複製已封存和已還原的物件

若來源物件封存在 S3 Glacier Flexible Retrieval 或 S3 Glacier Deep Archive 中,即必須先還原暫存副本,才可將物件複製到其他儲存貯體。如需封存物件的資訊,請參閱 使用封存的物件

Amazon S3 主控台不支援對 S3 Glacier Flexible Retrieval 或 S3 Glacier Deep Archive 儲存類別中已還原的物件進行複製操作。若要複製這些已還原的物件,請使用 AWS Command Line Interface (AWS CLI)、AWS SDK 或 Amazon S3 REST API。

複製加密物件

Amazon S3 會自動加密複製到 S3 儲存貯體的所有新物件。若您未在複製請求中指定加密資訊,目標物件的加密設定會設為目的地儲存貯體的預設加密組態。根據預設,所有儲存貯體都有基本層級的加密組態,其中包含使用伺服器端加密與 Amazon S3 受管金鑰 (SSE-S3)。若目的地儲存貯體的預設加密組態使用伺服器端加密與 AWS Key Management Service (AWS KMS) 金鑰 (SSE-KMS) 或客戶提供的加密金鑰 (SSE-C),Amazon S3 會使用對應的 KMS 金鑰或客戶提供的金鑰,來加密目標物件複本。

複製物件時,如果您想為目標物件使用不同類型的加密設定,您可以請求 Amazon S3 使用 KMS 金鑰、Amazon S3 受管金鑰或客戶提供的金鑰來加密目標物件。如果請求中的加密設定與目的地儲存貯體的預設加密組態不同,會優先使用請求中的加密設定。如果要複製的來源物件以 SSE-C 加密,則您必須在請求中提供必要的加密資訊,Amazon S3 才能解密物件進行複製。如需更多詳細資訊,請參閱 使用加密來保護資料

複製物件時使用檢查總和

複製物件時,您可以選擇對物件使用不同的檢查總和演算法。無論您選擇使用相同演算法還是新的演算法,Amazon S3 都會在複製物件後計算新的檢查總和值。Amazon S3 不會直接複製檢查總和的值。所有沒有檢查總和及指定目的地檢查總和演算法的複製物件都會自動取得 CRC-64NVME 檢查總和演算法。如需如何計算此檢查總和的詳細資訊,請參閱「在 Amazon S3 中使用分段上傳來上傳和複製物件」。

在單一請求中複製多個物件

若要透過單一請求複製多個 Amazon S3 物件,您還可以使用 S3 Batch Operations。您可以為 SS3 Batch Operations 提供一份要進行操作的物件清單。S3 批次操作會呼叫相應的 API 操作來執行指定操作。單一批次作業任務可在包含數 EB 資料的數十億個物件上執行指定的操作。

S3 Batch Operations 功能會追蹤進度、傳送通知,並存放所有動作的詳細完成報告,提供完整受管、可稽核、無伺服器的體驗。您可以透過 Amazon S3 主控台、AWS CLI、AWS、SDK 或 REST API 使用 S3 批次操作。如需更多詳細資訊,請參閱 S3 批次作業基礎知識

將物件複製到目錄儲存貯體

如需將物件複製到目錄儲存貯體的資訊,請參閱從目錄儲存貯體複製物件或將物件複製到目錄儲存貯體。如需搭配目錄儲存貯體使用 Amazon S3 Express One Zone 儲存類別的資訊,請參閱S3 Express One Zone使用目錄儲存貯體

複製物件

若要複製物件,請使用下列方法。

注意

當您使用主控台複製物件時,您有下列限制:

  • 如果您的物件小於 5 GB,您可以複製物件。如果您的物件大於 5 GB,您必須使用 AWS CLIAWS SDK 來複製物件。

  • 如需複製物件所需的其他許可清單,請參閱Amazon S3 API 操作所需的許可。如需授予此許可的範例政策,請參閱Amazon S3 的身分型政策範例

  • Copy 動作會套用至指定資料夾中 (指定字首) 的所有物件。在動作進行期間加入這些資料夾的物件可能會受到影響。

  • Amazon S3 主控台不支援跨區域複製 SSE-KMS 加密的物件。若要跨區域複製 SSE-KMS 加密的物件,請使用 AWS CLI、AWS SDK 或 Amazon S3 REST API。

  • 使用客戶提供的加密金鑰 (SSE-C) 加密的物件無法經由 S3 主控台複製。若要複製 SSE-C 加密的物件,請使用 AWS CLI、AWS SDK 或 Amazon S3 REST API。

  • 複製的物件不會保留原始物件的物件鎖定設定。

  • 如果複製物件的來源儲存貯體使用儲存貯體擁有者強制執行的 S3 物件擁有權設定,則不會將物件 ACL 複製到指定的目的地。

  • 如果您想要將物件複製到使用儲存貯體擁有者強制執行之 S3 物件擁有權設定的儲存貯體,請確定來源儲存貯體也使用儲存貯體擁有者強制執行的設定,或移除其他 AWS 帳戶和群組的任何物件 ACL 授權。

複製物件
  1. 登入 AWS 管理主控台,並開啟位於 https://console.aws.amazon.com/s3/ 的 Amazon S3 主控台。

  2. 在左側導覽窗格中,選擇一般用途儲存貯體目錄儲存貯體

  3. 在儲存貯體清單中,選擇包您要複製之物件的儲存貯體名稱。

  4. 選取物件名稱左側的核取方塊,以複製這些物件。

  5. 動作功能表上顯示的選項清單中,選擇複製

  6. 選取目的地類型和目的地帳戶。若要指定目的地路徑,請選擇 Browse S3 (瀏覽 S3),導覽至目的地,然後選取目的地左側的核取方塊。選擇右下角的 Choose destination (選擇目的地)。

    或者,輸入目的地路徑。

  7. 如果您「未」啟用儲存貯體版本控制,您會看到警告,建議您啟用儲存貯體版本控制,以協助防止意外覆寫或刪除物件。如果您要保留此儲存貯體中所有版本的物件,請選取 Enable Bucket Versioning (啟用儲存貯體版本控制)。您也可以在目的地詳細資訊中檢視預設加密和 S3 物件鎖定內容。

  8. 其他複製設定下,選擇複製來源設定不要指定設定指定設定複製來源設定是預設選項。如果您只想複製物件但不想包含來源設定屬性,請選擇不要指定設定。選擇指定設定以指定儲存類別、ACL、物件標籤、中繼資料、伺服器端加密和額外檢查總和的設定。

  9. 選擇右下角的 Copy (複製)。Amazon S3 會將您的物件複製到目的地。

本節中的範例示範如何以單一操作複製最大可達 5 GB 的物件。若要複製大於 5 GB 的物件,則必須使用分段上傳。如需更多詳細資訊,請參閱 使用分段上傳來複製物件

Java

如需如何使用適用於 Java 的 AWS SDK 來複製物件的範例,請參閱《Amazon S3 API 參考》中的將物件從一個儲存貯體複製到另一個儲存貯體

.NET

下列 C# 範例使用高階 適用於 .NET 的 SDK 以單一操作複製最大 5 GB 的物件。對於大於 5 GB 的物件,請使用 使用分段上傳來複製物件 中所述的分段上傳複製範例。

此範例會建立最大 5 GB 之物件的複本。如需設定及執行程式碼範例的資訊,請參閱《適用於 .NET 的 AWS SDK 開發人員指南》中的適用於 .NET 的 AWS SDK 入門

using Amazon; using Amazon.S3; using Amazon.S3.Model; using System; using System.Threading.Tasks; namespace Amazon.DocSamples.S3 { class CopyObjectTest { private const string sourceBucket = "*** provide the name of the bucket with source object ***"; private const string destinationBucket = "*** provide the name of the bucket to copy the object to ***"; private const string objectKey = "*** provide the name of object to copy ***"; private const string destObjectKey = "*** provide the destination object key name ***"; // Specify your bucket region (an example region is shown). private static readonly RegionEndpoint bucketRegion = RegionEndpoint.USWest2; private static IAmazonS3 s3Client; public static void Main() { s3Client = new AmazonS3Client(bucketRegion); Console.WriteLine("Copying an object"); CopyingObjectAsync().Wait(); } private static async Task CopyingObjectAsync() { try { CopyObjectRequest request = new CopyObjectRequest { SourceBucket = sourceBucket, SourceKey = objectKey, DestinationBucket = destinationBucket, DestinationKey = destObjectKey }; CopyObjectResponse response = await s3Client.CopyObjectAsync(request); } catch (AmazonS3Exception e) { Console.WriteLine("Error encountered on server. Message:'{0}' when writing an object", e.Message); } catch (Exception e) { Console.WriteLine("Unknown encountered on server. Message:'{0}' when writing an object", e.Message); } } } }
PHP

本主題將引導您使用 適用於 PHP 的 AWS SDK 第 3 版的類別,將 Amazon S3 中的一或多個物件從某個儲存貯體複製到另一個,或在同一個儲存貯體中進行複製。

如需適用於 Ruby 的 AWS SDK API 的詳細資訊,請前往適用於 Ruby 的 AWS 開發套件 – 第 2 版

下列 PHP 範例說明如何在 Amazon S3 中使用 copyObject() 方法複製單一物件。該範例也示範如何使用 getcommand() 方法進行 CopyObject 的批次呼叫來建立物件的多個複本。

複製物件

1

使用 Aws\S3\S3Client 類別建構函數,建立 Amazon S3 用戶端的執行個體。

2

若要建立物件的多個複本,您可以對 Amazon S3 用戶端批次呼叫 getCommand() 方法,該方法繼承自 Aws\CommandInterface 類別。您需要提供 CopyObject 命令作為第一個引數,並提供內含來源儲存貯體、來源金鑰名稱、目標儲存貯體與目標金鑰名稱的陣列,作為第二個引數。

require 'vendor/autoload.php'; use Aws\CommandPool; use Aws\Exception\AwsException; use Aws\ResultInterface; use Aws\S3\S3Client; $sourceBucket = '*** Your Source Bucket Name ***'; $sourceKeyname = '*** Your Source Object Key ***'; $targetBucket = '*** Your Target Bucket Name ***'; $s3 = new S3Client([ 'version' => 'latest', 'region' => 'us-east-1' ]); // Copy an object. $s3->copyObject([ 'Bucket' => $targetBucket, 'Key' => "$sourceKeyname-copy", 'CopySource' => "$sourceBucket/$sourceKeyname", ]); // Perform a batch of CopyObject operations. $batch = array(); for ($i = 1; $i <= 3; $i++) { $batch[] = $s3->getCommand('CopyObject', [ 'Bucket' => $targetBucket, 'Key' => "{targetKeyname}-$i", 'CopySource' => "$sourceBucket/$sourceKeyname", ]); } try { $results = CommandPool::batch($s3, $batch); foreach ($results as $result) { if ($result instanceof ResultInterface) { // Result handling here } if ($result instanceof AwsException) { // AwsException handling here } } } catch (Exception $e) { // General error handling here }
Python
class ObjectWrapper: """Encapsulates S3 object actions.""" def __init__(self, s3_object): """ :param s3_object: A Boto3 Object resource. This is a high-level resource in Boto3 that wraps object actions in a class-like structure. """ self.object = s3_object self.key = self.object.key
def copy(self, dest_object): """ Copies the object to another bucket. :param dest_object: The destination object initialized with a bucket and key. This is a Boto3 Object resource. """ try: dest_object.copy_from( CopySource={"Bucket": self.object.bucket_name, "Key": self.object.key} ) dest_object.wait_until_exists() logger.info( "Copied object from %s:%s to %s:%s.", self.object.bucket_name, self.object.key, dest_object.bucket_name, dest_object.key, ) except ClientError: logger.exception( "Couldn't copy object from %s/%s to %s/%s.", self.object.bucket_name, self.object.key, dest_object.bucket_name, dest_object.key, ) raise
Ruby

下列作業將引導您使用 Ruby 類別,將 Amazon S3 中的物件從一個儲存貯體複製到另一個,或複製到同一個儲存貯體中的其他位置。

複製物件

1

針對適用於 Ruby 的 AWS SDK 第 3 版使用 Amazon S3 模組化 Gem、要求 aws-sdk-s3,並提供您的 AWS 憑證。如需如何提供憑證的詳細資訊,請參閱 Amazon S3 API 參考中的使用 AWS 帳戶或 IAM 使用者憑證提出請求

2

提供請求資訊,例如來源儲存貯體名稱、來源金鑰名稱、目的地儲存貯體名稱和目的地金鑰。

下列 Ruby 程式碼範例示範上述任務,使用 #copy_object 方法將物件從一個儲存貯體複製到另一個。

require 'aws-sdk-s3' # Wraps Amazon S3 object actions. class ObjectCopyWrapper attr_reader :source_object # @param source_object [Aws::S3::Object] An existing Amazon S3 object. This is used as the source object for # copy actions. def initialize(source_object) @source_object = source_object end # Copy the source object to the specified target bucket and rename it with the target key. # # @param target_bucket [Aws::S3::Bucket] An existing Amazon S3 bucket where the object is copied. # @param target_object_key [String] The key to give the copy of the object. # @return [Aws::S3::Object, nil] The copied object when successful; otherwise, nil. def copy_object(target_bucket, target_object_key) @source_object.copy_to(bucket: target_bucket.name, key: target_object_key) target_bucket.object(target_object_key) rescue Aws::Errors::ServiceError => e puts "Couldn't copy #{@source_object.key} to #{target_object_key}. Here's why: #{e.message}" end end # Example usage: def run_demo source_bucket_name = "amzn-s3-demo-bucket1" source_key = "my-source-file.txt" target_bucket_name = "amzn-s3-demo-bucket2" target_key = "my-target-file.txt" source_bucket = Aws::S3::Bucket.new(source_bucket_name) wrapper = ObjectCopyWrapper.new(source_bucket.object(source_key)) target_bucket = Aws::S3::Bucket.new(target_bucket_name) target_object = wrapper.copy_object(target_bucket, target_key) return unless target_object puts "Copied #{source_key} from #{source_bucket_name} to #{target_object.bucket_name}:#{target_object.key}." end run_demo if $PROGRAM_NAME == __FILE__

此範例說明如何使用 Amazon S3 REST API 複製物件。如需 REST API 的詳細資訊,請參閱 CopyObject

此範例會將 flotsam 物件從 amzn-s3-demo-bucket1 儲存貯體複製到 jetsam 儲存貯體的 amzn-s3-demo-bucket2 物件,並保留其中繼資料。

PUT /jetsam HTTP/1.1 Host: amzn-s3-demo-bucket2.s3.amazonaws.com x-amz-copy-source: /amzn-s3-demo-bucket1/flotsam Authorization: AWS AKIAIOSFODNN7EXAMPLE:ENoSbxYByFA0UGLZUqJN5EUnLDg= Date: Wed, 20 Feb 2008 22:12:21 +0000

簽章已依據下列資訊產生。

PUT\r\n \r\n \r\n Wed, 20 Feb 2008 22:12:21 +0000\r\n x-amz-copy-source:/amzn-s3-demo-bucket1/flotsam\r\n /amzn-s3-demo-bucket2/jetsam

Amazon S3 會傳回下列回應,其中指定物件的 ETag 及上次修改時間。

HTTP/1.1 200 OK x-amz-id-2: Vyaxt7qEbzv34BnSu5hctyyNSlHTYZFMWK4FtzO+iX8JQNyaLdTshL0KxatbaOZt x-amz-request-id: 6B13C3C5B34AF333 Date: Wed, 20 Feb 2008 22:13:01 +0000 Content-Type: application/xml Transfer-Encoding: chunked Connection: close Server: AmazonS3 <?xml version="1.0" encoding="UTF-8"?> <CopyObjectResult> <LastModified>2008-02-20T22:13:01</LastModified> <ETag>"7e9c608af58950deeb370c98608ed097"</ETag> </CopyObjectResult>

您也可以使用 AWS Command Line Interface (AWS CLI) 複製 S3 物件。如需詳細資訊,請參閱《AWS CLI 命令參考》中的 copy-object

如需 AWS CLI 的資訊,請參閱《AWS Command Line Interface使用者指南》中的什麼是 AWS Command Line Interface?

如何移動物件

若要移動物件,請使用下列方法。

注意
  • 如果您的物件小於 5 GB,您可以移動物件。如果您的物件大於 5 GB,您必須使用 AWS CLIAWS SDK 來移動物件。

  • 如需移動物件所需的其他許可清單,請參閱Amazon S3 API 操作所需的許可。如需授予此許可的範例政策,請參閱Amazon S3 的身分型政策範例

  • 使用客戶提供的加密金鑰 (SSE-C) 加密的物件無法經由 Amazon S3 主控台移動。若要移動 SSE-C 加密的物件,請使用 AWS CLI、AWS SDK 或 Amazon S3 REST API。

  • 移動資料夾時,請等待移動操作完成,再對資料夾進行其他變更。

  • 您無法在 Amazon S3 主控台中使用 S3 存取點別名作為移動操作的來源或目的地。

如何移動物件
  1. 登入 AWS 管理主控台,並開啟位於 https://console.aws.amazon.com/s3/ 的 Amazon S3 主控台。

  2. 在左側導覽窗格中,選擇 Buckets (儲存貯體)。導覽至您要移動的物件所在的 Amazon S3 儲存貯體或資料夾。

  3. 選取要移動之物件的核取方塊。

  4. 動作功能表上,選擇移動

  5. 若要指定目的地路徑,請選擇瀏覽 S3,導覽至目的地,然後選取目的地核取方塊。選擇 Choose destination (選擇目的地)

    或者,輸入目的地路徑。

  6. 如果您「未」啟用儲存貯體版本控制,您會看到警告,建議您啟用儲存貯體版本控制,以協助防止意外覆寫或刪除物件。如果您要保留此儲存貯體中所有版本的物件,請選取 Enable Bucket Versioning (啟用儲存貯體版本控制)。您也可以在目的地詳細資訊中檢視預設加密和物件鎖定內容。

  7. 其他複製設定下,選擇複製來源設定不要指定設定指定設定複製來源設定是預設選項。如果您只想複製物件但不想包含來源設定屬性,請選擇不要指定設定。選擇指定設定以指定儲存類別、ACL、物件標籤、中繼資料、伺服器端加密和額外檢查總和的設定。

  8. 選擇右下角的 Move (移動)。Amazon S3 會將您的物件移動到目的地資料夾。

您也可以使用 AWS Command Line Interface (AWS CLI) 移動 S3 物件。如需詳細資訊,請參閱《AWS CLI 命令參考》中的 mv

如需 AWS CLI 的資訊,請參閱《AWS Command Line Interface使用者指南》中的什麼是 AWS Command Line Interface?

重新命名物件

若要重新命名物件,請使用下列程序。

注意
  • 如果您的物件小於 5 GB,您可以重新命名物件。若要重新命名大於 5 GB 的物件,您必須使用 AWS CLIAWS SDK 複製物件並提供新名稱,然後刪除原始物件。

  • 如需複製物件所需的其他許可清單,請參閱Amazon S3 API 操作所需的許可。如需授予此許可的範例政策,請參閱Amazon S3 的身分型政策範例

  • 重新命名物件會建立具有新上次修改日期的物件複本,然後將刪除標記新增至原始物件。

  • 預設加密的儲存貯體設定會自動套用至任何未加密的指定物件。

  • 您無法使用 Amazon S3 主控台重新命名具有客戶提供加密金鑰 (SSE-C) 的物件。若要重新命名 SSE-C 加密的物件,請使用 AWS CLI、AWS SDK 或 Amazon S3 REST API 複製這些物件並提供新名稱。

  • 如果此儲存貯體使用儲存貯體擁有者強制執行的 S3 物件擁有權設定,則不會複製物件存取控制清單 (ACL)。

重新命名物件
  1. 登入 AWS 管理主控台,並開啟位於 https://console.aws.amazon.com/s3/ 的 Amazon S3 主控台。

  2. 在導覽窗格中,選擇儲存貯體,然後選擇一般用途儲存貯體索引標籤。導覽至包含您要重新命名之物件的 Amazon S3 儲存貯體或資料夾。

  3. 選取您要重新命名之物件的核取方塊。

  4. 動作功能表上,選擇重新命名物件

  5. 新物件名稱方塊中,輸入物件的新名稱。

  6. 其他複製設定下,選擇複製來源設定不要指定設定指定設定複製來源設定是預設選項。如果您只想複製物件但不想包含來源設定屬性,請選擇不要指定設定。選擇指定設定以指定儲存類別、ACL、物件標籤、中繼資料、伺服器端加密和額外檢查總和的設定。

  7. 選擇儲存變更。Amazon S3 會重新命名您的物件。