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の作成
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作成
- グループ作成する。
- グループの権限に AmazonS3FullAccess を追加
- ユーザー作成
- グループに今作ったユーザーを追加
- アクセスキーを作成してキーとシークレットキーを作成すると表示されるのでメモしておく。
S3へ
S3でバケット名作成。
名前は何でもよいが、URLになったりフォルダ名になったり、指定したりと色々記述することがあるので、想定した名前が良い。
S3でパブリックアクセス設定
テストの時は左から False False True False にして試したが
推奨通り全て True True True True にしても問題なく保存できた。
S3でバケットポリシー設定
{
"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
にまとめられているのでわからなくなったら読んでおくこと。