この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。
yoppiです。今回はRubyでAmazon S3のマルチパートアップロードを行う方法を紹介させていただこうと思います。
Amazon S3のストレージシステムをAPIで利用する場合、ファイルアップロードを1回のリクエストで行うことは、ファイルのサイズが大きくなるにつれて失敗の確率が大きくなります。
そのリスクを回避するための機能がマルチパートアップロードです。詳細は下記のリンクを参照していただくことにして、簡単に説明するとファイルを小分けにして、複数回のリクエストでアップロードできるというものです。
便利である分、APIの仕様が複雑になっているのですが、Ruby用のSDKでは(他の言語用も多分そうでしょうが)難しい仕様は隠ぺいする形で実装されているので、便利な機能が簡単に使えるようになっています。
SDKはgemで提供されているので、簡単に導入できます。
gem install aws-sdk
以下に利用例のコードを紹介します。
require 'aws-sdk'
AWS.config(
:access_key_id => 'YOUR_ACCESS_KEY_ID',
:secret_access_key => 'YOUR_SECRET_ACCESS_KEY')
file_path_for_multipart_upload = 'SOME_FILE_PATH'
#前もってSOME_BUCKET_NAMEという名前のバケットを作成する必要がある
bucket = AWS::S3.new.buckets['SOME_BUCKET_NAME']
open(file_path_for_multipart_upload) do |file|
uploading_object = bucket.objects[File.basename(file.path)]
uploading_object.multipart_upload do |upload|
while !file.eof?
upload.add_part(file.read 10.megabytes)
p('Aborted') if upload.aborted?
end
end
end
AWS::S3::S3Objectのインスタンスを生成し、multipart_uploadに引数1つのブロックを渡し実行します。
渡したブロックの引数にAWS::S3::MultipartUploadのインスタンスが渡されるので、それのadd_partに小分けにしたファイルの内容を渡す。
大まかには以上のようになります。
マルチパートアップロードでも失敗する場合はあり、それはAWS::S3::MultipartUploadのインスタンスのaborted?で判別でき、その値を元に再送など必要な処理を実装することができます。
Amazon S3を使うRubyシステムを扱う場合、大きなファイルのアップロード処理が必要になることもあると思います。
その時に是非この内容を参考に指定ただければと思います。