解決したいこと
Carrierwaveでfogを用いているときに、
**「Capistranoで自動デプロイしたい」**という欲望をもったときに発生するであろうエラー。
サタンが舞い降りてきて心身ともにボコボコにされます。
発生エラー
rake aborted!
ArgumentError: Missing required arguments: aws_access_key_id, aws_secret_access_key
解決フロー
前提
- carrierwaveでfog用に以下のrails起動時の初期化を行っている
initializers/carrierwave.rb
if Rails.env.production?
CarrierWave.configure do |config|
config.fog_provider = 'fog/aws'
config.fog_credentials = {
provider: 'AWS',
aws_access_key_id: ENV['fog_api_key'], # AWSアクセスキー
aws_secret_access_key: ENV['fog_api_secret'], # AWSシークレットキー
region: ENV['fog_region'], # S3リージョン
host: ENV['fog_host'] # S3エンドポイント名(例: s3-us-west-2.amazonaws.com)
}
end
end
- capistrano起動に必要な設定ファイル(capfile等)がgitにプッシュされている
- capistranoの対象ブランチがmaster
- 以下コマンドで起動
$ bundle exec cap production deploy
解決方法
結論から書くと、解決は以下が一番早いです。
環境変数を.bash_profileではなく.bashrcに記載する。
.bashrc
export fog_api_key=*****
export fog_api_secret=*****
原因
capistranoのコマンド起動時に環境変数が設定されていない。
もっと言うと、bash_profileを読み込まないため。
capistrano公式サイトにシェルログイン形式によるファイル読み込みフローがあります。
※capistranoの設定ファイルのdefault_envに記載することでも解決しますが、gitにプッシュする必要があるためセキュリティ上よろしくないです。
publicリポジトリでの公開では特に。
config/deploy.rb
set :default_env, {
fog_api_key: "*****",
fog_api_secret: "*****"
}
補足
以下Capfileにモジュールを追加した後に、capコマンドで、capistrano起動環境で動作サーバに入ることができます。
Capfile
require 'capistrano/console'
$ bundle exec cap production console
その後、env
コマンドをうつことで実際に設定されている環境情報を確認できます。
設定後、不安な方は出力してみてください。
同じ事象に遭遇した方の解決に寄与することを祈ります。