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

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

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

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

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

使用 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 儲存類別中的還原物件不支援 Amazon S3S3 主控台中的複製操作。若要複製這些還原的物件,請使用 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 批次操作。您可以為 S3 批次操作提供一份要進行操作的物件清單。S3 Batch Operations 會呼叫個別API操作來執行指定的操作。單一批次作業任務可在包含數 EB 資料的數十億個物件上執行指定的操作。

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

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

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

複製物件

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

注意

使用主控台複製物件時的限制如下:

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

  • 如需複製物件所需的其他許可清單,請參閱 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 物件擁有權的儲存貯體擁有者強制執行設定,則物件ACLs將不會複製到指定的目的地。

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

複製物件
  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. 其他複製設定 下,選擇您是否要複製來源設定 不要指定設定 指定設定 複製來源設定是預設選項。如果您只想要在沒有來源設定屬性的情況下複製物件,請選擇不要指定設定 。選擇指定設定以指定儲存類別、ACLs、物件標籤、中繼資料、伺服器端加密和其他總和檢查碼的設定。

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

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

Java

下面的範例使用 AWS SDK for Java在 Amazon S3 中複製物件。如需建立和測試工作範例的指示,請參閱 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 內將單一物件和多個物件從一個儲存貯體複製到另一個儲存貯體,或在同一儲存貯體內複製。

如需有關 for Ruby 的詳細資訊 AWS SDKAPI,請前往 AWS SDK for Ruby - 第 2 版

下列PHP範例說明使用 copyObject()方法在 Amazon S3 中複製單一物件。它還示範如何使用 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

針對 第 3 版使用 Amazon S3 模組化寶石 AWS SDK for Ruby,需要 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 複製物件RESTAPI。如需 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 物件。如需詳細資訊,請參閱 copy-objectAWS CLI 命令參考 中。

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

如何移動物件

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

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

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

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

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

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

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

  2. 在導覽窗格中,選擇儲存貯體 ,然後選擇一般用途儲存貯體索引標籤。導覽至您要移動的物件所在的 Amazon S3 儲存貯體或資料夾。

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

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

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

    或者,輸入目的地路徑。

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

  7. 其他複製設定 下,選擇您是否要複製來源設定 不要指定設定 指定設定 複製來源設定是預設選項。如果您只想要在沒有來源設定屬性的情況下複製物件,請選擇不要指定設定 。選擇指定設定以指定儲存類別、ACLs、物件標籤、中繼資料、伺服器端加密和其他總和檢查碼的設定。

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

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

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

重新命名物件

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

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

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

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

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

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

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

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

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

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

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

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

  6. 其他複製設定 下,選擇您是否要複製來源設定 不要指定設定 指定設定 複製來源設定是預設選項。如果您只想要在沒有來源設定屬性的情況下複製物件,請選擇不要指定設定 。選擇指定設定以指定儲存類別、ACLs、物件標籤、中繼資料、伺服器端加密和其他總和檢查碼的設定。

  7. 選擇 Save changes (儲存變更)。Amazon S3 會重新命名物件。