t-sanoブログ

メモです。マイペースにアウトプットします。

S3へのファイルアップロード方法を検討する

S3へのファイルアップロード方法はいくつかある。 それぞれの特徴を検討してみる。

前提

ファイルをアップロードするケースとして、今回は下記2つを想定している。

  1. サービス管理者はサーバ(またはローカル環境)からファイルをアップロードしたい。
  2. サービス利用者はローカル環境からファイルをアップロードしたい。

1.マウントしてアップロードする(SFTP等)

マウントしている環境からファイルをアップロードする場合は、利用用途としては良さそうだ。バッチ処理などには向いているのではないだろうか。 ただ、Webサービスなどのように、クライアントからサーバ経由でS3ファイルアップロードとなると、場合によっては無駄な処理を挟むことになる。

方法

S3をマウントしてアプロードする方法で代表的なものは、下記の2つだと考える。

  • s3fs
  • goofys

こちらについては、様々な記事で検証しているので、そちらを参考にした。

dev.classmethod.jp

s3fsについては、利用したことがあるので、参考にした記事に大きく頷くものがあった。 使うなら、goofysだろうか。s3fsよりもかなり早そうだし。

2.HTTP(S)でアップロードする

特に制約がなければ、こちらの方法でS3に直接アップロードするのが効率的だと思う。 ただし、利用者を制限する必要がある。(管理者のみ利用可能にする等) CDP:Direct Object Uploadパターンを想像している。

方法

HTTP(S)を利用してアプロードする方法としては、下記の2つがあると考える。

DragonDiskを利用すれば、エクスプローラーで利用するのと同じようにファイルをアップロードするのは簡単そうだ。 素人でもファイルをアップロードできるだろう。 AWS SDKを利用すれば、HTMLのフォームで選択したファイルをS3に直接アップロードすることができるだろう。 AWS SDKについては、別途、試してみる予定。

3.アプリケーションサーバでアップロードする

アプリケーションサーバで何らかの処理をして、ファイルをアップロードする方法。 例えば、画像のサイズを加工してからS3にアップロードする等。 ファイルサイズが大きくなければ、問題ないと思う。rubyであれば、用途に合うgemもあるし。 動画等、ファイルサイズが大きいものであれば、転送時間がかかってしまうので工夫が必要かも。

方法

rubyを利用するのであれば、下記のような便利なgemがある。

  • CarrerWave
  • fog
  • refile

こちらについても、別途、試してみる予定。