Railsアプリ(Production)のシークレットキーをGKE & k8sに読み込ませる
An unhandled lowlevel error occurred. The application logs may have details.
kubectl create -f services hogehoge.yml
し、公開IPにアクセスした際に出た表示↑
Application系のエラーらしいので、kubectl logs -f [POD_NAME] [IMAGE_NAME]
でログを流してみたら、config/secrets.ymlにsecrete_key_baseが設定されてないとのこと。
見てみると、SECRET_KEY_BASEという環境変数にシークレットキーを設定していなかった。ちなみにアプリを開発してるのは別の人で、自分はWebアプリにあまり詳しくないマン。
% cat config/secrets.yml default: &default secret_key_base: XXXXXXXXXXXXXXXX development: <<: *default test: <<: *default production: <<: secret_key_base: <%= ENV['SECRET_KEY_BASE'] %>
当然、SECRET_KEY_BASEにシークレットキーを設定してやればいいだけなんだけど、Githubに上がるのであればDockerfileやapp-deployment.ymlなどにはべた書きにはできない。なので、k8sでそのシークレットファイルを作成・管理する。
% kubectl create secret generic app-secrets --from-literal=secret_key_base=`bundle exec rake secret` % kubectl describe secrets app-secrets
ここで作られたシークレットをデプロイ中に環境変数としてセットするため、deployment.ymlを編集
% kubectl edit deployment/app spec: containers: - image: gcr.io/YOUR_REPO/YOUR_IMAGE:v1.0.0 name: mds-web env: - name: RAILS_ENV value: production - name: SECRET_KEY_BASE valueFrom: secretKeyRef: name: app-secrets key: secret_key_base % kubectl rollout status deployment/app
ロールアップが完了後、再度アクセスしてもんだいないことを確認。
余談
- secretはk8sのマスターに格納されているっぽい。ここのセキュリティはどう担保しているのか気になる