【发布时间】:2018-10-05 04:52:23
【问题描述】:
我在 App Engine 上有一个暂存项目和一个生产项目,每个项目都有 6 个服务。
目前,我们从开发人员计算机部署,使用
gcloud app deploy app.staging.yaml --project staging-project
或gcloud app deploy app.production.yaml --project production-project
它可以工作,但会导致环境变量出现问题,尤其是机密问题。
我们的应用程序从环境变量中获取其 Api 密钥、数据库凭据和其他内容 - 这使我们能够在本地、Docker 容器或 App Engine 中运行完全相同的应用程序,而无需知道它的部署位置。
如果我按照文档的方式进行部署,我们的 app.yaml 文件将如下所示:
app.production.yaml
runtime: nodejs
env: flex
manual_scaling:
instances: 1
env_variables:
DATABASE_PASSWORD: "topsecret"
MY_API_KEY: "ultrasecret"
我想每个人都很容易理解为什么将它存储在 Git 存储库中是个坏主意。
目前,我们有这个影子文件,每个开发人员都必须在部署前填写
app.production.yaml.shadow
runtime: nodejs
env: flex
manual_scaling:
instances: 1
env_variables:
DATABASE_PASSWORD: "set me"
MY_API_KEY: "set me"
但是随着团队的发展,我们希望每个人都能够在 staging 上进行部署,为每个开发人员和每个服务设置正确的设置变得越来越困难。
我发现了 3 个解决方法,以及不使用它们的原因:
- 使用Google KMS - 允许我们将加密的秘密直接放入项目中,但它需要我们将自定义代码放入我们的应用程序中以对其进行解密。它在本地、暂存和生产之间创建了不同的环境管理。由于复杂性,它增加了出现错误的风险。
- Store secrets in Google Datastore - 我试过了,我创建了一个帮助程序,它在 proccess.ENV 中搜索环境变量,然后在缓存中,最终在 Datastore 中。但与 KMS 一样,它大大增加了复杂性。
- 将机密存储在 JSON file and put in on Google Cloud Storage 中:再次,它需要通过检查环境变量的助手加载环境变量,然后加载文件等...
最终,我们正在探索使用部署服务器的可行性,该服务器将由开发人员或持续集成触发并在部署到 App Engine 时处理所有秘密注入。但是像 Ansible、Salt、Puppet、Chef 这样的工具只有 Compute Engine 的插件,不支持 App Engine。
+-------------------------+ +-------------------+ +---------------------+
| | | +---> |
| Developer workspace | | Ansible | | App Engine STAGING |
| +----> (or other) | | |
+-------------------------+ | | +---------------------+
| |
+-------------------------+ | | +---------------------+
| +----> Injects secrets | | |
| Continous Integration | | | App Engine PROD. |
| | | +---> |
+-------------------------+ +-------------------+ +---------------------+
这引出了 3 个问题:
- 您认为将部署服务器与 App Engine 结合使用是个好主意吗?
- 如何确保生产和暂存机密保持同步,以便开发人员的部署始终正确?
- 有没有办法在 App Engine 上将经典环境变量用于机密?
【问题讨论】:
-
您的秘密在暂存和生产项目中是否稳定,还是经常更改?
-
我们可以每两周在每个版本中添加一些秘密。所以很稳定