##背景
PAY.JPを利用した決済システムがローカル環境では問題なく動作するのに、本番環境(AWS,EC2)ではエラーとなってしまった。
その過程で環境変数について初学者なりに学んだことを備忘録として記録。
##問題
①AWSに環境変数として公開鍵、秘密鍵の設定を行っていなかった。
②ENVファイルに記載している鍵情報を読み込む設定ではエラーが解消されない
##解決
①AWSに鍵情報を環境変数として設定する
②ENVファイルからではなく、credentilas.ymlから鍵情報を読み込むように設定
③②の為に、credentials.ymlに鍵情報を環境変数として設定
##詳細
①AWSの環境変数の設定
本番環境への設定なので、EC2ユーザーでログインして、
[ec2-user@ip-172-31-45-207 ~]$ sudo vim /etc/environment
ENVファイルを開く。iでインサートモードにして、
PAYJP_SECRET_KEY='sk_test_{pay.jpの秘密鍵情報}'
PAYJP_PUBLIC_KEY='pk_test_{pay.jpの公開鍵情報}'
を記述。esc、:、wqで保存。
ENVファイルに記述した環境変数をコントローラで読み込む記述。
Payjp.api_key = ENV["PAYJP_SECRET_KEY"]
これで行ける!と思われましたが、まだエラーが解消されません。
②ENVファイルではなくcredentials.ymlから環境変数を読み込む設定をする。
(本番環境でのみなぜ、このように設定する必要があるのかは勉強不足で不明です。しかし、このエラーのおかげでcredentialsファイルとはなんぞやということを勉強するきっかけとなりました。)
https://qiita.com/777mountain/items/74757248980fcddb7652
こちらの記事を参考にしました。
Payjp.api_key = Rails.application.credentials.PAYJP[:PAYJP_SECRET_KEY]
これだけではまだエラーは解消されません。credentialsファイルに環境変数で鍵情報が設定されていない為です。そもそもcredentialsファイルってなんぞや?
`VhSwT9zhK87oJuVNsMUN/I3Oh/....`
暗号化された環境変数情報が記載されています。rails newした時に作成され、これを別ファイルのマスターキーを照合して読み込む仕様になっています。ちなみに、機密ファイルなのでコーダー上で直接このファイルを変更しようとすると、再起動不能になり、ファイルを削除して作り直す等の処理が必要になるので注意です。
③credentials.ymlに鍵情報を環境変数として設定
ターミナル上で
EDITOR="vi" bin/rails credentials:edit
iでインサートモードにして、
PAYJP: PAYJP_SECRET_KEY: sk_test_秘密鍵 PAYJP_PUBLIC_KEY: pk_test_公開鍵
esc、:、wq で保存。
注意点としては、ENVファイルと記述方法が違うということです。
ENVだと''で囲んでいたりしましたが、こちらの場合 キー:値
という形式でないとエラーになります。
これでコントローラに記述した
Payjp.api_key = Rails.application.credentials.PAYJP[:PAYJP_SECRET_KEY]
が動きます。こちらの書き方もENVの時とは違うので留意しましょう。
これで完了です。ローカルと本番でこの辺の動き方が変わる理由が未だよく分かりませんが、
(誰かわかる人いればご教授お願い致します!)
環境変数の設定方法がこのように複数あるということは学びになりました。ちなみに、環境変数を設定する際、無駄なスペース等を入れてしまうと、アプリ全体に影響を及ぼす重篤なエラーに繋がり、初学者は特にどこに原因があるのか突き止めるのに苦労すると思いますので、慎重に記述しましょう。