概要
そもそもそのような使い方は想定されていないので制限があるけど、要件がマッチするなら便利かもしれない。
- Multipart Upload (Copy) を利用することで、S3側で複数のオブジェクトを1つのオブジェクトに結合が可能。ローカルへのダウンロード、アップロードを行わずに実施できる。
- ただし、マルチアップロードの制限に準ずるため、各オブジェクトは 5 MB 以上である必要がある。 (末尾のオブジェクトは5MB未満もOK)
ざっくり手順
- マルチパートアップロードの初期化
aws s3api create-multipart-upload --bucket <dest_bucket> --key <dest_key>
- パーツのコピー
aws s3api upload-part-copy --bucket <dest_bucket> --copy-source <src_bucket>/<src_key> --key <dest_key> --part-number 1 --upload-id <upload_id>
- マルチパートアップロード完了
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
には、全てのパーツを PartNumber
と ETag
を指定して列挙する必要があります。
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>"
}