frontendmemo

このサイトは、「html、css、js、ruby,ツールなどについて、自分が覚えたこと、またはいつも忘れて調べることを書き溜め、それが結果といて勉強したての初心者の方や自分と同じような技術レベルの人の助けになることを目的とするWebログ」、略してブログです。挨拶→http://frontendmemo.hatenablog.com/entry/2016/06/25/115845

paperclipをheroku上でも可能にする

スポンサードリンク


スポンサードリンク


paperclipで画像を投稿した際、herokuでは一時的に保存されるだけで、数時間経つと読み込みできなくなっていました。

こちらは、awsでiam userのアクセスIDとkeyの取得、heroku上の環境変数の設定、paperclip.rbの作成の必要があります。

i am userのアクセスIDとkeyの取得

こちらを参考にidとkeyを取得します。
https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_credentials_access-keys.html
keyはこの時しか見れないので、ローカルなどに保存しておきます。

heroku上の環境変数の設定、paperclip.rbの作成

こちらを参考にheroku上の環境変数の設定、paperclip.rbの作成します。
Uploading Files to S3 in Ruby with Paperclip | Heroku Dev Center

自分が陥ったエラー経験も元に注意点書いて見ます。

# Gemfile
gem 'paperclip'
gem 'aws-sdk', '~> 2.3'

gem 'aws-sdk', '~> 3'にしないとエラー出ました
www.frontendmemo.xyz

# config/environments/production.rb
config.paperclip_defaults = {
storage: :s3,
s3_credentials: {
bucket: ENV.fetch('S3_BUCKET_NAME'),
access_key_id: ENV.fetch('AWS_ACCESS_KEY_ID'),
secret_access_key: ENV.fetch('AWS_SECRET_ACCESS_KEY'),
s3_region: ENV.fetch('AWS_REGION'),
}
}

ここはそのまま

heroku config:set S3_BUCKET_NAME=your_bucket_name
heroku config:set AWS_ACCESS_KEY_ID=your_access_key_id
heroku config:set AWS_SECRET_ACCESS_KEY=your_secret_access_key
heroku config:set AWS_REGION=your_aws_region

your_bucket_nameは自由でいいそうですが、my-app-image-bucketしておけば良いかと
your_access_key_idとyour_secret_access_keyは先ほど作成したiamuserのものです。
リージョンの調べ方はこちらを参考にします。
https://docs.aws.amazon.com/ja_jp/general/latest/gr/rande.html#s3_region

# config/initializers/paperclip.rb

Paperclip::Attachment.default_options[:url] = ':s3_domain_url'
Paperclip::Attachment.default_options[:path] = '/:class/:attachment/:id_partition/:style/:filename'
Paperclip::Attachment.default_options[:s3_host_name] = 's3-us-west-2.amazonaws.com'

:s3_domain_urlはmy-app-image-bucketにしていたらmy-app-image-bucket.s3.amazonaws.comとします。
Paperclip::Attachment.default_options[:path] = '/:class/:attachment/:id_partition/:style/:filename'はそのまま
Paperclip::Attachment.default_options[:s3_host_name] = 's3-us-west-2.amazonaws.com'
s3-us-west-2はリージョンを設定します。