Rails
AWS
S3
carrierwave
Rails5

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

キャプチャ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

にまとめられているのでわからなくなったら読んでおくこと。