GCP Cloud Function中如何通过hvac实现Vault登录认证
GCP Cloud Function 环境下hvac对接Vault GCP认证实现方案
不需要上传服务账号JSON密钥文件,也不需要依赖本地文件路径,直接利用Cloud Function运行时内置的默认服务账号身份即可完成认证,具体实现如下:
前置确认
- Cloud Function绑定的默认服务账号已经在Vault侧完成GCP认证方法的角色绑定,具备对应登录权限
- 运行时无需配置任何SA密钥文件,也无需修改文件系统权限
依赖配置
将以下依赖写入Cloud Function部署用的requirements.txt:
hvac>=1.2.0 requests>=2.31.0
可直接复用的实现代码
import os import hvac import requests def get_vault_client(): # 配置项统一从环境变量读取,避免硬编码 vault_addr = os.getenv("VAULT_ADDR") gcp_auth_mount_point = os.getenv("VAULT_GCP_AUTH_MOUNT", default="gcp") vault_bound_role = os.getenv("VAULT_GCP_ROLE_NAME") # 从GCP内置元数据服务拉取当前运行SA的签名身份JWT,无需本地密钥 metadata_identity_endpoint = ( "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/identity" f"?audience=vault/{gcp_auth_mount_point}" ) metadata_req_headers = {"Metadata-Flavor": "Google"} jwt_resp = requests.get(metadata_identity_endpoint, headers=metadata_req_headers, timeout=3) jwt_resp.raise_for_status() sa_signed_jwt = jwt_resp.text # 初始化hvac客户端并完成登录 client = hvac.Client(url=vault_addr, timeout=5) client.auth.gcp.login( role=vault_bound_role, jwt=sa_signed_jwt, mount_point=gcp_auth_mount_point ) if not client.is_authenticated(): raise RuntimeError("Vault GCP authentication failed") return client # Cloud Function 入口示例 def cloud_function_entry(request): vault_client = get_vault_client() # 后续业务逻辑:比如读取KV引擎密钥、操作动态凭证等 # secret_data = vault_client.secrets.kv.v2.read_secret_version(path="app/config") return "Function executed successfully"
关键注意事项
- 文档中传入SA JSON文件路径的示例,面向的是本地开发、非GCP托管环境的使用场景,GCP原生计算资源(Cloud Function/Cloud Run/GKE/GCE等)自带运行时身份,不需要走该流程
- 元数据服务是GCP运行环境内置的内网服务,不需要公网访问,无额外流量成本,请求延迟稳定在毫秒级
- 该方案不需要给绑定的服务账号额外授予
iam.serviceAccountTokenCreator类的IAM权限,拉取默认身份JWT是GCP托管资源的内置能力 - 如果使用1.0.0以下版本的hvac,登录接口的JWT参数名可能为
jwt_token,升级到最新稳定版即可适配示例代码
内容的提问来源于stack exchange,提问作者thsteven13
相关产品推荐
相关产品推荐

