

# マルチパートアップロードを使用したオブジェクトのコピー
<a name="CopyingObjectsMPUapi"></a>

マルチパートアップロードを使用すると、オブジェクトをパートのセットとしてコピーすることができます。このセクションの例は、Multipart Upload API を使用して 5 GB よりも大きいオブジェクトをコピーする方法を示しています。マルチパートアップロードの詳細については、「[Amazon S3 でのマルチパートアップロードを使用したオブジェクトのアップロードとコピー](mpuoverview.md)」を参照してください。

マルチパートアップロード API を使用せずに、1 回のオペレーションで 5 GB 未満のオブジェクトをコピーできます。AWS マネジメントコンソール、AWS CLI、REST API、または AWS SDK を使用して、5 GB 未満のオブジェクトをコピーできます。詳細については、「[オブジェクトのコピー、移動、名前の変更](copy-object.md)」を参照してください。

マルチパートアップロードで追加のチェックサムを含むオブジェクトをアップロードするエンドツーエンドの手順については、「[チュートリアル: マルチパートアップロードでオブジェクトをアップロードして、データ整合性を検証する](tutorial-s3-mpu-additional-checksums.md)」を参照してください。

次のセクションでは、REST API または AWS SDK を使用してマルチパートアップロードでオブジェクトをコピーする方法を示します。

## REST API の使用
<a name="CopyingObjctsUsingRESTMPUapi"></a>

