Google app engine GAE:如何使用机密部署各种环境?

Google app engine GAE:如何使用机密部署各种环境?,google-app-engine,ansible,Google App Engine,Ansible,我在AppEngine上有一个登台和一个生产项目,每个项目上有6个服务 目前,我们从开发人员计算机部署,使用 gcloud app deploy app.staging.yaml——项目暂存项目 或gcloud app deploy app.production.yaml——项目生产项目 它可以工作,但它会引起环境变量的问题,特别是与秘密有关的问题 我们的应用程序从环境变量中获取Api密钥、数据库凭据和其他内容,这使我们能够在本地、Docker容器或应用程序引擎中运行完全相同的应用程序,而不知道

我在AppEngine上有一个登台和一个生产项目,每个项目上有6个服务

目前,我们从开发人员计算机部署,使用
gcloud app deploy app.staging.yaml——项目暂存项目

gcloud app deploy app.production.yaml——项目生产项目

它可以工作,但它会引起环境变量的问题,特别是与秘密有关的问题

我们的应用程序从环境变量中获取Api密钥、数据库凭据和其他内容,这使我们能够在本地、Docker容器或应用程序引擎中运行完全相同的应用程序,而不知道它部署在何处

如果按照文档方式部署,我们的app.yaml文件将如下所示:

FROM gcr.io/google_appengine/nodejs
RUN /usr/local/bin/install_node '>=4.3.2'
COPY . /app/
RUN npm install --unsafe-perm || \
  ((if [ -f npm-debug.log ]; then \
      cat npm-debug.log; \
    fi) && false)
CMD npm start
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"
但是,随着团队的发展,我们希望每个人都能够在登台上部署,为每个开发人员和每个服务提供正确的设置变得越来越困难

我找到了3种变通方法,以及它们不被使用的原因:

  • 使用-允许我们将加密的秘密直接放入项目中,但它要求我们在应用程序中放入自定义代码来解密它们。它在本地、暂存和生产之间创建了不同的环境管理。由于复杂性,它增加了出现错误的风险
  • -我尝试过,我创建了一个助手,在proccess.env中搜索环境变量,然后在缓存中搜索,最后在数据存储中搜索。但和KMS一样,它也增加了很多复杂性
  • 将机密存储在中:同样,它需要通过检查环境变量的助手加载环境变量,然后加载文件等
最终,我们正在探索使用由开发人员或持续集成触发的部署服务器的可行性,并在部署到App Engine时处理所有机密注入。但是像Ansible、Salt、Puppet、Chef这样的工具只有用于计算引擎的插件,不支持应用引擎

+-------------------------+    +-------------------+   +---------------------+
|                         |    |                   +--->                     |
| Developer workspace     |    |    Ansible        |   | App Engine STAGING  |
|                         +---->   (or other)      |   |                     |
+-------------------------+    |                   |   +---------------------+
                               |                   |
+-------------------------+    |                   |   +---------------------+
|                         +---->   Injects secrets |   |                     |
| Continous Integration        |                   |   | App Engine PROD.    |
|                         |    |                   +--->                     |
+-------------------------+    +-------------------+   +---------------------+
这就引出了3个问题:

  • 您认为使用带有App Engine的部署服务器是个好主意吗?
  • 如何确保生产和登台机密保持同步,以便开发人员的部署始终正确?
  • 有没有一种方法可以在App Engine上使用经典环境变量获取机密信息?

正如您所说,这两种解决方案(Ansible、Salt等)都不可能与App Engine一起使用。如果你要使用它们,你就必须转到普通中等教育。谷歌有一些关于如何开始使用这两种技术

如果您继续使用AppEngine,您可以使用上面提到的解决方案之一,KMS更适合用于此目的

另一种可能的解决方案是迁移到自定义运行时。根据您的应用程序,您可以使用以下内容生成Dockerfile:

$gcloud beta应用程序gen config--自定义

您的Dockerfile将如下所示:

FROM gcr.io/google_appengine/nodejs
RUN /usr/local/bin/install_node '>=4.3.2'
COPY . /app/
RUN npm install --unsafe-perm || \
  ((if [ -f npm-debug.log ]; then \
      cat npm-debug.log; \
    fi) && false)
CMD npm start
然后,您可以对其进行修改,以包含存储在环境变量中的密钥,并使用类似以下示例的方法在文件中输入密钥:

sed's/topsecret/“$KEY_1””/g;s/ultrasecret/“$KEY_2”/g”app.production.yaml.shadow>app.production.yaml


请注意在KEYY1和KEYY2的前后使用单曲和双打引号,正如你需要的一样。

< P>我强烈鼓励你考虑使用KMS和云存储的组合,如谷歌概述。p> 你是对的,设置起来可能有点麻烦,但一旦设置到位,就很容易处理了。我们为每个环境(
dev
test
staging
prod
)设置单独的密钥环,然后为每个应用程序设置单独的密钥,并编写一个命令行实用程序,使团队中的任何开发人员都可以轻松地将机密写入机密存储(同时防止他们读回生产机密)


归根结底,机密管理仍然是一个难题。随着团队的发展,管理多个应用程序/环境的机密非常困难。但我真的鼓励您只需提前支付KMS之类的投资成本,因为这将使您的生活变得更加轻松,并真正降低意外泄漏的风险自鸣得意。

几次之后,我可以对这个问题说:

  • 为每个环境创建一个app.yaml。您可以根据您的环境指定要在部署时使用的app.yaml文件
  • 将非机密环境参数(如端点URL)放入env_variables部分
  • 对于您的秘密(api密钥、秘密令牌…),请使用诸如或之类的专用工具。这将允许您在项目之间共享它们,并在团队中处理谁可以访问它们

你的秘密在登台和制作项目中是稳定的,还是经常更改?我们可以每两周在每个版本中添加一些秘密。因此,这是相当稳定的。如果你使用一些API,如Vault或新的Google Secret Manager,你什么时候提出这些秘密请求?你是在实例启动时这样做的吗?我担心的是e:1,它增加了启动时间,但更重要的是2,如果API失败会发生什么?另一种方法是,在调用
gcloud app deploy
之前,执行一个定制的预部署脚本,获取机密,并可能将其放入
.env
文件中。如果获取机密出错,它可以中止。然后,您可以