オブジェクトのコピー - Amazon Simple Storage Service

オブジェクトのコピー

コピーオペレーションを行うと、Amazon S3 内に既に格納されているオブジェクトのコピーが作成されます。

1 回のアトミックオペレーションでコピーできるオブジェクトのサイズは最大 5 GB です。5 GB を超えるオブジェクトをコピーする場合は、マルチパートアップロード API を使用する必要があります。

copy オペレーションを使用すると、以下のことができます。

  • オブジェクトの追加コピーを作成する

  • オブジェクトをコピーし、元のオブジェクトを削除することで、オブジェクトの名前を変更する

  • Amazon S3 のロケーション (us-west-1 や欧州など) 間でオブジェクトを移動する

  • オブジェクトメタデータを変更する

    各 Amazon S3 オブジェクトにはメタデータがあります。メタデータは名前と値のペアのセットです。オブジェクトメタデータは、オブジェクトをアップロードするときに設定できます。オブジェクトのアップロード後にはオブジェクトメタデータは変更できません。オブジェクトメタデータを変更する唯一の方法は、オブジェクトのコピーを作成し、メタデータを設定することです。コピーオペレーションでは、コピー元と同じオブジェクトをコピー先に設定します。

各オブジェクトはメタデータを持ちます。システムメタデータの場合もあれば、ユーザー定義メタデータの場合もあります。ユーザーはオブジェクトに対して使用するストレージクラス設定など一部のシステムメタデータを制御し、サーバー側の暗号化を設定します。オブジェクトをコピーするときは、ユーザーが制御するシステムメタデータとユーザー定義メタデータもコピーされます。システムが制御するメタデータは Amazon S3 によってリセットされます。たとえば、オブジェクトをコピーすると、コピーしたオブジェクトの作成日が Amazon S3 によってリセットされます。コピーリクエストの中でこのような値を設定する必要は一切ありません。

オブジェクトをコピーするときは、一部のメタデータ値を更新することができます。たとえば、コピー元のオブジェクトで標準ストレージを使用するように設定してある場合、コピー先のオブジェクトでは低冗長化ストレージを使用するように選択する場合があるかもしれません。また、コピー元のオブジェクトに存在するユーザー定義メタデータの一部を変更することもできます。オブジェクトのユーザー設定可能なメタデータ (システムまたはユーザー定義) をコピー時に更新する場合、メタデータ値の 1 つだけを変更する場合であっても、コピー元オブジェクトに存在するすべてのユーザー設定可能メタデータをリクエスト内で明示的に指定する必要があることにご注意ください。

オブジェクトメタデータの詳細については、オブジェクトメタデータの使用を参照してください。

注記
  • ロケーション間でオブジェクトをコピーすると、帯域料金が発生します。

  • ソースオブジェクトが S3 Glacier または S3 Glacier Deep Archive にアーカイブされている場合はまず、オブジェクトを他のバケットにコピーする前に、一時コピーを復元する必要があります。オブジェクトのアーカイブについては、「S3 Glacier Deep Archive ストレージクラスへの移行 (オブジェクトのアーカイブ)」を参照してください。

オブジェクトをコピーするときに、Amazon S3 に保存するターゲットオブジェクトを AWS KMS key、Amazon S3 マネージド暗号化キー、またはお客様が指定した暗号化キーで暗号化するようリクエストできます。そのために、リクエストで暗号化情報を指定する必要があります。コピーソースが、お客様が指定したキーで、サーバー側の暗号化キーを使用して Amazon S3 に格納されているオブジェクトである場合、Amazon S3 がオブジェクトを復号してコピーできるように、リクエスト内で暗号化情報を指定する必要があります。詳細については、「暗号化を使用したデータの保護」を参照してください。

1 つのリクエストで複数の Amazon S3 オブジェクトをコピーするには、Amazon S3 バッチオペレーションを使用できます。S3 バッチオペレーションには、オペレーション対象のオブジェクトのリストを指定します。S3 バッチオペレーションは、各 API を呼び出して、指定されたオペレーションを実行します。1 つのバッチオペレーションジョブで、エクサバイトのデータを含む数十億ものオブジェクトに対して、指定されたオペレーションを実行できます。

