Got Some \W+ech?

Could be Japanese. Could be English. Android, セキュリティ, 機械学習などをメインに、たまにポエムったり雑感記載したりします。

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のマスターに格納されているっぽい。ここのセキュリティはどう担保しているのか気になる