Herokuで作るFacebookアプリ

第11回 Herokuでファイルアップロードを実装しよう

この記事を読むのに必要な時間:およそ 2 分

保存先をAmazon S3に

続いて,Herokuで利用できるようにAmazon S3を利用するように変更していきましょう。carrierwaveで保存先をS3に指定するためには,fogというgemを利用します。このgemはAmazon S3に限らず様々なクラウドのサービスをRubyから利用しやすくしてくれるライブラリです。carrierwaveでは,S3を利用するためにこのgemを使うので以下の行をGemfileに追加してfogを利用できるようにします。

gem “fog”

gemを追加したので,bundlerを実行します。

$ bundle

carrierwaveでS3を利用するために設定ファイルを追加して,設定を書きます。config/initializers/carrierwave.rbというファイルを以下の内容で作成します。

CarrierWave.configure do |config|
  config.fog_credentials = {
    :provider               => 'AWS',
    :aws_access_key_id      => ENV["AWS_S3_KEY_ID"],
    :aws_secret_access_key  => ENV["AWS_S3_SECRET_KEY"]
  }
  config.fog_directory  = ENV["AWS_S3_BUCKET"]
end

Herokuでは,鍵の情報や環境ごとに異なる設定などはENVに登録するとコマンドと連携して設定しやすいのでENVから読み出すようにしました。以下のコマンドを発行すれば,ENVを設定することができます。

heroku config:add AWS_S3_KEY_ID="xxxx" AWS_S3_SECRET_KEY="yyyy" AWS_S3_BUCKET="gggg"

KEY_IDとSECRET_KEYは,Amazon Web Serviceの「セキュリティー証明書」のページからさ取得できます。BUCKETは,S3の管理画面からbucketを作成しその名前を設定します。

次に,ImageUploaderクラス(app/uploaders/image_uploader.rb)を編集して,ファイルアップロード先をS3に指定します。storageメソッドの引数に:fileが指定されていますが,以下のように:fogを指定するようにします。

storage :fog

また,最終的にはファイルはS3に保存されるのですが,一旦はHerokuのインスタンスで受け取る形になります。そのような場合のために,app/tmpディレクトリは一時的に書き込み可能になっています。carrierwaveの初期設定でファイルを一旦保持するためのディレクトリが別のディレクトリになっているので,以下のメソッドを定義して一時保存先をtmpディレクトリ以下に変更します。

def cache_dir
  "#{Rails.root}/tmp/uploads"
end

これで保存先をS3に変更できました。非常に簡単ですね。この保存先の変更のコミットはこちらになっています。

まとめ

carrierwaveとAmazon S3を利用することで,ファイルの保存に制限のあるHerokuでも,これほど簡単にファイルアップロード機能が実現できました。Herokuがマルチテナントのプラットホームであるがゆえの制限ですが,これほど簡単に問題が解決できるようになっているのであれば制限というほどではないと考えられるのではないでしょうか。

次回は,Webサービスで一般的に利用されるであろう非同期のサーバでの処理をHerokuで実現する方法を紹介します。

著者プロフィール

松村章弘(まつむらあきひろ,ハンドルネーム:mat_aki)

SonicGarden プログラマー。

1984年生まれ。社会人1年目からRuby on Railsのみで開発を続け現在4年目。Webサービスの企画・運営・プログラミングまですべてをこなす。世界で利用されるWebサービスを創ることを目標にしている。現在は youRoom の開発を行っている。

mat_akiの日記:http://d.hatena.ne.jp/mat_aki/

Twitter:http://twitter.com/mat_aki

コメント

コメントの記入