Closed11
Google App Engine で デプロイ時に Secret Manager から環境変数を読み込みたい
ピン留めされたアイテム

app.env.yml
がほしいならデプロイ時につくればいいじゃない
と、@bisque氏。
天才か!??!?!?!
要は
- デプロイ時に
- SecretManagerから
-
RAILS_MASTEWR_KEY
を環境変数に展開する
ことさえできればいので、これで要件が満たせる…!
cloudbuild.yml
steps:
# Secret Manager から RAILS_MASTER_KEY を読み込んで env.yml を生成する
- id: decrypt-key
name: 'gcr.io/cloud-builders/gcloud'
entrypoint: 'bash'
args:
- '-eEuo'
- 'pipefail'
- '-c'
- |-
cat <<EOF > ./app.env_key.yml
env_variables:
RAILS_MASTER_KEY: $$RAILS_MASTER_KEY
EOF
dir: "backend"
secretEnv: ["RAILS_MASTER_KEY"]
そうして、デプロイ直前にファイルが作られるので、
app.yml
includes:
# RAILS_MASTER_KEYだけは `app.env_key.yml` から読み込む
- ./app.env_key.yml
- ./app.env.yml
app.yml
をこのようにしておけば RAILS_MASTER_KEY
が環境変数展開される。無事実現できました。

このやり方で元気に動いています。

ビルド時の環境ごとの差分をなるべくなくして、検証と本番で共通イメージを使いたい
そのために、現状Railsアプリケーションでビルド時に復号しているproduction.key
を、デプロイ時にSecretManagerから取得したい。
App Engine のあとに Secret Manager がGAした時系列もあってか、「KMSを使って復号すればええんじゃないか論」が世の中には多いきがする。

app.yml にそのような(Secret Managerから読み出す)機能はないか?
なさそう。

gcloud app deploy
コマンドに Secret Manager から読み出す機能はないか?
なさそう。

gcloud app deploy コマンドで環境変数を渡せればそれでいい
環境変数を直接渡す
難しそう。
app.yml で環境変数から設定する
ようするに
app.yml
env_variables:
ORG: ${ORG}
ACCESS_TOKEN: ${ACCESS_TOKEN}
SESSION_SECRET: ${SESSION_SECRET}
これができればいいのだけど…
無理そう😇
↑テンプレート文字列で置き換えるだってぇ!?さすがにこれはちょっとやりすぎ感が…

2択?
- 起動前にbashなりで Secret Manager から 環境変数に展開する
- 起動時に applicaiton.rb で Secret Manager から環境変数に展開する

起動時に applicaiton.rb で Secret Manager から環境変数に展開する
SDKとか使えそうだけど、ローカルで完結しなくなるからやめたほうがよさそう。

起動前にbashなりで Secret Manager から 環境変数に展開する
こっちができればそれが良い。entrypoint で bash スクリプトを指定できれば。
App Engine で gcloud は使える?
使えない。この方法は複雑になりそう。やめたほうがよさそう。

RAILS_ENV == 'production' のときだけ Secret Manager から値をとってくる
これが丸いか。
こちらを参考に考える。

起動順
引用
[
"environment.rb",
"application.rb",
"boot.rb",
"environments/development.rb",
"initializers/backtrace_silencers.rb",
"initializers/filter_parameter_logging.rb",
"initializers/inflections.rb",
"initializers/mime_types.rb",
"initializers/secret_token.rb",
"initializers/session_store.rb",
"initializers/wrap_parameters.rb",
"routes.rb"
]
クレデンシャルの情報を initilizers で使うことを考えると、application.rb
で展開するのがよさそう。
このスクラップは2022/03/09にクローズされました
ログインするとコメントできます