テストステ論

高テス協会会長が, テストステロンに関する情報をお届けします.

S3マルチパートアップロード

マルチパートの必要性

大きなファイル(>100MB)を送る時, 小さなファイルを送る時にはなかった問題が生まれる.

  • 電車に乗っていて, トンネルに入り, 途中でネットワークが切れてしまったらどうするのか?また最初から送り直すのだろうか?
  • 会社が大きなファイルを送ることを禁じていたらどうするのだろうか?

マルチパートは, 大きなファイルを分割して送ることにより,

  • 送信に失敗したパートだけを再送すればいい.
  • 並列で送ることによって性能を稼ぐ.

REST API

マルチパートに関するREST API(参考: http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingRESTAPImpUpload.html)は以下:

  • Initiate Multipart Upload
  • Upload Part
  • Complete Multipart Upload
  • Abort Multipart Upload
  • List Parts: すでにUploadsされたpartsをリストする
  • List Multipart Uploads: 実行中のMutipart uploadsをリストする

自明なことに, Multipart UploadはただのPUTと同等の機能がなければいけない(iow, 単に代替可能でなければいけない). これは,

  • メタデータをつけることが出来る. これはInitiate時につける.
  • Completeしたあとは, Multipartでuploadしたことは情報としては残らない.

ことを意味する. AWS S3の場合は, Completeした場合は, 各々のPartsについては課金されず, おそらくPUTと同等になる. (過程ではなく結果のみに課金するということ)

一連のアップロードは, Initiate時に受け取ったアップロードIDによって結び付けられる. 各アップロードは, 他にパート番号を必要とする. これは, ドキュメントを読む限りでは連続である必要はないが, Complete時には昇順に連結される.

各アップロードのresponseにはETagが含まれる. これはComplete時に必要となる. 以下のように, パート番号とETagのペアのリストを渡す必要があり, これが認証されて始めて, S3サーバ内でComplete処理に入る. 従って, S3サーバ内では同等の情報を保持しておく必要がある.

POST /ObjectName?uploadId=UploadId HTTP/1.1
Host: BucketName.s3.amazonaws.com
Date: Date
Content-Length: Size
Authorization: authorization string

<CompleteMultipartUpload>
  <Part>
    <PartNumber>PartNumber</PartNumber>
    <ETag>ETag</ETag>
  </Part>
  ...
</CompleteMultipartUpload>

その他

  • 制限時間はない. Once you initiate a multipart upload there is no expiry; you must explicitly complete or abort the multipart upload.
  • 署名は, 各リクエスト(Initiate, Upload, Complete)ごとに行われ, 他のリクエストと差はない. For request signing, multipart upload is just a series of regular requests, you initiate multipart upload, send one or more requests to upload parts, and finally complete multipart upload. You sign each request individually, there is nothing special about signing multipart upload requests.
  • Multipart upload中にそのオブジェクトを削除するリクエストが来た場合, Part uploadがackすることはあるかも知れないが, 最終的にはオブジェクトは消滅する. (これは実装が結構難しいと思う)