我注意到开发人员控制台似乎没有暴露我可以配置静态环境变量的任何地方。
我是否期望GAE将这些变量作为部署的一部分从我的构建服务器中捆绑出来?如果是这样,是否有关于GAE / Google Cloud的文档涵盖了为什么或详细说明了这一理念?
答案 0 :(得分:8)
几年过去了,但至今没有过去。
我的解决方法是在部署过程中(本地或使用CI)编译app.yaml。 例如,我有一个模板文件app.tml.yaml文件
runtime: python37
handlers:
- url: /static
static_dir: app/static/
- url: /.*
script: auto
env_variables:
DJANGO_GC_DATABASE_PASSWORD: ${DJANGO_GC_DATABASE_PASSWORD}
然后我在部署之前立即致电envsubst
envsubst < ./app.tml.yaml > app.yaml
,然后再照常gcloud app deploy
。部署完成后,将删除带有敏感数据的app.yaml。从本地.env文件中读取变量,或者在CI系统中设置变量。
我在这篇文章中还列出了其他方法:https://dev.to/mungell/google-cloud-app-engine-environment-variables-5990,但对我而言,它们不够方便或通用。
答案 1 :(得分:6)
可以在应用程序的app.yaml
python / php /(也许是go?)应用程序的一个例子。 Java使用不同的格式。
env_variables:
MY_ENV_VAR: 'some value here'
如果您需要在部署之前通过编程方式将这些值附加到app.yaml,也可以在CI过程中设置这些值。
答案 2 :(得分:0)
一种解决方案显然是 https://cloud.google.com/secret-manager/docs,但我选择了此处提供的解决方案:
Securely storing environment variables in GAE with app.yaml
首先,将环境变量放在一个 env_variables.yaml 中,例如,
env_variables:
SECRET: 'my_secret'
然后,在 app.yaml 中包含这个 env_variables.yaml
includes:
- env_variables.yaml
最后,将 env_variables.yaml 添加到 .gitignore,以便存储库中不存在秘密变量。
进一步,
process.env
中,这样我就有了这些变量的单一事实来源......if (process.env.NODE_ENV === "development") {
try {
const fs = require("fs");
const yaml = require("js-yaml");
let fileContents = fs.readFileSync("./env_variables.yaml", "utf8");
let {env_variables} = yaml.load(fileContents);
console.log({ env_variables });
Object.keys(env_variables).forEach((v) => {
process.env[v] = env_variables[v];
});
} catch (error) {
res.status(500).end("500: Problem getting env vars");
return;
}
}
我在这里添加我的解决方案,因为引用的问题指定了 python,这个问题是通用的。
与其他 PAAS 解决方案(例如 Heroku、Netlify)一样,如果用户有权访问 App Engine 控制台,他们就可以看到秘密(在这种情况下,通过浏览控制台中的源文件)。