You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Locust通过GCP元数据服务器认证失败问题求助

Locust运行时GCP Secret Manager元数据认证超时问题解决

问题背景

在已配置GCP Secret Manager访问权限的VM或GKE节点上,用Locust做负载测试(目标为需HTTP Basic认证的API接口)时出现异常:

  • 直接运行认证逻辑脚本auth.py,可通过GCP元数据服务器自动完成认证,功能正常;
  • 通过Locust运行相同逻辑时,抛出gRPC超时错误:
grpc._channel._InactiveRpcError: <_InactiveRpcError of RPC that terminated with:
        status = StatusCode.DEADLINE_EXCEEDED
        details = "Deadline Exceeded"
        debug_error_string = "UNKNOWN:Deadline Exceeded {created_time:"2023-03-26T08:07:28.371600607+00:00", grpc_status:4}"

仅当显式指定service-account.json文件认证时,Locust运行正常。

原因分析

Locust基于gevent协程实现并发,默认的monkey-patch会修改标准库的IO组件。GCP客户端库的元数据服务器认证逻辑依赖进程级上下文(如元数据请求缓存、环境变量),协程环境下,元数据请求的网络IO可能被monkey-patch干扰,或认证上下文未正确传递到子协程,最终导致请求超时。

解决方案

方案1:在Locust用户类中预加载凭据

在Locust用户的初始化阶段(on_start方法)提前通过元数据服务器获取凭据,避免在每个任务协程中重复发起认证请求:

from locust import HttpUser, task, between
from google.cloud import secretmanager
from google.auth import compute_engine

class APITestUser(HttpUser):
    wait_time = between(1, 3)
    
    def on_start(self):
        # 显式创建基于元数据服务器的认证凭据
        credentials = compute_engine.Credentials()
        # 初始化Secret Manager客户端并传入凭据
        self.secret_client = secretmanager.SecretManagerServiceClient(credentials=credentials)
        
        # 提前获取API的Basic认证密钥(根据实际密钥格式调整)
        project_id = "YOUR_PROJECT_ID"
        secret_id = "YOUR_SECRET_ID"
        version_name = f"projects/{project_id}/secrets/{secret_id}/versions/latest"
        response = self.secret_client.access_secret_version(request={"name": version_name})
        # 假设Secret存储的是"username:password"格式的字符串
        self.basic_auth = tuple(response.payload.data.decode("UTF-8").split(":"))
    
    @task
    def fetch_data_api(self):
        # 使用预加载的凭据发起API请求
        self.client.get("/api/data", auth=self.basic_auth)

方案2:禁用gevent的Socket Monkey-Patch

如果协程IO的monkey-patch是问题根源,可在启动Locust时禁用socket的patch(注意:可能降低Locust并发性能):

LOCUST_MONKEY_PATCH_SOCKET=False locust -f your_locustfile.py

方案3:预加载临时令牌到环境变量

在启动Locust前,通过元数据服务器获取临时访问令牌并设置到环境变量,让GCP客户端库直接读取该令牌,避免在协程中发起元数据请求:

# 从元数据服务器获取临时访问令牌
export GOOGLE_OAUTH_ACCESS_TOKEN=$(curl -s "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token" -H "Metadata-Flavor: Google" | jq -r '.access_token')

# 启动Locust
locust -f your_locustfile.py

验证

实施任意方案后,启动Locust测试,检查:

  • Secret Manager访问无超时错误
  • API请求能正常通过HTTP Basic认证获取数据

内容的提问来源于stack exchange,提问作者Rahul

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 19:00:21