[capistrano]環境変数が通らない時に試してみる事
[capistrano]環境変数が通らない時に試してみる事:
twitterAPIやFacebookAPI、StripeAPIなどを実装して、開発環境で動作確認が済んでやれ一息ついたのは束の間、本番環境にデプロイするとこれらの環境変数が通らないってことありませんか?
そんな問題にブレイクスルーを提供します。
AWSEC2+ unicorn + nginx + capistrano(capistrano3-unicornあり) です。
ざっくり言いますと、
capistranoでの自動デプロイ時にunicornへ飛ばすシグナルがマスタープロセスからワーキングプロセスを複製するものであるため、環境変数が反映されていないプロセスが残ってしまう。
ホットデプロイって性質上確かにそうなってても仕方ないよね、っていう仕様です。
詳しくは下記の記事をご参照ください。
Ruby on Railsで環境変数を新規に設定したらunicorn:restartでは駄目だった
unicornにどんなシグナル送るとどうなるのかまとめました
ということで一先ずこのようにしてみました。
unicornをstopして、startする。ホットデプロイを捨てました。
しかし、環境変数は通りませんでした。
どうやら別に原因があるようです。
環境変数ファイルを読み込むことを明示してあげないといけないようです。
つまりenv.ymlみたいな環境変数用のファイルを作ってあげて明示的に読み込ませると解決できるようです。
詳しくはこちらをご参照ください。
Ruby on Railsで githubなどにcommitしたくないパスワードなどを環境変数に設定してcapistranoでdeployする方法
クレバーな方法はありましたが、ふと思いました。
MySQLのPassとか環境変数で記述してるのに通ってるし、、、
/etc/environmentに書けばいいんじゃない?
という訳で/etc/environmentに環境変数を記述しましたら、
普通に通りました。
サーバー全体への環境変数になってしまうため不便が発生しそうですが、、これで良いかな。
書き込む際は読込専用ファイルになっているので
コマンドを使用してrootユーザーでログインして編集しましょう。乱用は厳禁です。
他にdotenvというgemを使って環境変数を管理する方法もあるみたいですが、あまり推奨される方法ではないみたいです。
困った時の最終手段にどうぞご検討ください。
はじめに
twitterAPIやFacebookAPI、StripeAPIなどを実装して、開発環境で動作確認が済んでやれ一息ついたのは束の間、本番環境にデプロイするとこれらの環境変数が通らないってことありませんか?そんな問題にブレイクスルーを提供します。
環境
AWSEC2+ unicorn + nginx + capistrano(capistrano3-unicornあり) です。
環境変数が通らない原因
ざっくり言いますと、capistranoでの自動デプロイ時にunicornへ飛ばすシグナルがマスタープロセスからワーキングプロセスを複製するものであるため、環境変数が反映されていないプロセスが残ってしまう。
ホットデプロイって性質上確かにそうなってても仕方ないよね、っていう仕様です。
詳しくは下記の記事をご参照ください。
Ruby on Railsで環境変数を新規に設定したらunicorn:restartでは駄目だった
unicornにどんなシグナル送るとどうなるのかまとめました
ということで一先ずこのようにしてみました。
deploy.rb
after 'deploy:publishing', 'deploy:restart' namespace :deploy do task :restart do on roles(:app), in: :sequence, wait: 5 do invoke 'unicorn:stop' invoke 'unicorn:start' end end end
まだ環境変数が通らない原因
しかし、環境変数は通りませんでした。どうやら別に原因があるようです。
環境変数ファイルを読み込むことを明示してあげないといけないようです。
つまりenv.ymlみたいな環境変数用のファイルを作ってあげて明示的に読み込ませると解決できるようです。
詳しくはこちらをご参照ください。
Ruby on Railsで githubなどにcommitしたくないパスワードなどを環境変数に設定してcapistranoでdeployする方法
解決
クレバーな方法はありましたが、ふと思いました。MySQLのPassとか環境変数で記述してるのに通ってるし、、、
/etc/environmentに書けばいいんじゃない?
という訳で/etc/environmentに環境変数を記述しましたら、
普通に通りました。
サーバー全体への環境変数になってしまうため不便が発生しそうですが、、これで良いかな。
書き込む際は読込専用ファイルになっているので
tarminal
[ec2-user@eip appname]$ sudo su -
他にdotenvというgemを使って環境変数を管理する方法もあるみたいですが、あまり推奨される方法ではないみたいです。
困った時の最終手段にどうぞご検討ください。
コメント
コメントを投稿