酒と泪とRubyとRailsと

Ruby on Rails と Objective-C は酒の肴です!

Fog + carrierwaveでAWS S3に画像をアップロード

fog』はRubyのクラウドサービス向けのライブラリ(gem)です。 このfogと「carrierwave」を使うと、ユーザー向けの画像アップロードフォーム => S3への画像アップロードが、超簡単に実装できてしまいます!

アルバイトを10秒で探せるiPhone/Androidアプリ Short.Works」でも画像アップロードの部分に活用しています!


目次

今回はcarriewave + Rails 4.1にfogを追加してS3にアップロードする部分を中心に説明します。

1) AWS でアクセスキーとシークレットキーを取得
2) S3 のブラケット作成
3) Carrierwave + Railsの基本実装
4) fogの導入(gem)
5) アップローダー(xxx_uploader.rb)の実装
6) carrierwave 設定ファイルの実装

1) AWS でアクセスキーとシークレットキーを取得

AWSのコンソール」にログイン。

AWSにログインしたら右の自分のユーザー名 => Security Credencialを選択。

スクリーンショット_2014-08-07_21_04_19

その中で、アクセスキーとシークレットキーを選択・作成。

aws console

このコードをあとでRails側で設定します。

2) S3 のバケット作成

S3のバケット(Bucket)を作成します。まずはS3を選択。

スクリーンショット_2014-08-08_9_58_41

S3でバケットを作成。

スクリーンショット_2014-08-08_10_02_39

3) Carrierwave + Railsの基本実装

Carrierwave + Rails 4.1での基本的な実装は拙著『Carrierwave + Rails 4.1 画像アップローダー』をご参照頂ければ幸いです!

ここでは、上記の実装まで完了している前提で、fogを組み込む部分を中心に説明を書いていきます。

4) fogの導入(gem)

Gemfileに以下を追加して、bundle installを実行。

1
gem 'fog'

5) アップローダー(xxx_uploader.rb)の実装

uploaders/xxx_uploader.rbを以下のように変更。

1
2
3
storage :file
# ↓ 以下のように変更
storage :fog

6) carrierwave 設定ファイルの実装

config/initialize/carrierwave.rbのファイルを作成して以下のように記述。

ACCESS_KEYとSECRET_KEYは「1) AWS でアクセスキーとシークレットキーを取得」で取得したものを貼り付け。

リージョンは『Regions and Endpoints - Amazon Web Services』を参照。ちなみに東京リージョンならap-northeast-1

config.fog_directoryconfig.asset_hostには、S3のバケットの名前を入れる。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
CarrierWave.configure do |config|
  config.fog_credentials = {
      :provider               => 'AWS',
      :aws_access_key_id      => 'ACCESS_KEY',
      :aws_secret_access_key  => 'SECRET_KEY',
      :region                 => 'REGION',
      :path_style             => true,
  }

  config.fog_public     = true
  config.fog_attributes = {'Cache-Control' => 'public, max-age=86400'}

  case Rails.env
    when 'production'
      config.fog_directory = 'example.com'
      config.asset_host = 'https://s3-ap-northeast-1.amazonaws.com/example.com'
    when 'staging'
      config.fog_directory = 'stg.example.com'
      config.asset_host = 'https://s3-ap-northeast-1.amazonaws.com/stg.example.com'
    when 'development'
      config.fog_directory = 'dev.example.com'
      config.asset_host = 'https://s3-ap-northeast-1.amazonaws.com/dev.example.com'
    when 'test'
      config.fog_directory = 'test.example.com'
      config.asset_host = 'https://s3-ap-northeast-1.amazonaws.com/test.example.com'
  end
end

これで画像がS3にアップロードされるようになるはずデス!

Special Thanks

RailsとCarrierWaveでAmazon S3に画像を保存する | Workabroad.jp

Amazon S3に別アカウントから書き込みを許可する場合の設定 | cloudpack技術情報サイト

おすすめの書籍