如何从AWS Lambda、本地等外部环境访问Google Secret Manager?
这个需求完全可以实现,不需要自行实现OAuth认证,官方客户端库已经内置了完整的认证逻辑,按以下步骤操作即可:
前提准备
首先在GCP控制台完成基础配置:
- 进入IAM页面创建专属服务账号,为该账号授予
roles/secretmanager.secretAccessor(密钥访问者)权限,若有增删改密钥的需求可匹配对应更细粒度的权限 - 导出该服务账号的JSON格式密钥文件,妥善保管,不要提交到代码仓库
本地PC端操作步骤
- 安装对应语言的官方Secret Manager客户端库,以Python为例执行命令:
pip install google-cloud-secret-manager - 配置凭证识别路径,有两种常用方式:
- 临时使用:设置系统环境变量
GOOGLE_APPLICATION_CREDENTIALS,值为服务账号JSON密钥文件在本地的绝对路径,客户端库会自动读取该变量加载凭证 - 长期使用:安装Google Cloud SDK后执行
gcloud auth application-default login,或直接把服务账号密钥文件放在系统默认凭证路径(Windows为%APPDATA%\gcloud\application_default_credentials.json,Linux/macOS为~/.config/gcloud/application_default_credentials.json),客户端库启动时会自动扫描识别
- 临时使用:设置系统环境变量
- 调用示例(Python):
from google.cloud import secretmanager # 无需手动传入凭证,客户端库自动完成认证逻辑 client = secretmanager.SecretManagerServiceClient() # 替换为你的GCP项目ID、密钥名称、指定版本(latest代表最新版本) secret_path = "projects/你的GCP项目ID/secrets/你的密钥名称/versions/latest" resp = client.access_secret_version(request={"name": secret_path}) # 解析得到明文密钥值 secret_value = resp.payload.data.decode("utf-8")
AWS Lambda端操作步骤
- 不要把服务账号密钥硬编码到代码中,可将JSON密钥的内容加密存储在Lambda的环境变量中,或存入AWS Secrets Manager中
- 打包部署包时将GCP Secret Manager客户端库一同打包,或预先制作成Lambda层挂载使用
- 代码中手动加载凭证即可,调用示例(Python):
import os import json from google.cloud import secretmanager from google.oauth2 import service_account # 从Lambda环境变量读取预先存入的服务账号密钥内容 gcp_key = json.loads(os.environ["GCP_SERVICE_ACCOUNT_KEY"]) credentials = service_account.Credentials.from_service_account_info(gcp_key) # 用加载好的凭证初始化客户端 client = secretmanager.SecretManagerServiceClient(credentials=credentials) # 后续调用逻辑和本地环境完全一致 secret_path = "projects/你的GCP项目ID/secrets/你的密钥名称/versions/latest" resp = client.access_secret_version(request={"name": secret_path}) secret_value = resp.payload.data.decode("utf-8")
注意事项
- 服务账号权限遵循最小够用原则,仅授予必要的密钥访问权限,降低密钥泄漏后的风险
- 生产环境若对安全性要求更高,可配置GCP工作负载身份联合,为AWS Lambda的执行角色配置GCP信任关系,直接获取临时访问凭证,无需存储长期有效的服务账号密钥
内容的提问来源于stack exchange,提问作者CoodleNoodle
相关产品推荐
相关产品推荐

