如何解决在 cloud build yaml 中访问 google cloud secret
我正在尝试从谷歌机密管理器获取机密。根据访问机密的文档,入口点应该是 bash,但我有不同的入口点。试图弄清楚如何在我的步骤“创建数据流模板”中获取秘密。似乎在 step 之外无法访问环境变量值。
steps:
- id: 'Pull dataflow-python3 docker image & load secrets'
name: 'gcr.io/$PROJECT_ID/dataflow-python3:latest'
entrypoint: 'bash'
args:
- '-c'
- |
git rev-parse --short HEAD > COMMIT_ID
commitId=$(cat COMMIT_ID)
echo "Project Id is $PROJECT_ID"
echo "Commit SHA is $COMMIT_SHA"
echo "Commit Id is ${commitId}"
echo "Secret key 'TEST' has value '$$TEST'"
secretEnv: ['TEST']
- id: "Activate virtual environment venv"
name: 'gcr.io/$PROJECT_ID/dataflow-python3:latest'
entrypoint: '/bin/bash'
args: [ '-c','source /venv/bin/activate' ]
waitFor: ['-']
- id: "Create dataflow template"
name: 'gcr.io/$PROJECT_ID/dataflow-python3:latest'
entrypoint: 'python'
args:
- -m
- main
- --job_name=test-df
- --project=$PROJECT_ID
- --region=us-east1
- --template_location=gs://my-project-dataflow-templates/test-alerts-template/templates/send-alert-template
- --staging_location=gs://my-project-dataflow-templates/test-alerts-template/staging/
- --temp_location=gs://my-project-dataflow-templates/test-alerts-template/temp/
- --runner=DataflowRunner
- --setup_file='./setup.py'
- --autoscaling_algorithm=NONE
- --DUMMY=$$TEST
secretEnv: ['TEST']
waitFor: [
'Pull dataflow-python3 docker image & load secrets','Activate virtual environment venv'
]
availableSecrets:
secretManager:
- versionName: projects/my-project/secrets/TEST/versions/latest
env: 'TEST'
在数据流管道中传递的值
秘密值:
解决方法
我在不同的配置中进行了测试,其行为与 Cloud Build 中的 the env parameter “一致”。实际上,您不能像替换变量一样使用 env
或 secretEnv
。
env
和 secretEnv
仅在命令的执行上下文中可用,在命令的配置中不可用。
这意味着:
- 如果您运行使用环境变量的应用或脚本,
env
和secretEnv
会起作用。 - 如果您在步骤的参数中使用
env
或secretEnv
,则不起作用。
但它很微妙
这里是执行BASH命令的上下文->工作
- name: 'gcr.io/cloud-builders/gcloud'
entrypoint: "bash"
args:
- -c
- echo $$TEST
secretEnv: ['TEST']
这里是 step echo 的参数 -> 不工作
- name: 'gcr.io/cloud-builders/gcloud'
entrypoint: "echo"
args:
- $$TEST
secretEnv: ['TEST']
所以要解决您的问题,请执行此操作
- id: "Create dataflow template"
name: 'gcr.io/$PROJECT_ID/dataflow-python3:latest'
entrypoint: 'bash'
args:
- -c
- python main \
--job_name=test-df \
--project=$PROJECT_ID \
--region=us-east1 \
--template_location=gs://my-project-dataflow-templates/test-alerts-template/templates/send-alert-template \
--staging_location=gs://my-project-dataflow-templates/test-alerts-template/staging/ \
--temp_location=gs://my-project-dataflow-templates/test-alerts-template/temp/ \
--runner=DataflowRunner \
--setup_file='./setup.py' \
--autoscaling_algorithm=NONE \
--DUMMY=$$TEST
secretEnv: ['TEST']
waitFor: [
'Pull dataflow-python3 docker image & load secrets','Activate virtual environment venv'
]
,
@guillaume blaquiere 提供的代码可以工作,但问题的根本原因是 Configuring builds to access the secret from Secret Manager 中提到的 entrypoint
:
在要指定密钥的构建步骤中:
- 添加一个指向 bash 的入口点字段,以便在构建步骤中使用 bash 工具。 这是引用机密的环境变量所必需的。
- 添加指定环境变量的 secretEnv 字段。
- 在 args 字段中,添加 -c 标志作为第一个参数。 您在 -c 之后传递的任何字符串都被视为命令。有关使用 -c 运行 bash 命令的更多信息,请参阅 bash 文档。
- 在 args 字段中指定机密时,请使用以 $$ 为前缀的环境变量进行指定。
在您的示例中,您使用:
entrypoint: 'python'
args:
- -m
entrypoint
不是 bash
,第一个参数没有设置标志 -c
。
这也发生在纪尧姆的例子中:
- name: 'gcr.io/cloud-builders/gcloud'
entrypoint: "echo"
args:
- $$TEST
secretEnv: ['TEST']
入口点不是 bash
,但在他的第一个示例中是。
另一方面,在提供的解决方案中,入口点是 bash
,第一个参数是标志 -c
,所以这会起作用:
- id: "Create dataflow template"
name: 'gcr.io/$PROJECT_ID/dataflow-python3:latest'
entrypoint: 'bash'
args:
- -c
- python main \
--job_name=test-df \
--project=$PROJECT_ID \
--region=us-east1 \
--template_location=gs://my-project-dataflow-templates/test-alerts-template/templates/send-alert-template \
--staging_location=gs://my-project-dataflow-templates/test-alerts-template/staging/ \
--temp_location=gs://my-project-dataflow-templates/test-alerts-template/temp/ \
--runner=DataflowRunner \
--setup_file='./setup.py' \
--autoscaling_algorithm=NONE \
--DUMMY=$$TEST
secretEnv: ['TEST']
waitFor: [
'Pull dataflow-python3 docker image & load secrets','Activate virtual environment venv'
]
解是准确的,但原因是entrypoint
和第一个标志-c
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。