[capistrano]環境変数が通らない時に試してみる事

[capistrano]環境変数が通らない時に試してみる事:


はじめに

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 
unicornをstopして、startする。ホットデプロイを捨てました。


まだ環境変数が通らない原因

しかし、環境変数は通りませんでした。

どうやら別に原因があるようです。

環境変数ファイルを読み込むことを明示してあげないといけないようです。

つまりenv.ymlみたいな環境変数用のファイルを作ってあげて明示的に読み込ませると解決できるようです。

詳しくはこちらをご参照ください。
Ruby on Railsで githubなどにcommitしたくないパスワードなどを環境変数に設定してcapistranoでdeployする方法


解決

クレバーな方法はありましたが、ふと思いました。

MySQLのPassとか環境変数で記述してるのに通ってるし、、、

/etc/environmentに書けばいいんじゃない?

という訳で/etc/environmentに環境変数を記述しましたら、

普通に通りました。

サーバー全体への環境変数になってしまうため不便が発生しそうですが、、これで良いかな。

書き込む際は読込専用ファイルになっているので

tarminal
[ec2-user@eip appname]$ sudo su - 
コマンドを使用してrootユーザーでログインして編集しましょう。乱用は厳禁です。

他にdotenvというgemを使って環境変数を管理する方法もあるみたいですが、あまり推奨される方法ではないみたいです。

困った時の最終手段にどうぞご検討ください。

コメント

このブログの人気の投稿

投稿時間:2021-06-17 05:05:34 RSSフィード2021-06-17 05:00 分まとめ(1274件)

投稿時間:2021-06-20 02:06:12 RSSフィード2021-06-20 02:00 分まとめ(3871件)

投稿時間:2020-12-01 09:41:49 RSSフィード2020-12-01 09:00 分まとめ(69件)