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にアップロードされるようになるはずデス!

参考リンク

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

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