Help us understand the problem. What is going on with this article?

S3上のオブジェクトをダウンロードせずに結合したい

More than 3 years have passed since last update.

概要

そもそもそのような使い方は想定されていないので制限があるけど、要件がマッチするなら便利かもしれない。

  • Multipart Upload (Copy) を利用することで、S3側で複数のオブジェクトを1つのオブジェクトに結合が可能。ローカルへのダウンロード、アップロードを行わずに実施できる。
  • ただし、マルチアップロードの制限に準ずるため、各オブジェクトは 5 MB 以上である必要がある。 (末尾のオブジェクトは5MB未満もOK)

ざっくり手順

  1. マルチパートアップロードの初期化
    aws s3api create-multipart-upload --bucket <dest_bucket> --key <dest_key>
  2. パーツのコピー
    aws s3api upload-part-copy --bucket <dest_bucket> --copy-source <src_bucket>/<src_key> --key <dest_key> --part-number 1 --upload-id <upload_id>
  3. マルチパートアップロード完了
    aws s3api complete-multipart-upload --bucket --key <dest_key> --upload-id <upload_id> --multipart-upload "Parts=[{ETag=ETag1,PartNumber=1},{ETag=ETag2,PartNumber=2}]"

詳細

マルチパートアップロード初期化

作成先のキーを指定して、UploadId を取得します。

aws s3api create-multipart-upload --bucket <dest_bucket> --key <dest_key>

{
    "Bucket": "<dest_bucket>",
    "UploadId": "pc7Gsw_6jFitDrTeqcmB...kLJnG77fkrQgpVqJAI9nEaiSjg--",
    "Key": "<dest_key>"
}

パーツのコピー

結合対象のオブジェクトをコピーしていきます。
--copy-source でコピー元を指定します。
ETag が返却されるのでメモします。

aws s3api upload-part-copy --bucket <dest_bucket> --copy-source <src_bucket>/<src_key> --key <dest_key> --part-number 1 --upload-id <upload_id>

{
    "CopyPartResult": {
        "LastModified": "2016-11-13T01:45:08.000Z",
        "ETag": "\"ec8bb3b24d5b0f1b5bdf8c8f0f541ee6\""
    }
}

aws s3api upload-part-copy --bucket <dest_bucket> --copy-source <src_bucket>/<src_key> --key <dest_key> --part-number 2 --upload-id <upload_id>

{
    "CopyPartResult": {
        "LastModified": "2016-11-13T01:45:14.000Z",
        "ETag": "\"25e317773f308e446cc84c503a6d1f85\""
    }
}

ここではオブジェクトのコピーする位置も指定可能です。本来5GBを超えるオブジェクトをコピーするために利用されるので、この場合は当然ながら5GB以下のレンジを指定してマルチパートとしていきます。

マルチパートアップロード完了

--multipart-upload には、全てのパーツを PartNumberETag を指定して列挙する必要があります。

aws s3api complete-multipart-upload --bucket <desy_key> --key <dest_key> --upload-id <upload_id> --multipart-upload "Parts=[{ETag=ec8bb3b24d5b0f1b5bdf8c8f0f541ee6,PartNumber=1},{ETag=25e317773f308e446cc84c503a6d1f85,PartNumber=2}]"
{
    "ETag": "\"4998c056afc65f55ea2ccf3a4714b5e5-2\"",
    "Location": "https://<dest_bucket>/<dest_key>",
    "Bucket": "<dest_bucket>",
    "Key": "<dest_key>"
}
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away