LoginSignup
0
0

More than 5 years have passed since last update.

[学習用]Carrierwave+S3の画像投稿・保存でハマりまくったけど解決できたこと

Last updated at Posted at 2019-04-19

キャプチャ2.jpg
gem 'carrierwave'
gem 'mini_magick'
gem 'fog-aws'
gem 'devise'
を追加しただけで、これだけ作れるRailsはすごいなと思いました。

本題

S3に何故かアップロードできず、8時間もハマった結果、
無事S3へアップロードできたので忘れないうちにメモをしておく。

前提はCarrierwaveやImageは作ってある状態

GemFile

gem 'carrierwave'
gem 'mini_magick'
gem 'fog-aws'

gem 'fog' から gem 'fog-aws' にする。

carrierwave.rbの作成

config/initializers/carrierwave.rb
CarrierWave.configure do |config|
  config.fog_provider = 'fog/aws' # 追加
  config.fog_credentials = {
      provider:              'AWS',                                       # required
      aws_access_key_id:     'アクセスキー',                      # required
      aws_secret_access_key: 'シークレットキー',  # required
      region:                'ap-northeast-1'
  }
  config.fog_directory  = 'S3のバケット名'                              # required
  config.asset_host = "https://s3.ap-northeast-1.amazonaws.com/S3のバケット名" # 追加
  config.fog_public     = false                                             # optional, defaults to true false
  config.fog_authenticated_url_expiration = 600                             # (in seconds) => 10 minutes
end
# 日本語ファイル名の設定
CarrierWave::SanitizedFile.sanitize_regexp = /[^[:word:]\.\-\+]/

テストの為、「アクセスキー」「シークレットキー」を直書きだが、
あとでENV['UPLOAD_S3_APIKEY']などに変更してheroku config:setで見えない部分にKeyを保存しておくこと。

carrierwave.rbは作成しないと無いので、空ファイルを作成してコピペする。

IAM作成

IAM Management Console.jpg

  • グループ作成する。
  • グループの権限に AmazonS3FullAccess を追加
  • ユーザー作成 
  • グループに今作ったユーザーを追加
  • アクセスキーを作成してキーとシークレットキーを作成すると表示されるのでメモしておく。

S3へ

S3でバケット名作成。
名前は何でもよいが、URLになったりフォルダ名になったり、指定したりと色々記述することがあるので、想定した名前が良い。

S3でパブリックアクセス設定

S3 Management Console (3).jpg

テストの時は左から False False True False にして試したが
推奨通り全て True True True True にしても問題なく保存できた。

S3でバケットポリシー設定

S3 Management Console (2).jpg

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "statement1",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::IAMで作ったユーザーのARNの番号16桁:user/IAMのユーザー名"
            },
            "Action": "*",
            "Resource": "arn:aws:s3:::S3のバケット名/*"
        }
    ]
}

"Version": "2012-10-17" になっているが、日付を変更する必要は無い。間違っても今日の日付にしない様に。

アプリから投稿した画像を削除すればS3の画像も削除される。

バケットポリシーについて

試しにバケットポリシーを削除してアップロードしたが画像は正常に投稿できてS3に保存されていた。バケットポリシーは設定しなくても動作した。

バケットポリシーやアクセスコントロールは
https://qiita.com/ryo0301/items/791c0a666feeea0a704c
にまとめられているのでわからなくなったら読んでおくこと。

0
0
0

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
  3. You can use dark theme
What you can do with signing up
0
0