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

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

ただいまの
回答率

90.12%

production環境での画像アップロードができない(Amazon S3)

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,720

daikitakaya

score 223

先日、amazon ec2上にnginx + unicorn + capistranoを用いてデプロイを行ったのですが、carrierwave + fog + s3での画像アップロードでエラーが出てしまっています。ローカルでは問題なくアップロードされているのですがproduction環境ではなぜかうまくいっていません。

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

crrent/log/prodution.rb

Excon::Error::BadRequest (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; a non-empty Access Key (AKID) must be provided in the credential.</Message><RequestId>XXXXXXX</RequestId><HostId>XXXXXXXXXXXXXXXXXXXXXXXX=</HostId></Error>"
  :cookies       => [
  ]
  :headers       => {
    "Connection"       => "close"
    "Content-Type"     => "application/xml"
    "Date"             => "Tue, 23 Aug 2016 10:00:24 GMT"
    "Server"           => "AmazonS3"
    "x-amz-id-2"       => "XXXXXXXXXXXXXXXXXX="
    "x-amz-request-id" => "XXXXXXXXXXXXXXXXXX"
  }
  :host          => "XXXXX.s3-ap-northeast-1.amazonaws.com"
  :local_address => "10.0.0.18"
  :local_port    => 54106
  :path          => "/uploads/user/profile_image/1/__________2016-08-22_23.01.47.jpg"
  :port          => 443
  :reason_phrase => "Bad Request"
  :remote_ip     => "XX.XXX.XX"
  :status        => 400
  :status_line   => "HTTP/1.1 400 Bad Request\r\n"
):
  app/controllers/users_controller.rb:15:in `update'
The authorization header is malformed; a non-empty Access Key (AKID) must be provided in the credential.

Carrierwaveのコード

initialize/carrierwave.rb


CarrierWave.configure do |config|
  config.storage = :fog
  config.fog_credentials = {
    provider:                'AWS',
    aws_access_key_id:       ENV['ACCESS_KEY_ID'],
    aws_secret_access_key:   ENV['SECRET_ACCESS_KEY'],
    region:                  'ap-northeast-1'
  }

  case Rails.env
    when 'production'
      config.fog_directory = 'XXXXX'
      config.asset_host = 'https://s3-ap-northeast-1.amazonaws.com/XXXXX'

    when 'development'
      config.fog_directory = 'XXXX.dep'
      config.asset_host = 'https://s3-ap-northeast-1.amazonaws.com/XXXX.dep'

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

end

考えたこと

ローカル環境下ではdotenvと言うgemを使って.envファイルにアクセスキーなどを管理していました。おそらくですがデプロイしたアプリがs3にアクセスできずに出ているエラーかと思っています。このような状況でどのような対処をして良いのかいまいちよくわかりません。

追記

# Rails4から分離したsettings.ymlの環境変数を .envファイルで管理する
set :linked_files, %w{config/settings.yml .env}


このようにcapistranoのシンボリックリンク貼り付けでgit管理下おかないようにしています。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

check解決した方法

0

ec2インスタンスを再起動したところキーの取得ができました。
シンボリックリンクシンボリックリンク貼り付けで.envファイルを貼り付けてから再起動するのを忘れていました。
1.ec2再起動
2.sudo service mysqld start #mysqldの起動(サーバー上)
3.bundle exec cap production deploy #unicorn再起動(ローカル)
4.sudo service nginx restart #nginx再起動(サーバー上)

aws上でdotenvを使うには(デプロイをnginx + unicorn + capistranoでしてること)
/var/www/myapp/sharedに.envファイルを作成
config/deploy.rb
set :linked_files, %w{.env}
を追記するとsharedにある.envファイルを/var/www/currentに貼り付けてくれます。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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