正如您所指出的,除了使用 app.yaml 文件之外,没有内置方法可以在 App Engine 中设置环境变量。我不是 Spring Boot 方面的专家,但除非您可以在 application.properties 评估之前设置/覆盖一些挂钩以从 Java 代码初始化 env var,否则您需要在构建时设置这些。
选项 1:使用 Cloud Build
我知道您并不是真的热衷于使用 Cloud Build,但就是这样。
首先,按照说明 here,(在 KMS 中创建 KeyRing 和 CryptoKey 并授予对 Cloud Build 服务帐户的访问权限后)从您的终端使用 KMS 加密您的环境变量并取回其 base64 表示:
echo -n $DB_PASSWORD | gcloud kms encrypt \
--plaintext-file=- \ # - reads from stdin
--ciphertext-file=- \ # - writes to stdout
--location=global \
--keyring=[KEYRING-NAME] \
--key=[KEY-NAME] | base64
接下来,假设您有一个像这样的app.yaml 文件:
runtime: java11
instance_class: F1
env_variables:
USER: db_user
PASSWORD: db_passwd
创建一个cloudbuild.yaml 文件来定义您的build steps:
steps:
# replace env vars in app.yaml by their values from KMS
- name: 'gcr.io/cloud-builders/gcloud'
entrypoint: 'bash'
args: ['-c', 'sed -i "s/TEST/$$PASSWORD/g" src/main/appengine/app.yaml']
secretEnv: ['PASSWORD']
- name: 'gcr.io/cloud-builders/mvn'
args: ['clean']
- name: 'gcr.io/cloud-builders/mvn'
args: ['package']
- name: 'gcr.io/cloud-builders/mvn'
args: ['appengine:deploy']
timeout: '1600s'
secrets:
- kmsKeyName: projects/<PROJECT-ID>/locations/global/keyRings/<KEYRING_NAME>/cryptoKeys/<KEY_NAME>
secretEnv:
PASSWORD: <base64-encoded encrypted password>
timeout: '1600s'
然后您可以通过运行以下命令来部署您的应用程序:
gcloud builds submit .
这种方法的优点是你本地的app.yaml文件只包含占位符值,可以安全地提交。或者,您甚至可以将此构建设置为每次提交到远程存储库时自动触发。
选项 2:在本地使用 bash 脚本
您可以创建一个 bash 脚本来替换 app.yaml 中的值、部署应用程序并立即删除这些值,而不是运行 mvn appengine:deploy 来部署您的应用程序。类似于:
#!/bin/bash
sed -i "s/db_passwd/$PASSWORD/g" src/main/appengine/app.yaml'
mvn appengine:deploy
sed -i "s/$PASSWORD/db_passwd/g" src/main/appengine/app.yaml'
并执行该 bash 脚本,而不是运行 maven 命令。