如何使用cloudbuild将秘密管理器秘密传递到app.yaml中的应用引擎环境变量



下面是我的app.yaml

runtime: python39
entrypoint: gunicorn -b :$PORT main:app
runtime_config:
python_version: 3
env_variables:
SEC: %sec%
manual_scaling:
instances: 1
resources:
cpu: 1
memory_gb: 0.5
disk_size_gb: 10

这是我的cloudbuild。应用引擎试图将一个秘密值传递给app.yaml作为env变量

steps:
- name: 'gcr.io/google.com/cloudsdktool/cloud-sdk'
entrypoint: 'bash'
args: ['-c', "export _VAL=$(echo $$SEC) 
&& echo $$SEC;echo $_VAL  && sed -i 's/%sec%/'$$SEC'/g' app.yaml
&& gcloud config set app/cloud_build_timeout 1600 && gcloud app deploy"
]
secretEnv: ["SEC"]
availableSecrets:
secretManager:
- versionName: projects/$PROJECT_ID/secrets/db_secret/versions/3
env: 'SEC'

timeout: '1600s'

过去我使用">>"将嫉妒追加到我的app.yaml的底部。使用这种方法,app.yaml的env_variables部分需要放在最后。

我不再使用这种方法,但秘密显示在你的cloudbuild日志。现在我只需要导入秘密管理器包来获取应用程序中的秘密。

cloudbuild.yaml

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

app.yaml

runtime: go116
main: cmd
service: serviceone
env_variables:
PROJECT_ID: project-a0a00
PORT: 8080

你的方式是对的,你犯了一个引号错误,因为你试图运行一个内联命令。

首选|结构,更具可读性,因此易于调试和编写。每行按顺序执行,类似于内联命令

中的&&
steps:
- name: 'gcr.io/google.com/cloudsdktool/cloud-sdk'
entrypoint: 'bash'
args: 
- '-c'
- |
export _VAL=$(echo $$SEC)
echo $$SEC
echo $_VAL
sed -i "s/%sec%/$$SEC/g" app.yaml
gcloud config set app/cloud_build_timeout 1600 
gcloud app deploy
secretEnv: ["SEC"]
availableSecrets:
secretManager:
- versionName: projects/$PROJECT_ID/secrets/db_secret/versions/3
env: 'SEC'

timeout: '1600s'

编辑1:

如果您的密码包含打破SED表达式的特殊字符,您将得到一个错误。您可以使用替代解决方案来替换整行,例如

steps:
- name: 'gcr.io/google.com/cloudsdktool/cloud-sdk'
entrypoint: 'bash'
args: 
- '-c'
- |
export _VAL=$(echo $$SEC)
echo $$SEC
echo $_VAL
cat app.yaml | awk "{ if (NR == $(grep -n '%sec%' app.yaml | cut -d : -f 1)) print "    SEC: $$SEC"; else print }" > app.yaml
gcloud config set app/cloud_build_timeout 1600 
gcloud app deploy
secretEnv: ["SEC"]
availableSecrets:
secretManager:
- versionName: projects/$PROJECT_ID/secrets/db_secret/versions/3
env: 'SEC'

timeout: '1600s'

试穿一下

最新更新