如何将GCP Secret Manager存储的密钥设置为云函数环境变量
GCP云函数调用Secret Manager密钥的替代实现方案
以下是三种不需要本地存储密钥文件的可行实现方式,按优先级排序:
云函数原生绑定Secret Manager密钥(官方推荐,安全性最高)
不需要修改业务代码,直接通过云函数配置完成密钥注入:- 先为云函数的运行时服务账号授予
roles/secretmanager.secretAccessor角色,确保有权限访问目标密钥 - 部署云函数时直接指定从Secret Manager读取内容作为环境变量,gcloud部署命令示例如下:
gcloud functions deploy 你的函数名称 \ --runtime python39 \ --trigger-http \ --set-secrets 'GOOGLE_APPLICATION_CREDENTIALS=projects/你的项目ID/secrets/你的密钥名称/versions/latest'该方式由GCP自动完成密钥的注入和生命周期管理,不需要将密钥放入代码包或本地存储,也不需要在代码中手动处理密钥读取逻辑。
- 先为云函数的运行时服务账号授予
运行时拉取密钥直接初始化客户端(无需设置环境变量)
如果你已经可以在代码中正常访问Secret Manager,可以直接拉取密钥内容初始化对应服务客户端,完全不需要设置GOOGLE_APPLICATION_CREDENTIALS环境变量,Python示例代码如下:import json from google.cloud import secretmanager, billingbudgets # 初始化Secret Manager客户端拉取密钥 secret_client = secretmanager.SecretManagerServiceClient() secret_version_path = "projects/你的项目ID/secrets/你的密钥名称/versions/latest" secret_resp = secret_client.access_secret_version(request={"name": secret_version_path}) sa_key_content = json.loads(secret_resp.payload.data.decode("utf-8")) # 直接用密钥内容初始化预算服务客户端 budget_client = billingbudgets.BudgetServiceClient.from_service_account_info(sa_key_content) # 后续直接调用budget_client的对应方法获取预算列表即可临时写入内存文件系统(仅兼容强依赖环境变量的场景)
如果你使用的第三方依赖必须读取本地密钥文件路径,可以将拉取到的密钥内容写入云函数唯一可写的/tmp临时目录,再设置环境变量指向该临时文件,示例代码如下:import os import json from google.cloud import secretmanager # 拉取密钥内容 secret_client = secretmanager.SecretManagerServiceClient() secret_version_path = "projects/你的项目ID/secrets/你的密钥名称/versions/latest" secret_content = secret_client.access_secret_version(request={"name": secret_version_path}).payload.data.decode("utf-8") # 写入临时目录 tmp_key_path = "/tmp/sa_key.json" with open(tmp_key_path, "w", encoding="utf-8") as f: f.write(secret_content) # 设置环境变量 os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = tmp_key_path云函数的
/tmp目录数据仅在当前函数实例存活期间有效,实例销毁后会自动清空,不会残留密钥数据。
内容的提问来源于stack exchange,提问作者Pin90
相关产品推荐
相关产品推荐

