1
1

More than 5 years have passed since last update.

Railsのcredentials.yml.enc起因で502エラーが起こったら

Last updated at Posted at 2019-02-17

はじめに

仕事で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サイトが無事開けました!

最後に

なんでこれで動いたか、正直全くわかっていません。
ただ学んだことは、
やってみなきゃわからない
ということでした。
もし同じような現象が起こった方がいたら、
とりあえずいろいろ試してみるといいかもしれません!

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1