我注意到开发控制台似乎没有地方可以配置静态环境变量。在GAE上的期望是我需要将这些变量作为部署的一部分从我的构建服务器进行打包吗?如果是这样,是否有涵盖为什么或详细说明GAE / Google Cloud哲学的文档?
多年过去了,它仍然没有发生。
我的解决方法是在部署过程中编译app.yaml(在本地或使用CI)。例如,我有一个模板文件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 但对我来说它们不够方便或通用。
您可以在应用程序的 app.yaml
中定义环境变量。
以下是 Python/PHP/(可能是 Go?) 应用程序的示例。Java 使用不同的格式。
env_variables:
MY_ENV_VAR: 'some value here'
app.yaml
定义它们。他们没有提供界面来动态设置/取消这些变量而不需要推代码。有时这很不方便,但也意味着您不能无意中从Web更改某些内容而不是显式地推送代码。 - Josh J首先,将环境变量放入一个env_variables.yaml文件中,例如:
env_variables:
SECRET: 'my_secret'
includes:
- env_variables.yaml
此外,
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控制台,则可以通过浏览控制台中的源文件来查看密码。