Cloudbuild中的秘密环境变量(没有文件),如何?



我正在Cloud Build中创建一个非常基本的Node.js应用程序的CI/CD管道,并部署到GCP appengine标准。

非机密环境变量存储在app.yaml文件中。但我当然不想把我的秘密放在那里。事实上,我不想将它们放在任何地方(加密与否)的任何文件中,因为该文件最终将出现在 AppEngine 实例上,并且可以被"坏管理员"查看"。有很多示例建议加密/解密完整的文件(有时甚至是代码),但我不想走这条路。

我正在寻找一种将秘密环境变量设置为"内存中"作为 CI/CD 管道的一部分的方法。 任何人?

我在app.yaml文件中没有添加任何机密(env_variables) - 工作正常 将加密的机密添加到我的cloudbuild.yaml文件(机密)中 - 没有错误 在构建步骤中添加了secretEnv:,但值最终不会成为process.env。[KEY] 在应用引擎中

Cloudbuild.yaml

steps:
- name: 'gcr.io/cloud-builders/npm'
args: ['install']
dir: "appengine/hello-world/standard"
- name: "gcr.io/cloud-builders/gcloud"
args: ["app", "deploy", "test-app.yaml"]
dir: "appengine/hello-world/standard"
secretEnv: ['API_KEY', 'API_URL']
secrets:
- kmsKeyName: projects/XXXXXXXX/locations/global/keyRings/customintegrations-secrets/cryptoKeys/integration-secrets
secretEnv:
API_KEY: XXQAoHgKKoHBKOURrUU2RqU+ki8XyqmTjz+ns+MEWp5Kx3hQBpgSQgATFQ5yRdW4m1TLNqNRIdHIqVJi8tn8jFrtlHIEouOzNDe/ASlOT0ZQBfl9Rf7xlvOHAa667poBq2hEoMNvOclxUQ==
API_URL: YYQAoHgKKklo08ZsQF+/8M2bmi9nhWEtb6klyY4rNthUhSIhQ8oSQQATFQ5ywKOxaM/TLwGDmvMtCpl/1stXOOK0kgy42yipYbw/J/QZL68bMat1u4H3Hvp/GMbUVIKEb9jwUtN2xvbL

我希望secretEnv: ['API_KEY', 'API_URL']可以使解密的值可以在应用程序引擎的代码(process.env.API_KEY)中访问。

下面是有关如何在云构建(触发器)设置中安全地存储 env var 并将其导入应用的完整教程。

基本上有三个步骤:

  1. 将 env var 添加到构建触发器设置之一中的"变量"部分

    在生成触发器中添加变量的位置的屏幕截图

    按照约定,在生成触发器中设置的变量必须以下划线 (_) 开头

  2. 配置cloudbuild.yaml(在代码示例的第二步)以从生成触发器中读取变量,将其设置为 env var,并将所有 env var 写入本地 .env 文件中

    couldbuild.yaml(如下)添加到项目根目录

steps:
- name: node:10.15.1
entrypoint: npm
args: ["install"]
- name: node:10.15.1
entrypoint: npm
args: ["run", "create-env"]
env:
- 'MY_SECRET_KEY=${_MY_SECRET_KEY}'
- name: "gcr.io/cloud-builders/gcloud"
args: ["app", "deploy"]
timeout: "1600s"

create-env脚本添加到package.json

"scripts": {
"create-env": "printenv > .env"
},

  1. 将 env vars 从 .env 读取到您的应用程序 (config.js)

    安装 dotenv 软件包

    npm i dotenv -S

    向应用添加config.js

// Import all env vars from .env file
require('dotenv').config()
export const MY_SECRET_KEY = process.env.MY_SECRET_KEY
console.log(MY_SECRET_KEY) // => Hello

做!现在,您可以通过触发云构建来部署应用,并且您的应用将有权访问 env vars。

使用机密管理器中的机密

您的样本将变为:

steps:
- name: 'gcr.io/cloud-builders/npm'
args: ['install']
dir: "appengine/hello-world/standard"
- name: "gcr.io/cloud-builders/gcloud"
args: ["app", "deploy", "test-app.yaml"]
dir: "appengine/hello-world/standard"
secretEnv: ['API_KEY', 'API_URL']
availableSecrets:
secretManager:
- versionName: projects/$PROJECT_ID/secrets/<secret name>/versions/latest
env: API_KEY 
- versionName: projects/$PROJECT_ID/secrets/<secret name 2>/versions/latest
env: API_URL

在 cloudbuild.yaml 中添加云触发器步骤,以在 app.yaml 文件中添加占位符

steps:
- name: "gcr.io/cloud-builders/gcloud"
secretEnv: ['API_KEY','API_URL']
entrypoint: 'bash'   args: 
- -c
- |
echo $'n  API_KEY: '$$API_KEY >> app.yaml
echo $'n  API_URL: '$$API_URL >> app.yaml
gcloud app deploy
availableSecrets:   secretManager:
- versionName: projects/012345678901/secrets/API_KEY
env: 'API_KEY'
- versionName: projects/012345678901/secrets/API_URL
env: 'API_URL'

查看以下参考应用.yaml

runtime: nodejs
service: serviceone
env_variables:
PROJECT_ID: demo
PORT: 8080

参考资料: https://stackoverflow.com/users/13763858/cadet

最新更新