読者です 読者をやめる 読者になる 読者になる

【Rails】【Capistrano】Carrierwave (fog)を含んだ形でデプロイするとエラーになってしまう

はじめに

Webサービスを開発していて、ハマったところなのでメモ。

環境

詳細

Carrierwaveの動作確認がローカルでできたのですが
Capistranoを使ってデプロイしようとしたところ
以下の様なエラーが発生しました。

rake aborted!
ArgumentError: Missing required arguments: aws_access_key_id, aws_secret_access_key

「idとkeyが必須だが、設定されていないよ」というエラー内容。
実装は以下の通りとなっている。

config/initializer/carrierwave.rb

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

実装方法としては、環境変数から取ってくるようにしていました。

さらにCapistranoを動かすホスト側には環境変数を定義せず、dotenv管理。
クライアント環境には環境変数定義済みです。

解決策

Capistranoでデプロイ時に使用する環境変数を明示的に設定するようにします。

# Default value for default_env is {}
set :default_env, {
  rbenv_root: "/usr/local/rbenv",
  path: "/usr/local/rbenv/shims:/usr/local/rbenv/bin:$PATH",
  IMG_UP_AWS_S3_ACCESS_KEY_ID: ENV["IMG_UP_AWS_S3_ACCESS_KEY_ID"],
  IMG_UP_AWS_S3_SECRET_ACCESS_KEY: ENV["IMG_UP_AWS_S3_SECRET_ACCESS_KEY"]
}

こうすることにより、デプロイ時のみ使われる環境変数を定義することができます。
また、ホスト側に環境変数を定義せず実行できるので、無駄に変数を書かなくても済みます。

以下、Capistrano実行時のログ。

Command: ( RBENV_ROOT=/usr/local/rbenv PATH=/usr/local/rbenv/shims:/usr/local/rbenv/bin:$PATH IMG_UP_AWS_S3_ACCESS_KEY_ID= IMG_UP_AWS_S3_SECRET_ACCESS_KEY= RBENV_VERSION=2.3.0 /usr/bin/env mkdir -p /tmp/sample/

原因

Capistranoでは、ホスト、クライアントの環境変数を読まずに実行するようです。
そのため、明示的に指定してあげないといけないようです。