setoya-blog

システム開発技術、データ分析関連でお勉強したことや、山奥生活を綴る、テンション低めなブログです。

rubyのaws-sdkを使って、heroku上のrailsアプリからS3にファイルを置く

前提

  • Rails3を使ったWebアプリをheroku上で稼働させている
  • base64エンコーディングされて、POSTのパラメータとして渡ってきたmp3ファイルをAmazon S3に配置することを想定
  • 事前にAWSのアカウントとcredentialsは取得済

手順

1. 初期化ファイルをconfig/initializers以下に追加

config/initializers/aws.rb

# aws-sdk用の設定初期化
# load the libraries
require 'aws'
# log requests using the default rails logger
AWS.config(:logger => Rails.logger)
# load credentials from a file
config_path = File.expand_path(File.dirname(__FILE__)+"/../aws.yml")
AWS.config(YAML.load(File.read(config_path)))

2. 設定ファイルをconfig/以下に追加
config/aws.yml

# aws-sdkとpaperclipのAWS保存用の設定ファイル。
development:
  access_key_id: xxxxx
  secret_access_key: xxxxx

test:
  access_key_id: xxxxx
  secret_access_key: xxxxx

production:
  access_key_id: xxxxx
  secret_access_key: xxxxx

3. ファイルをS3に配置するロジックを追加
hogehoge_controller
(実際はモデルなどにロジックを移動するべし)

    #require 'aws-sdk'が必要
    input_mp3_data =params[:mp3_binary_data]

    mp3_data = Base64.strict_decode64(input_mp3_data)

    s3 = AWS::S3.new
    bucket = s3.buckets['AMAZON_S3_BUCKET_NAME'] #AMAZON_S3_BUCKET_NAMEは自分のバケット名に変える
    key = 'AMAZON_S3_MP3_FILE_ROOT' + 'file.mp3'
    object = bucket.objects[key]
    object.write(
      mp3_data,   #一つ目の引数でバイナリを渡してしまえば良い
      {
        :acl => :private,    #非公開にする場合、ここで:privateを指定しておく
        :content_type => 'audio/mp3'
      }
    )

公式資料はこちら

入門ガイド
APIリファレンス