前提・実現したいこと
Rails6でinstagram風な投稿アプリを作成しています。
CarrierWaveを使い、ローカルへの保存を行うところまでは完了しています。
ローカル、本番共にS3へファイルをアップロードしたいと考えているます。
S3へ保存先を切り替えて、投稿を行う際、
createアクションが叩かれるとエラーが起こってしまい、保存が行えません。
おそらく、aws上の設定で弾かれているのでは?と考えていますが、解決策が見出せていません。
発生している問題・エラーメッセージ(一部xxで置換)
Excon::Error::BadRequest in MicroPostsController#create Expected(200) <=> Actual(400 Bad Request) excon.error.response :body => "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Error><Code>AuthorizationHeaderMalformed</Code><Message>The authorization header is malformed; the region 'us-east-1' is wrong; expecting 'ap-northeast-1'</Message><Region>ap-northeast-1</Region><RequestId>xxxxxxxxxx</RequestId><HostId>xxxxxxxxxx/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=</HostId></Error>" :cookies => [ ] :headers => { "Connection" => "close" "Content-Type" => "application/xml" "Date" => "Sat, 17 Jul 2021 03:53:18 GMT" "Server" => "AmazonS3" "x-amz-id-2" => "xxxxxxxxxxx/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=" "x-amz-request-id" => "xxxxxxxxxx" } :host => "xxx-development.s3.amazonaws.com" :local_address => "xxx.xxx.xxx.xx :local_port => xxxx :path => "/uploads/tmp/1626493993-237653937050249-0001-0506/_%E3%83%81%E3%83%BC%E3%83%A0_%E3%82xxxxxxxxx.png" :port => 443 :reason_phrase => "Bad Request" :remote_ip => "xx.xxx.xx.xxx.xx" :status => 400 :status_line => "HTTP/1.1 400 Bad Request\r\n"
該当のソースコード
AWS_ACCESS_KEY_ID = 'xxxxxxxxxxxxxxxx' AWS_SECRET_ACCESS_KEY = 'xxxxxxxxx+xxxxxxxxxx+xxxxxxxxx' AWS_REGION = 'ap-northeast-1' #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: ENV['AWS_ACCESS_KEY_ID'], aws_secret_access_key: ENV['AWS_SECRET_ACCESS_KEY'], region: ENV['AWS_REGION'], } config.fog_directory = 'xxxxx-development' config.asset_host = 'https://s3-ap-northeast-1.amazonaws.com/xxxxx-development' end CarrierWave::SanitizedFile.sanitize_regexp = /[^[:word:].\-+]/ #ImageUploader class ImageUploader < CarrierWave::Uploader::Base if Rails.env.development? storage :fog elsif Rails.env.test? storage :fog else storage :fog end def store_dir "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}" end def extension_whitelist %w(jpg jpeg gif png) end def filename "#{secure_token}.#{file.extension}" if original_filename.present? end protected def secure_token var = :"@#{mounted_as}_secure_token" model.instance_variable_get(var) or model.instance_variable_set(var, SecureRandom.uuid) end end
試したこと
#######ローカルへのファイルの保存
ImageUploaderで Rails.env.development?で[storage :file]を指定すると、ローカルへ画像が正常に保存されますので、投稿機能自体は正常に動いています。
#######S3上でのバケット設定
パブリックアクセスをすべて ブロック オフ 新しいアクセスコントロールリスト (ACL) を介して付与されたバケットとオブジェクトへのパブリックアクセスをブロックする オフ 任意のアクセスコントロールリスト (ACL) を介して付与されたバケットとオブジェクトへのパブリックアクセスをブロックする オフ 新しいパブリックバケットポリシーまたはアクセスポイントポリシーを介して付与されたバケットとオブジェクトへのパブリックアクセスをブロックする オン 任意のパブリックバケットポリシーまたはアクセスポイントポリシーを介したバケットとオブジェクトへのパブリックアクセスとクロスアカウントアクセスをブロックする オフ
#######S3上でのアクセスコンとトールリスト設定
[ { "AllowedHeaders": [ "*" ], "AllowedMethods": [ "PUT", "POST", "DELETE" ], "AllowedOrigins": [ "http://localhost:3000" ], "ExposeHeaders": [] } ]
補足情報(FW/ツールのバージョンなど)
・rails:6
・ruby:3.0.0
必要なファイルなどの情報は言ってもらえれば載せさして頂きます。
どうかよろしくお願いします。
あなたの回答
tips
プレビュー