nigoblog

技術系会社のCEOブログ~私的編~

Rails 3.2 でAmazon S3を使う方法

今回ハマったのでメモ代わりに

そもそもS3ってなんだろうというところはこちら
#15 ストレージサービスを使ってみよう | Amazon Web Services入門 - プログラミングならドットインストール

手順的には

  1. S3インスタンスを作成
  2. gemをインストール
  3. railsモジュールを作成
  4. S3へのアクセス

という形で進んでいきます。

gemをインストール

Railsプロジェクト内のGemfileに次のように書き込みます。

gem 'aws-s3', :require => 'aws/s3'

その後

> bundle install

でgemを追加。

railsモジュールの作成

Rails 3.1で画像ストレージにAmazon S3を使う - is Neet
こちらの記事を参考にしました。
railsプロジェクト内の
lib/
配下に
例えばaws_module.rb
というファイルを作成します。
内容は

# -*- coding: utf-8 -*-

module Aws 
  require 'aws/s3'
  include AWS::S3

  BUCKET = "[bucket_name]"

  # moduleをincludeした時にAWSの設定を実行する
  def self.included(model)
    AWS::S3::Base.establish_connection!(
      :access_key_id     => 'xxx', 
      :secret_access_key => 'xxx
    )   
    AWS::S3::DEFAULT_HOST.replace "s3-ap-northeast-1.amazonaws.com"
  end 
end

ここで
RoutingError initialize constants
というエラーが出ることがありますが、それは

require 'aws/s3'
include AWS::S3

これがないと発生するのでしっかり付けておきましょう。

このモジュールをコントローラなどで

load 'aws_module.rb'
include Aws 

というように呼び出します。

S3へのアクセス

ここは一番参考になるのは公式のドキュメントでした。
AWS::S3 - Ruby Library for Amazon Simple Storage Service (S3)

例えばRailsからS3のディレクトリを作成する際には次のように書きます。

S3Object.store("[Directory_name]", nil, '[Bucket_name]')

Directory_nameとBucket_nameを適宜置き換えます。
大抵はこのstoreを駆使しアップロードを行います。

逆に取得はstreamなどを駆使します。

まとめ

色々資料がありましたが、
結局公式ドキュメントが一番参考になりました。