質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.23%

(S3)本番環境に画像をアップロードできない

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 181

h-asuka

score 7

前提・実現したいこと

railsで本番環境の画像アップロードをしたい。

画像アップロードをすると以下のエラーメッセージが発生しました。

発生している問題・エラーメッセージ

Excon::Error::BadRequest in UsersController#update

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 Credential is mal-formed; expecting \"&lt;YOUR-AKID&gt;/YYYYMMDD/REGION/SERVICE/aws4_request\".</Message><RequestId>FA6D5E9A8FF746E2</RequestId><HostId>EtSsgNaPIm8kLD32SQjjyrqKH1cNTP4Npr3IPLj29GDxkKh/evNYtT3TiP12qiymKPvcLfLJqbg=</HostId></Error>" :cookies => [ ] :headers => { "Connection" => "close" "Content-Type" => "application/xml" "Date" => "Tue, 28 Jan 2020 10:40:27 GMT" "Server" => "AmazonS3" "x-amz-id-2" => "EtSsgNaPIm8kLD32SQjjyrqKH1cNTP4Npr3IPLj29GDxkKh/evNYtT3TiP12qiymKPvcLfLJqbg=" "x-amz-request-id" => "FA6D5E9A8FF746E2" } 

該当のソースコード

CarrierWave.configure do |config|
  if Rails.env.development? || Rails.env.test? #開発とテストは今まで通りに
    config.storage = :file
  elsif Rails.env.production? #本番はS3に保存する
    config.storage = :fog
    config.fog_provider = 'fog/aws'
    config.fog_credentials = {
      provider: 'AWS',
      aws_access_key_id: Rails.application.credentials.aws[:access_key_id],
      aws_secret_access_key: Rails.application.credentials.aws[:secret_access_key],
      region: 'ap-northeast-1'
    }

  config.fog_directory  = 'a'
  config.asset_host = 'https://s3-ap-northeast-1.amazonaws.com/a'
  end
end


users_contoroller.rb

class UsersController < ApplicationController
  def show
    @user = User.find(params[:id])
    @posts = @user.posts
  end

  def edit
    @user = User.find(params[:id])
  end
  def update
    @user = User.find(params[:id])
    if @user.update(user_params)
      flash[:notice] = "変更を保存しました"
      redirect_to user_path(current_user)
    else
      flash[:alert] = "編集の保存に失敗しました"
      render :edit
    end
  end

  private

  def user_params
    params.require(:user).permit(:nickname, :email, :image)
  end

end

users/view/edit.html.haml

.profile__right__content__edit
      = form_with model: @user, local: true do |f|
        = f.label :image, class: "file", id: 'user_img' do
          -if @user.image.present?
            .profile-content__edit__view-box
              = image_tag @user.image.to_s, alt: "プロフィール画像",size: "60x60", class: 'mypage__icon', id: :img_prev
            .profile-content__edit__nickname
              = f.text_field :nickname, class: 'profile__right__input__nickname',value: @user.nickname
            .profile-content__edit__email
              = f.email_field :email, class: 'profile__right__input__email'
            .profile-content__edit__password
              = f.password_field :password
              新しいパスワード
            .profile-content__edit__password-confirmation
              = f.password_field :password_confirmation
              新しいパスワード確認
          -else 
            .profile-content__edit__view-box
              -# = image_tag "noimage.jpeg", alt: "プロフィール画像",size: "60x60", class: 'mypage__icon'
            .profile-content__edit__nickname
              = f.text_field :nickname, class: 'profile__right__input__nickname',value: @user.nickname
            .profile-content__edit__email
              = f.email_field :email, class: 'profile__right__input__email'
            .profile-content__edit__password
              = f.password_field :password
              新しいパスワード
            .profile-content__edit__password-confirmation
              = f.password_field :password_confirmation
              新しいパスワード確認
          = f.file_field :image,class: 'file'
          .profile__right__content__bottom
            .profile__right__content__profile
              = f.submit '変更する', class: 'profile__right__input__send'

試したこと

エラー文で検索をかけたがENVの情報ばかりで解決できなかった。

補足情報(FW/ツールのバージョンなど)

rails 5.2.4.1 
必要なファイルなどの情報は言ってもらえれば載せさして頂きます。
どうかよろしくお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • bamboo-nova

    2020/01/28 20:28

    400 Bad Requestの意味としては、適切なパラメータが渡されていないことによるエラーですので、S3のエラーというよりは、まず渡しているパラメータが間違っているんだと思います。ビューとコントローラを照らし合わせる必要があるので、Usersコントローラを見せて頂けるとレビューしやすいと思います。

    キャンセル

  • h-asuka

    2020/01/28 20:42

    返信ありがとうございます。コントローラーとビューの方は追記させていただきました。
    あと、書き忘れていましたがローカル環境では問題なく編集できています。

    キャンセル

回答 2

check解決した方法

+1

aws_access_key_id と aws_secret_access_key が逆になっていました。
bamboo-novaさん色々ありがとうございました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/01/29 00:16

    確かに、400のエラーならそういうパターンもありますね。不覚でした...。自分も勉強になりました。こちらこそありがとうございます。

    キャンセル

+1

Expected(200) <=> Actual(400 Bad Request)
403なら見かけるけど、400ってみたことあまりないかもと思って調べてみたんですが、実際のS3のregionとコードで記述したregionが一致してないとかありますか...?汗

似たような事例があったので参考資料も提示します。
https://stackoverflow.com/questions/29780128/excon-error-badrequest

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/01/28 21:18

    ご回答ありがとうございます!
    私もエラー文を検索していた時に、あげて頂いた参考資料に辿り着き確認したのですが、そちらの方は問題ありませんでした..

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.23%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる