我正在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 并将其导入应用的完整教程。
基本上有三个步骤:
-
将 env var 添加到构建触发器设置之一中的"变量"部分
在生成触发器中添加变量的位置的屏幕截图
按照约定,在生成触发器中设置的变量必须以下划线 (_) 开头
-
配置
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"
},
-
将 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