AWS S3 バケットで保存する


S3でファイルがアップロードされる領域を準備しましょう
ファイルのバックアップであったり、ファイル処理の加工前、もしくは加工後のファイルを保存する、画像ファイルやCSSなどWebで使う静的なファイルをS3に置いて配信するなど、使い方は無限大になります

S3(Simple Storage Serviceを略してS3)で、実際にデータが格納される場所のことをバケットと呼びます。バケットの名前はアクセスするときのURLとして使用されるため、まだ誰も付けたことがない名前を使う必要があります。

S3を利用してバケットを作成

  1. AWSコンソールを開く

  2. ストレージの項目にある「S3」を開く


3. 「バケットを作成」をクリック(オレンジのボタン)


4. バケットの名前を入力


5. リージョン「アジアパシフィック」を選択

6. 画像のような設定にします。今回はバケットポリシーを使用してセキュリティ設定を行いますので下の2つにチェックを入れます。ここの設定が誤っているとファイルのアップロードができなくなりますので注意


7. 作成したバケットを開く

8. アクセス権限>バケットポリシーを開く


9. 表示されたエディターに下記を入力

{
    "Version": "2012-10-17",
    "Id": "Policy1544152951996",
    "Statement": [
        {
            "Sid": "Stmt1544152948221",
            "Effect": "Allow",
            "Principal": {
                "AWS": "************①IAMUserなどのアカウント****************"
            },
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::②バケット名"
        }
    ]
}

10.まず②から埋めます。②はバケット名を入力するだけですが、よく見ると画像の場所に記載されています

バケットポリシーエデイターの隣に「ARN:arn:aws:s3:::exampleadmin」と記述されています。
このaws:s3:::exampleadminが入った状態が②です。

11.①はIAMのページに記載されています
まずIAMの管理ページを開きます
そして、作成したユーザーを開きます。この例の場合exampleを開きます
続いて、「ユーザーのARN」をコピーします

では、S3に戻ってバケットを開き①の項目に入れましょう

{
    "Version": "2012-10-17",
    "Id": "Policy1544152951996",
    "Statement": [
        {
            "Sid": "Stmt1544152948221",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::123456789123:user/example"
            },
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::example"
        }
    ]
}

これで作成完了しました

ローカル環境(開発環境)からS3にアップロード

ActiveStorageの場合は下記を参考にしてください
RailsアプリでActiveStorage + AWS S3を使ってみよう!

CarrierWaveによる画像のアップロード

二つの違いに関する記事
https://www.fundely.co.jp/blog/tech/2019/12/11/180024/

CarrierWaveによる画像のアップロード先がアプリ内のpublicフォルダですが、
これをS3に変更していきます。

Gemfile
gem 'carrierwave'
gem 'fog-aws'
$ bundle install

storageを「:file」から「:fog」に変更する

app/uploaders/image_uploader.rb
# encoding: utf-8

class ImageUploader < CarrierWave::Uploader::Base

  # Include RMagick or MiniMagick support:
  # include CarrierWave::RMagick
  include CarrierWave::MiniMagick
  process resize_to_fit: [800, 800]

  # Choose what kind of storage to use for this uploader:
  storage :fog #ここを変更

  # Override the directory where uploaded files will be stored.
  # This is a sensible default for uploaders that are meant to be mounted:
  def store_dir
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end

fogのアップロード先の設定

config/initializers/carrierwave.rb
require 'carrierwave/storage/abstract'
require 'carrierwave/storage/file'
require 'carrierwave/storage/fog'

CarrierWave.configure do |config|
  config.storage = :fog
  config.fog_provider = 'fog/aws'
  config.fog_credentials = {
    provider: 'AWS',
    aws_access_key_id: Rails.application.secrets.aws_access_key_id,
    aws_secret_access_key: Rails.application.secrets.aws_secret_access_key,
    region: 'ap-northeast-1'
  }

  config.fog_directory  = 'ここにバケット名を入れます'
  config.asset_host = 'https://s3-ap-northeast-1.amazonaws.com/ここにバケット名を入れます'
end

Mojave以前の場合

$ vim ~/.bash_profile

# iを押してインサートモードに移行し、下記を追記する。既存の記述は消去しない。
export AWS_ACCESS_KEY_ID='ここにCSVファイルのAccess key IDの値をコピー'
export AWS_SECRET_ACCESS_KEY='ここにCSVファイルのにSecret access keyの値をコピー'
#ここで保存完了

$ source ~/.bash_profile

catarina以降の場合

# ローカル環境
$ vim ~/.zshrc

# iを押してインサートモードに移行し、下記を追記する。既存の記述は消去しない。
export AWS_ACCESS_KEY_ID='ここにCSVファイルのAccess key IDの値をコピー'
export AWS_SECRET_ACCESS_KEY='ここにCSVファイルのにSecret access keyの値をコピー'
#ここで保存完了

#読み込みさせる
$ source ~/.zshrc

あとは資料と同じです
参考になるQiita
https://qiita.com/Tatsu88/items/be3209154a88b35be1c5
https://qiita.com/junara/items/1899f23c091bcee3b058