LoginSignup
7

More than 5 years have passed since last update.

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

Posted at

概要

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

  • 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>"
}

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7