google 应用引擎是否支持环境变量?

Does google app engine support environment variables?

我注意到开发人员控制台似乎没有公开我可以配置静态环境变量的任何地方。

GAE 是否期望我将这些变量捆绑为构建服务器部署的一部分?如果是这样,是否有任何关于 GAE/Google Cloud 的文档说明原因或详细说明其理念?

可以在您的应用程序的 app.yaml

中定义环境变量

python/php/(也许去?)应用程序的示例。 Java 使用不同的格式。

env_variables:
  MY_ENV_VAR: 'some value here'

https://cloud.google.com/appengine/docs/python/config/appconfig#Python_app_yaml_Defining_environment_variables

如果需要,您也可以在 CI 过程中设置这些值,方法是在部署之前以编程方式将它们附加到 app.yaml。

多年过去了,还是没有。

我的解决方法是在部署过程中编译 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 系统中设置。

我发现 post 中还列出了其他方法:https://dev.to/mungell/google-cloud-app-engine-environment-variables-5990 但对我而言,它们不够方便或不够通用。

一个解决方案显然是 https://cloud.google.com/secret-manager/docs,但我选择了此处提供的解决方案:


Securely storing environment variables in GAE with app.yaml

首先,将环境变量放在env_variables.yaml中,例如

env_variables:
  SECRET: 'my_secret'

然后,将此 env_variables.yaml 包含在 app.yaml

includes:
  - env_variables.yaml

最后,将 env_variables.yaml 添加到 .gitignore,这样秘密变量就不会存在于存储库中。


此外,

  • 我提交 env_variables.sample.yaml,其中包含下一位开发人员可以填写的说明和占位符值
  • 在 dev 中,我解析 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 控制台,他们可以看到秘密(在这种情况下,通过浏览控制台中的源文件)。