Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
7
Help us understand the problem. What is going on with this article?
@iogi

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>"
}
7
Help us understand the problem. What is going on with this article?
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

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
7
Help us understand the problem. What is going on with this article?