*Amazon Simple Storage Service API リファレンス*の以下のセクションでは、マルチパートアップロードの REST API について説明しています。既存のオブジェクトをコピーするには、UploadPart (Copy) API を使用し、リクエストに `x-amz-copy-source` リクエストヘッダーを追加してコピー元オブジェクトを指定します。
+ [Initiate Multipart Upload](https://docs.aws.amazon.com/AmazonS3/latest/API/mpUploadInitiate.html)
+ [Upload Part](https://docs.aws.amazon.com/AmazonS3/latest/API/mpUploadUploadPart.html)
+ [パートのアップロード (コピー)](https://docs.aws.amazon.com/AmazonS3/latest/API/mpUploadUploadPartCopy.html)
+ [Complete Multipart Upload](https://docs.aws.amazon.com/AmazonS3/latest/API/mpUploadComplete.html)
+ [マルチパートアップロードの中止](https://docs.aws.amazon.com/AmazonS3/latest/API/mpUploadAbort.html)
+ [パートのリスト](https://docs.aws.amazon.com/AmazonS3/latest/API/mpUploadListParts.html)
+ [マルチパートアップロードのリスト](https://docs.aws.amazon.com/AmazonS3/latest/API/mpUploadListMPUpload.html)

これらの API を使用して独自の REST リクエストを作成するか、提供されている SDK のいずれかを使用できます。AWS CLI でマルチパートアップロードを使用する方法の詳細については、[の使用AWS CLI](mpu-upload-object.md#UsingCLImpUpload) を参照してください。SDK の詳細については、「[AWSマルチパートアップロードの SDK サポート](mpuoverview.md#sdksupportformpu)」を参照してください。

## AWS SDK の使用
<a name="copy-object-mpu-sdks"></a>

低レベル API を使用してオブジェクトをコピーするには、次の手順を実行します。
+ `AmazonS3Client.initiateMultipartUpload()` メソッドを呼び出して、マルチパートアップロードを開始します。
+ `AmazonS3Client.initiateMultipartUpload()` メソッドから返されたレスポンスオブジェクトのアップロード ID を保存します。このアップロード ID は、パートのアップロードオペレーションごとに指定します。
+ すべてのパートをコピーします。コピーする必要があるパートごとに、`CopyPartRequest` クラスの新しいインスタンスを作成します。パート情報として、送信元と送信先のバケット名、送信元と送信先のオブジェクトキー、アップロード ID、パートの最初と最後のバイトの場所、パート番号などを指定します。
+ `AmazonS3Client.copyPart()` メソッド呼び出しのレスポンスを保存します。各レスポンスには、アップロードしたパートの `ETag` 値とパート番号が含まれています。この情報は、マルチパートアップロードを完了するために必要です。
+ `AmazonS3Client.completeMultipartUpload()` メソッドを呼び出してコピーオペレーションを完了します。

------
#### [ Java ]

AWS SDK for Java でマルチパートアップロードを使用してオブジェクトをコピーする方法の例については、「*Amazon S3 API リファレンス*」の「[Copy part of an object from another object](https://docs.aws.amazon.com/AmazonS3/latest/API/s3_example_s3_UploadPartCopy_section.html)」を参照してください。

------
#### [ .NET ]

次の C\$1 の例では、SDK for .NET を使用して 5 GB を超える Amazon S3 オブジェクトをコピー元からコピー先 (あるバケットから別のバケットなど) にコピーする方法を示します。5 GB 未満のオブジェクトをコピーするには、1 回のオペレーションでコピーする手順を使用します ([AWS SDK の使用](copy-object.md#CopyingObjectsUsingSDKs) を参照)。Amazon S3 マルチパートアップロードの詳細については、[Amazon S3 でのマルチパートアップロードを使用したオブジェクトのアップロードとコピー](mpuoverview.md) を参照してください。

この例では、SDK for .NET マルチパートアップロード API を使用して、5 GB を超える Amazon S3 オブジェクトを S3 バケットから別のバケットにコピーする方法を示します。

```
using Amazon;
using Amazon.S3;
using Amazon.S3.Model;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;

namespace Amazon.DocSamples.S3
{
    class CopyObjectUsingMPUapiTest
    {
        private const string sourceBucket = "*** provide the name of the bucket with source object ***";
        private const string targetBucket = "*** provide the name of the bucket to copy the object to ***";
        private const string sourceObjectKey = "*** provide the name of object to copy ***";
        private const string targetObjectKey = "*** provide the name of the object copy ***";
        // 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");
            MPUCopyObjectAsync().Wait();
        }
        private static async Task MPUCopyObjectAsync()
        {
            // Create a list to store the upload part responses.
            List<UploadPartResponse> uploadResponses = new List<UploadPartResponse>();
            List<CopyPartResponse> copyResponses = new List<CopyPartResponse>();

            // Setup information required to initiate the multipart upload.
            InitiateMultipartUploadRequest initiateRequest =
                new InitiateMultipartUploadRequest
                {
                    BucketName = targetBucket,
                    Key = targetObjectKey
                };

            // Initiate the upload.
            InitiateMultipartUploadResponse initResponse =
                await s3Client.InitiateMultipartUploadAsync(initiateRequest);

            // Save the upload ID.
            String uploadId = initResponse.UploadId;

            try
            {
                // Get the size of the object.
                GetObjectMetadataRequest metadataRequest = new GetObjectMetadataRequest
                {
                    BucketName = sourceBucket,
                    Key = sourceObjectKey
                };

                GetObjectMetadataResponse metadataResponse =
                    await s3Client.GetObjectMetadataAsync(metadataRequest);
                long objectSize = metadataResponse.ContentLength; // Length in bytes.

                // Copy the parts.
                long partSize = 5 * (long)Math.Pow(2, 20); // Part size is 5 MB.

                long bytePosition = 0;
                for (int i = 1; bytePosition < objectSize; i++)
                {
                    CopyPartRequest copyRequest = new CopyPartRequest
                    {
                        DestinationBucket = targetBucket,
                        DestinationKey = targetObjectKey,
                        SourceBucket = sourceBucket,
                        SourceKey = sourceObjectKey,
                        UploadId = uploadId,
                        FirstByte = bytePosition,
                        LastByte = bytePosition + partSize - 1 >= objectSize ? objectSize - 1 : bytePosition + partSize - 1,
                        PartNumber = i
                    };

                    copyResponses.Add(await s3Client.CopyPartAsync(copyRequest));

                    bytePosition += partSize;
                }

                // Set up to complete the copy.
                CompleteMultipartUploadRequest completeRequest =
                new CompleteMultipartUploadRequest
                {
                    BucketName = targetBucket,
                    Key = targetObjectKey,
                    UploadId = initResponse.UploadId
                };
                completeRequest.AddPartETags(copyResponses);

                // Complete the copy.
                CompleteMultipartUploadResponse completeUploadResponse = 
                    await s3Client.CompleteMultipartUploadAsync(completeRequest);
            }
            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);
            }
        }
    }
}
```

------