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

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

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

CopyObject作業會建立已存放在 Amazon S3 中的物件複本。

您可以在單一原子作業中建立最多 5 GB 的物件副本。不過,若要複製大於 5 GB 的物件,您必須使用多部分上傳。如需詳細資訊,請參閱使用分段上傳來複製物件

使用 CopyObject 操作,您可以:

  • 建立物件的其他複本。

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

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

    注意

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

  • 變更物件中繼資料。每個 Amazon S3 物件都有中繼資料。此元數據是一組名稱-值對。您可以在上載物件時設定物件中繼資料。上載物件之後,您就無法修改物件中繼資料。修改物件中繼資料唯一的方式是製作物件的複本,再設定中繼資料。若要這麼做,請在複製作業中,設定與來源和目標相同的物件。

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

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

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

複製已封存和還原的物件

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

S3 冰川彈性擷取或 S3 Glacier 深層存檔儲存類別中還原的物件不支援 Amazon S3 主控台中的製操作。若要複製這些還原的物件,請使用 AWS Command Line Interface (AWS CLI), 該 AWS SDKs,或 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 不會直接複製檢查總和的值。使用多部分上傳所載入之物件的總和檢查碼值可能會變更。如需如何計算此檢查總和的詳細資訊,請參閱「對分段上傳使用部分檢查總和」。

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

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

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

將物件複製到目錄值區

如需將物件複製到目錄值區的相關資訊,請參閱將物件複製到目錄儲存貯體。如需將 Amazon S3 快速單區域儲存類別與目錄儲存貯體搭配使用的相關資訊,請參閱什麼是 S3 Express One Zone?目錄值區

複製物件

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

注意
  • 使用 Amazon S3 主控台複製物件時,您必須擁有s3:ListAllMyBuckets許可。控制台需要此權限才能驗證複製操作。如需授與此權限的原則範例,請參閱Amazon S3 的基於身分識別的政策範例

    如果您要複製具有使用者定義標籤的物件,您也必須擁有該s3:GetObjectTagging權限。如果您要複製沒有使用者定義標籤但大小超過 16 MB 的物件,您還必須擁有 s3: GetObjectTagging 權限。

    如果目的地儲存貯體原則拒絕該s3:GetObjectTagging動作,則會複製物件而不使用使用者定義的標籤,而且您會收到錯誤訊息。

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

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

複製物件
  1. 登入到 AWS Management Console 並打開 Amazon S3 控制台https://console.aws.amazon.com/s3/

  2. 在左側導覽窗格中,選擇「值區」,然後選擇「一般用途值區」頁標。導覽至 Amazon S3 儲存貯體或資料夾,其中包含您要複製的物件。

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

  4. 在 [動] 功能表上,從顯示的選項清單中選擇 [複製]。

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

    或者,輸入目的地路徑。

  6. 如果您沒有啟用儲存貯體版本控制,系統可能會要求您確認覆寫具有相同名稱的現有物件。如果這沒有問題,請選取核取方塊並繼續。如果您要保留此儲存貯體中所有版本的物件,請選取 Enable Bucket Versioning (啟用儲存貯體版本控制)。您也可以更新預設加密和 S3 物件鎖定內容。

  7. 額外的檢查總和中,選擇使用現有的檢查總和函數,或是用新的檢查總和函數取代來複製物件。上傳物件時,您可以選擇指定用於驗證資料完整性的檢查總和演算法。複製物件時,您可以選擇一個新函數。如果原先沒有指定額外的檢查總和,您可以使用複製選項的部分新增一個檢查總和。

    注意

    即使您選擇使用相同的檢查總和函數,如果複製物件的大小超過 16 MB,則檢查總和的值可能會發生變化。檢查總和的值可能會因為計算分段上傳檢查總和而變更。如需複製物件時檢查總和會如何變化的詳細資訊,請參閱「對分段上傳使用部分檢查總和」。

    若要變更檢查總和函數,請選擇Replace with a new checksum function (替換為新的檢查總和函數)。從方塊中選擇新的檢查總和函數。複製物件時,將使用指定的演算法計算和儲存新的檢查總和。

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

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

Java

下列範例會複製 Amazon S3 中的物件 AWS SDK for Java。 如需有關建立和測試工作範例的指示,請參閱《 AWS SDK for Java 開發人員指南。

