CarrierWaveを利用した画像ファイルのアップロード(4)

こんにちは。beaglesoftの真鍋です。

前回まででCarrierWaveを利用したファイルのアップロードが簡単に行えることを確認しました。今回は、アップロード先をAmazonS3に変更して保存できることを確認したいと思います。

前提条件

今回はAmazonS3を利用します。あらかじめAmazonS3が利用できる環境を用意してください。

fogを追加する

今回はAmazonS3へファイルをアップロードするためにfog - The Ruby cloud services libraryを利用します。Gemfileに依存関係を追加します。

source 'https://rubygems.org'

...
gem 'fog'
...

また、bundle installを実行します。

$ bundle install --path=vendor/bundle
Fetching gem metadata from https://rubygems.org/...........
Fetching version metadata from https://rubygems.org/...
Fetching dependency metadata from https://rubygems.org/..
Resolving dependencies....
...
Installing fog 1.38.0
...
Bundle complete! 14 Gemfile dependencies, 93 gems now installed.
Bundled gems are installed into ./vendor/bundle.

Process finished with exit code 0

AmazonS3の設定を行う

AmazonS3ではあらかじめbucketを作成した状態で利用したいと思います。Bucketの作成手順は以下のとおりです。

  1. IAMでAWSのマネジメントコンソールにログインする。
  2. サービスからS3を選択する。 screencapture-console-aws-amazon-com-s3-home-1459732967822.png 2016-04-04 10-23-18.png (39.2 kB)

  3. [バケットを作成]ボタンをクリックしてバケットを作成する。

    1. バケット名は今回はcarrier-waveとしました。 スクリーンショット 2016-04-04 10.22.17.png (141.1 kB)

    2. ログの出力については予め設定しました。 スクリーンショット 2016-04-04 10.22.34.png (110.2 kB)

  4. 作成されたBucketは一覧に表示されます。 screencapture-console-aws-amazon-com-s3-home-1459732967822.png 2016-04-04 10-23-55.png (238.4 kB)

認証情報の確認

AmazonS3へアクセスするためには認証情報として以下の情報が必要となります。

  1. AWSのアクセスキーID
  2. AWSのシークレットアクセスキー

これらはIAM作成時に取得できますが、詳細は下記を確認してください。

IAM ユーザーのアクセスキーの管理 - AWS Identity and Access Management

S3をCarrierWaveに設定する

最後にS3の設定をCarrierWaveに設定します。設定するファイルはconfig/initializers/carrierwave.rbとなります。

CarrierWave::SanitizedFile.sanitize_regexp = /[^[:word:]\.\-\+]/

CarrierWave.configure do |config|

  config.fog_credentials = {
      :provider               => 'AWS',
      :aws_access_key_id      => ENV['AWS_ACCESS_KEY_ID'],
      :aws_secret_access_key  => ENV['AWS_SECRET_ACCESS_KEY'],
      :region                 => 'ap-northeast-1'
  }

  config.fog_directory = 'carrier-wave' if Rails.env.production?
  config.fog_directory = 'carrier-wave' if Rails.env.development?

end

また、aws_access_key_idaws_secret_access_keyはgitなどにあげてしまうと怖いので環境変数に設定することにします。

$ export AWS_ACCESS_KEY_ID=XXXXXXXX
$ export AWS_SECRET_ACCESS_KEY=XXXXXXXXXX

※もしくは、.zshrcなり.bashrcにexport ...を追記してください。

S3へアップロードの動作確認

実際にアプリケーションを起動してS3へアップロードできることを確認します。(AWS CLIを利用できる前提です。画面で確認することも可能です。)

╭─ymanabe@Yoichiro-no-MacBook-Pro  ~ ‹2.2.4›
╰─$ aws s3 ls s3://carrier-wave/tmp/picture_store/picture/9/
2016-04-04 11:34:08      20734 ビーグルソフト.png

ソースコード

ソースコードはGithubにあります。参考に利用してください。

beaglesoftjp/CarrierWaveExample: CarrierWaveを利用したファイルのアップロードを行うサンプルです。