Google app engine GAE:如何使用机密部署各种环境?
我在AppEngine上有一个登台和一个生产项目,每个项目上有6个服务 目前,我们从开发人员计算机部署,使用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容器或应用程序引擎中运行完全相同的应用程序,而不知道
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一样,它也增加了很多复杂性
- 将机密存储在中:同样,它需要通过检查环境变量的助手加载环境变量,然后加载文件等
+-------------------------+ +-------------------+ +---------------------+
| | | +---> |
| Developer workspace | | Ansible | | App Engine STAGING |
| +----> (or other) | | |
+-------------------------+ | | +---------------------+
| |
+-------------------------+ | | +---------------------+
| +----> Injects secrets | | |
| Continous Integration | | | App Engine PROD. |
| | | +---> |
+-------------------------+ +-------------------+ +---------------------+
这就引出了3个问题:
- 您认为使用带有App Engine的部署服务器是个好主意吗?
- 如何确保生产和登台机密保持同步,以便开发人员的部署始终正确?
- 有没有一种方法可以在App Engine上使用经典环境变量获取机密信息?
$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
文件中。如果获取机密出错,它可以中止。然后,您可以