【Rails】AWSのS3を使ってHerokuで画像を投稿できるようにする方法
1. AWSアカウントの作成
AWS公式のアカウント作成の流れを参考に、アカウントを作る。
2. IAMユーザーを作成する
ログインできたら、ダッシュボードから「IAM」を選択。
左側のメニューから「ユーザー」を選択。
「ユーザーを追加」を選択。
ユーザー名を入力し、「プログラムによるアクセス」にチェックを入れる。
「既存のポリシーを直接アタッチ」を選択し、「AmazonS3FullAccess」にチェックを入れる。
タグの設定に関しては何もしないで次のページへ。
ここも何もしない。
後々使うため、CSVファイルをダウンロードしておく。これでIAMユーザーの作成は完了。
3. バケットを作成
TOP画面から「S3」をクリックする。
「バケットを作成する」をクリックする。
バケット名を入力しリージョン(地域)は「東京」を選択する。(既に使われているバケット名は使えない)
「プロパティ」の設定に関しては何もしないで次のページへ。
一番上の「パブリック…」のチェックを外し、下の2つの「新規の…」と「任意の…」にチェックを入れる。
確認画面が表示されるので「バケットを作成」をクリック。これでAWS上での作業は完了。
4. CA証明書を設置する
$ CERT_PATH=$(ruby -ropenssl -e "puts OpenSSL::X509::DEFAULT_CERT_FILE")
$ sudo curl "https://curl.haxx.se/ca/cacert.pem" -o $CERT_PATH
SSL接続で使用するCA証明書を設置するために、上のコマンドを叩く。
これをやっておかないと、ファイルをアップした時にエラーが起きる可能性があるらしい。
5. Gemをインストール
gem "aws-sdk-s3", require: false
SDKのgemが必要なので、Gemfile
に追記。
bundle install
コマンドを叩いてインストールする。
6. 資格情報を編集
先ほど得たアクセスキーを設定していく。
アクセスキーは先ほどダウンロードしたCSVファイルに記述されている。(左がアクセスキーID、右がシークレットアクセスキー)
$ EDITOR=vim rails credentials:edit
秘密情報を管理するためのcredentials.yml
を編集していく。
aws: access_key_id: (アクセスキーID) secret_access_key: (シークレットアクセスキー)
先ほど得たアクセスキーたちを当てはめつつ、上の設定を追記する。(最初からコメントアウトされている場合もある)
7. 画像の保存先をS3に変更する
amazon: service: S3 access_key_id: <%= Rails.application.credentials.dig(:aws, :access_key_id) %> secret_access_key: <%= Rails.application.credentials.dig(:aws, :secret_access_key) %> region: # アクセスキーID bucket: # バケット名
config/storage.yml
に、上のように追記する。(スペース1つの差でエラーになるため注意が必要)
8. development.rbに追記
config.active_storage.service = :amazon
config/environments/development.rb
に、上のように追記する。
9. マスターキーをセットする
config/master.key
を開き、そこにある文字列をコピーする。
$ heroku config:set RAILS_MASTER_KEY= <取得した文字列>
そしてその文字列を当てはめつつ、上のコマンドを叩く。
$ heroku buildpacks:add -i 1 https://github.com/heroku/heroku-buildpack-activestorage-preview
そして上のコマンドを叩く。
10. デプロイ&マイグレーション
$ git add .$ git commit -m "s3 edit"$ git push heroku master$ heroku run rails db:migrate
最後にデプロイとマイグレーションをすれば完了。
エラーの対処法
「Application error」と表示される場合
デプロイ後にそのURLにアクセスし、上のようにエラーとなった場合。
$ heroku logs --tail
でログを見たり
$ heroku run rails c
でコンソールを起動してあげると、エラーの原因が分かることが多い。
images内の画像が表示されない場合
「Heroku下で投稿した画像ではなく、assets/images
内にある画像が表示されない」という場合。
config.assets.compile = falseconfig.assets.compile = true
config/environments/development.rb
をこのように修正すれば解決するかも。