railsチュートリアル13章 AWS S3の設定について
railsチュートリアル13章の「本番環境での画像アップロード」について、書籍を参考にしながらAWSの設定をしてもうまくいかず苦労したので、私が苦労したポイントをまとめておきます。
最初に発生したエラー
2020-02-07T15:49:28.659851+00:00 app[web.1]: [4] ! Unable to load application: ArgumentError: Missing required arguments: aws_secret_access_key 2020-02-07T15:49:28.660063+00:00 app[web.1]: bundler: failed to load command: puma (/app/vendor/bundle/ruby/2.5.0/bin/puma) 2020-02-07T15:49:28.660116+00:00 app[web.1]: ArgumentError: Missing required arguments: aws_secret_access_key
aws_secret_access_keyが読み込めていないようにみえます。
$ heroku configで設定値を見るとaccess_keyとsecret_keyが同じになっていたので、そこを修正しました。
$ heroku config S3_ACCESS_KEY: AKI***************** S3_BUCKET: aws****************** S3_REGION: ap-northeast-1 S3_SECRET_KEY: AKI*****************
また、railsチュートリアルでは「carrier_wave.rb」となっているが、どの参考サイトを見ても「carrierwave.rb」となっているのファイル名も変更しました。
これでエラーは解消したのですが、別のエラーが発生。
次のエラー
2020-02-08T00:14:48.466825+00:00 app[web.1]: [fog][WARNING] fog: the specified s3 bucket name(www.aws**********) contains a '.' so is not accessible over https as a virtual hosted bucket, which will negatively impact performance. For details see: http://docs.amazonwebservices.com/AmazonS3/latest/dev/BucketRestrictions.html
どうやらAWSで設定したS3のバケット名に「.」が含まれるとダメのようです。なので、バケットを作り直すことでエラーが解消。
そしていよいよ最後のエラー。
最後のエラー
2020-02-08T00:28:26.840068+00:00 app[web.1]: I, [2020-02-08T00:28:26.839933 #9] INFO -- : [a27d3988-f8c1-4414-9f75-31e114052a2e] Completed 500 Internal Server Error in 4965ms (ActiveRecord: 1.1ms) 2020-02-08T00:28:26.841626+00:00 app[web.1]: F, [2020-02-08T00:28:26.841543 #9] FATAL -- : [a27d3988-f8c1-4414-9f75-31e114052a2e] 2020-02-08T00:28:26.841743+00:00 app[web.1]: F, [2020-02-08T00:28:26.841665 #9] FATAL -- : [a27d3988-f8c1-4414-9f75-31e114052a2e] Excon::Error::Forbidden (Expected(200) <=> Actual(403 Forbidden) 2020-02-08T00:28:26.841744+00:00 app[web.1]: excon.error.response
これについては全く同じエラーで悩んでいる人がおり、パブリックアクセス権限を以下のように変更することで解消されました。
上二つのブロック設定をオフにしています。
参考までにバケットポリシーは以下のように設定しています。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "statement1", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::【アカウントID】:user/【ユーザ名】" }, "Action": "*", "Resource": "arn:aws:s3:::【バケット名】/*" } ] }
これで無事S3に画像をアップロードできるようになりました。
参考URL
Railsチュートリアル13章: Herokuの本番環境で画像がアップロードできない問題の解決 - Takanash-Tech Diary
あとがき
とある書籍に書いてある通りにAWS設定したのに全然うまくいかなくて、どういうこと!?ってなりました。本に書いてあることが正しいとは限らないですね。