はじめに
仕事でrails5.2を使ってWebサイトを作り、AWS環境にデプロイする、というごく普通の環境を使っているわけですが、
ある日、ステージングにデプロイし、アクセスしたとき、急に
502 Bad Gateway
の一言だけが画面に書かれていました。
え、何これ!?昨日まで普通にアクセスできてたじゃん!と思い、デプロイしたファイルに何か問題があるのかと思いましたが、
特に内容に問題なし...
あれこれ調べても、なかなか当てはまる事例がなく、万策尽きたか...と思ってましたが、
なんでこれだけで!?という方法で直ったので、もし何かの役に立てばということで記事として残しておきます。
Railsのcredentials.yml.enc
まずはcredentials.yml.encについて軽く触れておきます。
Webサイト内で扱う機密情報について、今まで使われていたsecret.ymlが、Rails5.2で廃止になりました。
その代わりに、credentials.yml.encというファイルで扱うようになりました。
このファイルの中身を見てみると、暗号化されて何も読み取ることができませんが、
$ EDITOR="vi" bin/rails credentials:edit
というコマンドを実行すると、
credentials.yml.encファイルが復号化され、viで中身を見ることができます。
aws:
access_key_id: *****************
secret_access_key: *****************
secret_key_base: ***************************************************
参考:Rails5.2から追加された credentials.yml.enc のキホン
credentials.yml.encのエラーについて
では、実際に何が起こっていて、何をしたら解決したのか、調査の経緯を順に説明します。
secret_key_baseはどこへいった
ステージング環境にsshで入ることはできたので、
var/log内にあるログを見ていったところ、pumaが動いていないとのこと。
なるほどと思い、起動コマンドを叩いてみたら、
Missing `secret_key_base` for 'staging' environment, set this string with `rails credentials:edit` (ArgumentError)
secret_key_baseがないというエラー。
rails credentials:editを実行しろとのことなので、じゃあやってみるかと実行したところ、
Missing `secret_key_base` for 'staging' environment, set this string with `rails credentials:edit` (ArgumentError)
同じエラーだと...
とりあえず、credentials.yml.encに原因があることがわかったので、
ローカルで開いてみました(ローカルではrails credentials:editは実行できる模様。)
ですが、そこにはsecret_key_baseがちゃんと定義されてました...
secret_key_baseが見えてない
あるはずなのに、Missingと言われてしまう...
試しに、コンソールを使って値を取得してみましょう。
$ rails c
irb(main):001:0> Rails.application.credentials.aws[:access_key_id]
=> *****************(ちゃんと中身が取れてます)
irb(main):002:0> Rails.application.credentials.secret_key_base
=> nil
他の項目は取得できているのに、secret_key_baseは取得できてない...
おそらく、secret_key_baseが参照できてないのでしょう。
でもなぜ参照できてないのかが全くわかりませんでした...
keyの問題?それなら他の項目も取れないはず...
環境変数とか?いやそれは関係ない...
いろいろ思考を巡らせましたが、とうとう
「とりあえずcredentials.yml.encをいじってみよう」
という安直な選択に。というより半分ヤケになってました笑
なんとなくやったら動いた
ということで、まずはsecret_key_baseの項目の前にスペースを入れてみましょう!笑
それで動いたら楽だよなぁ...
aws:
access_key_id: *****************
secret_access_key: *****************
secret_key_base: ***************************************************
わかりにくいですが、secret_key_baseの前に半角スペースが入ってます。
これで動くわけないだろ、みたいな感じで、コンソールで確認しました。
$ rails c
irb(main):001:0> Rails.application.credentials.aws[:access_key_id]
=> *****************(ちゃんと中身が取れてます)
irb(main):002:0> Rails.application.credentials.secret_key_base
=> ***************************************************(ちゃんと中身が取れてます)
え!?
なんでこれで取れてるの?
わけがわからないまま、とりあえずこれでステージングにデプロイしたところ、
502が解消され、Webサイトが無事開けました!
最後に
なんでこれで動いたか、正直全くわかっていません。
ただ学んだことは、
やってみなきゃわからない
ということでした。
もし同じような現象が起こった方がいたら、
とりあえずいろいろ試してみるといいかもしれません!