如何在Bitbucket部署的GCP应用中读取Secret Manager存储的环境变量
问题根因
- 你当前配置的核心错误是:App Engine Flex 的
test.yaml配置文件不支持直接通过$变量名的格式自动读取GCP Secret Manager的密钥,也不会自动读取Bitbucket流水线的变量,你写的$MONGODB_CONNECTION_URI在部署时会被直接当成普通字符串传递到应用环境,不会被替换为真实值。 - 额外的认知偏差:GCP Secret Manager的密钥默认不会自动注入到App Engine应用的运行时环境变量中,需要你主动通过两种路径获取:部署时通过流水线注入、或者应用代码主动调用API拉取。
可选解决方案
方案1:通过Bitbucket流水线注入变量(改造成本最低)
这种方案不需要修改应用代码,只需要调整流水线和配置:
- 进入Bitbucket仓库的「Repository settings > Deployments」,找到你用的
test部署环境,新增变量MONGODB_CONNECTION_URI,填入你的数据库连接串,勾选「Secure」选项隐藏值。 - 修改
bitbucket-pipelines.yml的部署步骤,在调用部署pipe之前,先替换test.yaml中的占位符为真实值:
branches: develop: - step: name: Deploy deployment: test script: # 新增这行,替换yaml内的变量占位符为Bitbucket中存储的真实值 - envsubst < test.yaml > test.yaml.out && mv test.yaml.out test.yaml - pipe: atlassian/google-app-engine-deploy:1.0.0 variables: KEY_FILE: $GCP_SECRET PROJECT: 'test-project' DEPLOYABLES: 'test.yaml' PROMOTE: 'false' STOP_PREVIOUS_VERSION: 'false'
- 无需修改原有
test.yaml的配置,重新运行流水线即可。
方案2:应用运行时直接读取GCP Secret Manager(安全性最高)
这种方案敏感值不会经过Bitbucket流水线,也不会出现在任何配置文件中,安全性更强:
- 进入GCP IAM控制台,给App Engine默认服务账号
你的项目ID@appspot.gserviceaccount.com授予Secret Manager Secret Accessor角色,授权范围限定为MONGODB_CONNECTION_URI密钥即可。 - 项目中安装Secret Manager客户端依赖:
npm install @google-cloud/secret-manager
- 修改应用的数据库连接代码,启动时主动拉取密钥:
const {SecretManagerServiceClient} = require('@google-cloud/secret-manager'); const client = new SecretManagerServiceClient(); async function getMongoUri() { // 本地开发时仍读本地.env变量 if (process.env.NODE_ENV === 'local') { return process.env.MONGODB_CONNECTION_URI; } // 线上环境从Secret Manager拉取 const [version] = await client.accessSecretVersion({ name: 'projects/你的项目ID/secrets/MONGODB_CONNECTION_URI/versions/latest', }); return version.payload.data.toString(); } // 调用示例 const uri = await getMongoUri();
- 删除
test.yaml中MONGODB_CONNECTION_URI的相关配置即可。
内容的提问来源于stack exchange,提问作者larsesen
相关产品推荐
相关产品推荐

