LoginSignup
34

More than 1 year has passed since last update.

posted at

【Rails】Carrierwaveとfog-awsを用いて、画像をAWS S3へアップロードする方法

目標

ezgif.com-video-to-gif.gif

開発環境

・Ruby: 2.5.7
・Rails: 5.2.4
・Vagrant: 2.2.7
・VirtualBox: 6.1
・OS: macOS Catalina

前提

AWSのアカウントを登録済み。

下記実装済み。

投稿機能実装
Carrierwaveを用いた画像投稿機能実装

AWSの設定

1.下記リンクへアクセス

AWS マネジメントコンソール

2.サービスをクリック

スクリーンショット 2020-06-16 19.30.54.png

3.IAMをクリック

スクリーンショット 2020-06-16 19.31.06.png

4.ユーザーをクリック

スクリーンショット 2020-06-16 19.31.15.png

5.ユーザーを追加をクリック

スクリーンショット 2020-06-16 19.31.33.png

6.ユーザー詳細の設定

①ユーザー名を記入する。(適当で良い)

②アクセスの種類をプログラムによるアクセスに設定する。

次のステップ:アクセス制限をクリック
スクリーンショット 2020-06-16 19.32.08.png

7.既存のポリシーを直接アタッチをクリック

スクリーンショット 2020-06-16 19.32.48.png

8.AmazonS3FullAccessを選択し、次のステップ:タグをクリック

スクリーンショット 2020-06-16 19.33.41.png

9.次のステップ:確認をクリック

スクリーンショット 2020-06-16 19.33.58.png

10.ユーザーの作成をクリック

スクリーンショット 2020-06-16 19.34.06.png

11.アクセスキーIDシークレットアクセスキーをコピーして控え、サービスをクリック

スクリーンショット 2020-06-16 19.35.07.png

12.S3をクリック

スクリーンショット 2020-06-16 19.36.03.png

13.バケットを作成するをクリック

スクリーンショット 2020-06-16 19.36.15.png

14.名前とリージョンを設定

①バケット名を入力する。(適当で良い)

②リージョンをアジアパシフィック(東京)に設定する。

次へをクリックする。

スクリーンショット 2020-06-16 19.37.06.png

14.次へをクリック

スクリーンショット 2020-06-16 19.38.19.png

15.次へをクリック

スクリーンショット 2020-06-16 19.38.26.png

16.バケットを作成をクリック

スクリーンショット 2020-06-16 19.38.29.png

実装

1.キーを環境変数化

①「gem 'dotenv-rails'」を導入

Gemfile
gem 'dotenv-rails'
ターミナル
& bundle

②アプリケーション直下に「.env」ファイルを作成
※アプリケーションのディレクトリに移動してから下記コマンドを実行

ターミナル
$ touch .env 

スクリーンショット 2020-06-02 11.32.54.png

.envファイルを編集

.env
S3_ACCESS_KEY_ID = 'アクセスキー' # 追記
S3_SECRET_ACCESS_KEY = 'シークレットアクセスキー' # 追記

.gitignoreファイルを編集

.gitignore
/.env # 追記

2.Gemを導入

Gemfile
gem 'fog-aws'
ターミナル
$ bundle

3.image_uploader.rbを編集

7行目のstorage :fileをコメントアウトし、下記コードを追記する。

image_uploader.rb
# 追記
if Rails.env.development? # 開発環境の場合
  storage :file
elsif Rails.env.test? # テスト環境の場合
  storage :file
else # 本番環境の場合
  storage :fog
end

storage :file
➡︎ 画像をアプリケーション内へアップロードする。

storage :fog
➡︎ 画像をS3へアップロードする。

4.carrierwave.rbを作成・編集

ターミナル
$ touch config/initializers/carrierwave.rb
carrierwave.rb
require 'carrierwave/storage/abstract'
require 'carrierwave/storage/file'
require 'carrierwave/storage/fog'

CarrierWave.configure do |config|
  if Rails.env.production? # 本番環境の場合はS3へアップロード
    config.storage :fog
    config.fog_provider = 'fog/aws'
    config.fog_directory  = 'matsubishi-sample' # バケット名
    config.fog_public = false
    config.fog_credentials = {
      provider: 'AWS',
      aws_access_key_id: ENV['S3_ACCESS_KEY_ID'], # アクセスキー
      aws_secret_access_key: ENV['S3_SECRET_ACCESS_KEY'], # シークレットアクセスキー
      region: 'ap-northeast-1', # リージョン
      path_style: true
    }
  else # 本番環境以外の場合はアプリケーション内にアップロード
    config.storage :file
    config.enable_processing = false if Rails.env.test?
  end
end

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
34