S3 バッチオペレーション機能は、進捗状況の追跡、通知の送信、すべてのアクションの詳細な完了レポートの保存を行い、フルマネージド型の監査可能なサーバーレスエクスペリエンスを提供します。AWS Management Console、AWS CLI、AWS SDK、または REST API を使用して S3 バッチオペレーションを使用できます。詳細については、「S3 バッチ操作の基本」を参照してください。

オブジェクトをコピーするには

オブジェクトをコピーするには、以下の例を使用します。

S3 コンソールでは、オブジェクトをコピーまたは移動できます。詳細については、以下の手順を参照してください。

オブジェクトをコピーするには

  1. AWS Management Console にサインインし、Amazon S3 コンソール (https://console.aws.amazon.com/s3/) を開きます。

  2. コピーするオブジェクトを含む Amazon S3 バケットまたはフォルダに移動します。

  3. コピーするオブジェクトの名前の左にあるチェックボックスをオンにします。

  4. [Actions (アクション)] を選択し、表示されるオプションのリストから [Copy (コピー)] を選択します。

    または、右上のオプションから [Copy (コピー)] を選択します。

  5. 送信先タイプと送信先アカウントを選択します。送信先パスを指定するには、[Browse S3 (S3 の参照)] を選択し、送信先に移動して、送信先の左側にあるチェックボックスをオンにします。右下の [Choose destination] (送信先を選択する) をクリックします。

    または、送信先パスを入力します。

  6. バケットのバージョニングが有効になっていない場合は、同じ名前の既存のオブジェクトが上書きされることを確認するように求められる場合があります。上書きされてもよい場合は、チェックボックスを選択して続行します。このバケットのオブジェクトの全バージョンを保持する場合は、[Enable Bucket Versioning] (バケットのバージョニングを有効にする) をクリックします。また、デフォルトの暗号化プロパティとオブジェクトロックプロパティを更新することもできます。

  7. 右下の [Copy (コピー)] を選択すると、Amazon S3 によってオブジェクトが送信先に移動されます。

オブジェクトを移動するには

  1. AWS Management Console にサインインし、Amazon S3 コンソール (https://console.aws.amazon.com/s3/) を開きます。

  2. 移動するオブジェクトが含まれている Amazon S3 のバケットまたはフォルダに移動します。

  3. 移動するオブジェクトの名前の左にあるチェックボックスをオンにします。

  4. [Actions (アクション)] を選択し、表示されるオプションのリストから [Move (移動)] を選択します。

    または、右上のオプションから [Move (移動)] を選択します。

  5. 送信先パスを指定するには、[Browse S3 (S3 の参照)] を選択し、送信先に移動して、送信先の左側にあるチェックボックスをオンにします。右下の [Choose destination] (送信先を選択する) をクリックします。

    または、送信先パスを入力します。

  6. バケットのバージョニングが有効になっていない場合は、同じ名前の既存のオブジェクトが上書きされることを確認するように求められる場合があります。上書きされてもよい場合は、チェックボックスを選択して続行します。このバケットのオブジェクトの全バージョンを保持する場合は、[Enable Bucket Versioning] (バケットのバージョニングを有効にする) をクリックします。また、デフォルトの暗号化プロパティとオブジェクトロックプロパティを更新することもできます。

  7. 右下の [Move (移動)] を選択すると、Amazon S3 によってオブジェクトがターゲットに移動されます。

注記
  • このアクションでは、更新された設定で指定されたすべてのオブジェクトのコピーが作成されます。また、指定された場所の最終更新日が更新され、元のオブジェクトに削除マーカーが追加されます。

  • フォルダを移動するときは、移動アクションが完了するのを待ってから、フォルダをさらに変更してください。

  • お客様が用意した暗号化キー (SSE-C) で暗号化されたオブジェクトは、S3 コンソールを使用してコピーできません。SSE-C で暗号化されたオブジェクトをコピーするには、AWS CLI、AWS SDK、または Amazon S3 REST API を使用します。

  • このアクションは、バケットのバージョニング、暗号化、オブジェクトロック機能、アーカイブされたオブジェクトのメタデータを更新します。

このセクションの例は、1 回のオペレーションで最大 5 GB のオブジェクトをコピーする方法を示しています。5 GB を超えるオブジェクトをコピーする場合は、マルチパートアップロード API を使用する必要があります。詳細については、「マルチパートアップロードを使用したオブジェクトのコピー」を参照してください。

Java

次の例では、AWS SDK for Java を使用して Amazon S3 にオブジェクトをコピーします。ワーキングサンプルの作成とテストに関する手順については、「Amazon S3 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 を使用して、1 回のオペレーションで 5 GB の大きさのオブジェクトをコピーします。5 GB を超えるオブジェクトには、「マルチパートアップロードを使用したオブジェクトのコピー」で説明しているマルチパートアップロードコピーの例を使用します。

この例では、最大 5 GB のオブジェクトのコピーを作成します。特定のバージョンの AWS SDK for .NET との例の互換性の詳細、および作業サンプルの作成およびテスト方法の手順については、「Amazon S3 .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 内の 1 つまたは複数のオブジェクトを、特定のバケットから別のバケットへ、または同じバケット内にコピーする手順を示します。

このトピックは、既に AWS SDK for PHP の使用と PHP サンプルの実行 の指示が実行されており、AWS SDK for PHP が正しくインストールされていることを前提としています。

以下の PHP コードは、copyObject() メソッドを使用して Amazon S3 内の 1 つのオブジェクトをコピーすると共に、CopyObject メソッドにより getcommand() を連続的に呼び出してオブジェクトの複数コピーを作成する例を示しています。

1

Aws\S3\S3Client クラスのコンストラクタを使用して、Amazon S3 クライアントのインスタンスを作成します。

2

オブジェクトの複数のコピーを作成するため、Aws\CommandInterface クラスから継承された、Amazon S3 クライアントの getCommand() メソッドの呼び出しを連続的に実行します。最初の引数として CopyObject コマンドを指定し、2 番目の引数としてコピー元のバケット、コピー元のキー名、コピー先のバケット、コピー先のキー名を含む array を指定します。

require 'vendor/autoload.php'; 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 }
Ruby

以下のタスクでは、Ruby のクラスを使用して、Amazon S3 内のバケット間または同一バケット内でオブジェクトをコピーする手順を示します。

1

AWS SDK for Ruby のバージョン 3 用の Amazon S3 のモジュール化された gem を使用し、aws-sdk-s3 を要求して、AWS 認証情報を提供します。認証情報の指定の詳細については、「 AWS アカウント または IAM ユーザーの認証情報を使用したリクエストの実行」を参照してください。

2

コピー元のバケット名、コピー元のキー名、コピー先のバケット名、コピー先のキー名などのリクエスト情報を提供します。

次の Ruby サンプルコードは、前のタスクで #copy_object メソッドを使用してバケット間でオブジェクトをコピーする方法を示しています。

require 'aws-sdk-s3' # Copies an object from one Amazon S3 bucket to another. # # Prerequisites: # # - Two S3 buckets (a source bucket and a target bucket). # - An object in the source bucket to be copied. # # @param s3_client [Aws::S3::Client] An initialized Amazon S3 client. # @param source_bucket_name [String] The source bucket's name. # @param source_key [String] The name of the object # in the source bucket to be copied. # @param target_bucket_name [String] The target bucket's name. # @param target_key [String] The name of the copied object. # @return [Boolean] true if the object was copied; otherwise, false. # @example # s3_client = Aws::S3::Client.new(region: 'us-east-1') # exit 1 unless object_copied?( # s3_client, # 'doc-example-bucket1', # 'my-source-file.txt', # 'doc-example-bucket2', # 'my-target-file.txt' # ) def object_copied?( s3_client, source_bucket_name, source_key, target_bucket_name, target_key) return true if s3_client.copy_object( bucket: target_bucket_name, copy_source: source_bucket_name + '/' + source_key, key: target_key ) rescue StandardError => e puts "Error while copying object: #{e.message}" end

次の例では、REST を使用してオブジェクトをコピーする方法について説明します。REST API の詳細については、「PUT Object (Copy)」を参照してください。

このサンプルは、flotsam オブジェクト (pacific バケット) を jetsam オブジェクト (atlantic バケット) にコピーし、そのメタデータを維持します。

PUT /jetsam HTTP/1.1 Host: atlantic.s3.amazonaws.com x-amz-copy-source: /pacific/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:/pacific/flotsam\r\n /atlantic/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>