max*_*ime 7 google-app-engine ansible
我在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"
Run Code Online (Sandbox Code Playgroud)
我想每个人都很容易理解为什么将它存储在Git存储库中是一个坏主意.
目前,我们有一个每个开发人员在部署之前必须填充的影子文件
app.production.yaml.shadow
runtime: nodejs
env: flex
manual_scaling:
instances: 1
env_variables:
DATABASE_PASSWORD: "set me"
MY_API_KEY: "set me"
Run Code Online (Sandbox Code Playgroud)
但随着团队的发展,我们希望每个人都能够在登台时进行部署,为每个开发人员和每项服务设置正确的设置变得越来越困难.
我找到了3个解决方法,以及他们不使用的原因:
最终,我们正在探索使用可由开发人员或持续集成触发的部署服务器的可行性,并在部署到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. |
| | | +---> |
+-------------------------+ +-------------------+ +---------------------+
Run Code Online (Sandbox Code Playgroud)
这引出了3个问题:
正如您所说,不可能将这些解决方案(Ansible、Salt 等)与 App Engine 一起使用。如果你要使用它们,你就必须转向 GCE。谷歌有一些关于如何开始使用这些技术的官方教程。
如果您继续使用 App Engine,则可以使用上述解决方案之一,KMS 更适合此目的。
另一种可能的解决方案是迁移到自定义运行时。根据您的应用程序,您可以使用以下命令生成 Dockerfile:
$ gcloud beta app gen-config --custom
您的 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
Run Code Online (Sandbox Code Playgroud)
然后,您可以修改它以包含存储在环境变量中的密钥,例如如何在文件中输入密钥的示例:
sed 's/topsecret/'"$KEY_1"'/g;s/ultrasecret/'"$KEY_2"'/g' app.production.yaml.shadow > app.production.yaml
请注意在 KEY_1 和 KEY_2 前后使用单引号和双引号,因为您需要它们使用sed.
| 归档时间: |
|
| 查看次数: |
2095 次 |
| 最近记录: |