import com.amazonaws.AmazonServiceException; import com.amazonaws.SdkClientException; import com.amazonaws.auth.profile.ProfileCredentialsProvider; import com.amazonaws.regions.Regions; import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.AmazonS3ClientBuilder; import com.amazonaws.services.s3.model.CopyObjectRequest; import java.io.IOException; public class CopyObjectSingleOperation { public static void main(String[] args) throws IOException { Regions clientRegion = Regions.DEFAULT_REGION; String bucketName = "*** Bucket name ***"; String sourceKey = "*** Source object key *** "; String destinationKey = "*** Destination object key ***"; try { AmazonS3 s3Client = AmazonS3ClientBuilder.standard() .withCredentials(new ProfileCredentialsProvider()) .withRegion(clientRegion) .build(); // Copy the object into a new object in the same bucket. CopyObjectRequest copyObjRequest = new CopyObjectRequest(bucketName, sourceKey, bucketName, destinationKey); s3Client.copyObject(copyObjRequest); } catch (AmazonServiceException e) { // The call was transmitted successfully, but Amazon S3 couldn't process // it, so it returned an error response. e.printStackTrace(); } catch (SdkClientException e) { // Amazon S3 couldn't be contacted for a response, or the client // couldn't parse the response from Amazon S3. e.printStackTrace(); } } }
.NET

下面的 C# 示例使用高級 AWS SDK for .NET ,以在單一作業中複製最大 5 GB 的物件。對於大於 5 GB 的物件,請使用 使用分段上傳來複製物件 中所述的分段上傳複製範例。

此範例會建立最大 5 GB 之物件的複本。如需有關設定和執行程式碼範例的詳細資訊,請參閱 AWS SDK對於. NETAWS SDK對於. NET開發人員指南

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

本主題會引導您使用第 3 版的類別 AWS SDK for PHP 將 Amazon S3 內的單一物件和多個物件、從一個儲存貯體複製到另一個儲存貯體或同一個儲存貯體內。

有關的更多信息 AWS SDK對於紅寶石API,請轉到 AWS SDK對於紅寶石-版本 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

使用 Amazon S3 模塊化的寶石版本 3 AWS SDK for Ruby,要求aws-sdk-s3並提供您的 AWS 認證。如需如何提供憑證的詳細資訊,請參閱「提出請求 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 複製物件RESTAPI。如需有關的更多資訊 RESTAPI,請參閱 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 物件。如需詳細資訊,請參閱 copy-object 中的 AWS CLI 指令參考

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

如何移動物件

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

注意
  • 如果您要移動具有使用者定義標籤的物件,您必須擁有該s3:GetObjectTagging權限。如果您要移動沒有使用者定義標籤但大小超過 16 MB 的物件,您還必須擁有 s3: GetObjectTagging 權限。

    如果目的地儲存貯體政策拒絕該s3:GetObjectTagging動作,物件將不會移動使用者定義的標籤,而且您會收到錯誤訊息。

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

  • 移動資料夾時,請等待「動」作業完成,然後再對資料夾進行其他變更。

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

如何移動物件
  1. 登入到 AWS Management Console 並打開 Amazon S3 控制台https://console.aws.amazon.com/s3/

  2. 在左側導覽窗格中,選擇「值區」,然後選擇「一般用途值區」頁標。導覽至您要移動的物件所在的 Amazon S3 儲存貯體或資料夾。

  3. 選取要移動的物件名稱左側的核取方塊。

  4. 在 [動作] 功能表上選擇 [移動]。

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

    或者,輸入目的地路徑。

  6. 如果您沒有啟用儲存貯體版本控制,系統可能會要求您確認覆寫具有相同名稱的現有物件。如果這沒有問題,請選取核取方塊並繼續。如果您要保留此儲存貯體中所有版本的物件,請選取 Enable Bucket Versioning (啟用儲存貯體版本控制)。您也可以更新預設加密和物件鎖定內容。

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

注意
  • 此動作會以更新的設定建立所有指定物件的複本、更新指定位置中的上次修改日期,以及將刪除標記新增至原始物件。

  • 此動作會更新儲存貯體版本控制、加密、物件鎖定功能及封存物件的中繼資料。

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

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

重新命名物件

欲重新命名物件,請遵循下列步驟。

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

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

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

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

  • 如果要重新命名具有使用者定義標籤的物件,您必須擁有該s3:GetObjectTagging權限。如果要重新命名沒有使用者定義標籤但大小超過 16 MB 的物件,您還必須擁有 s3: GetObjectTagging 權限。

    如果目的地儲存貯體政策拒絕該s3:GetObjectTagging動作,物件將會重新命名,但使用者定義的標籤會從物件中移除,而且您會收到錯誤訊息。

重新命名物件
  1. 登入到 AWS Management Console 並打開 Amazon S3 控制台https://console.aws.amazon.com/s3/

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

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

  4. 請在「操作」菜單上選擇「重命名對象」。

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

  6. 選擇保存更改在右下角。Amazon S3 重命名您的對象。