Hetzner VM实例中Datastore写入报PermissionDenied 403错误求助
出现的错误信息:
google.api_core.exceptions.PermissionDenied: 403 Received http2 header with status: 403
grpc._channel._InactiveRpcError: <_InactiveRpcError of RPC that terminated with:
status = StatusCode.PERMISSION_DENIED
details = "Received http2 header with status: 403"
debug_error_string = "UNKNOWN:Error received from peer {created_time:"2024-03-24T16:48:16.893337907+00:00", grpc_status:7, grpc_message:"Received http2 header with status: 403"}
下一步排查方案:
验证Hetzner VM的网络连通性
在VM上执行curl -v https://datastore.googleapis.com/v1/projects/[你的项目ID]:lookup(替换为实际项目ID),检查是否能正常连接到Datastore服务端点,确认没有被Hetzner的网络策略或VM本地防火墙拦截。核对服务账号密钥的配置
确认VM上的GOOGLE_APPLICATION_CREDENTIALS环境变量指向的密钥文件路径正确,且文件内容和本地正常使用的密钥完全一致。可以用cat $GOOGLE_APPLICATION_CREDENTIALS直接查看文件内容验证。检查Cloud Datastore API的启用状态
登录Google Cloud控制台,确认当前项目的Cloud Datastore API已启用。若未启用,手动开启后等待5-10分钟再测试应用。排查VM的代理/防火墙设置
如果VM配置了代理服务器,确认代理允许访问datastore.googleapis.com;同时检查VM本地防火墙规则,确保没有拦截出站的443端口流量。确认服务账号与项目的关联关系
确保使用的服务账号确实属于当前操作的Google Cloud项目,没有出现项目ID混淆的情况。若安装了gcloud工具,可执行gcloud auth list查看当前认证的账号和项目是否匹配。更新Google Cloud客户端库
升级VM上的Datastore客户端库到最新版本,旧版本可能存在兼容性问题。以Python为例,执行pip install --upgrade google-cloud-datastore。强制使用HTTP/1.1规避gRPC问题
在应用启动前设置环境变量,强制客户端使用HTTP/1.1而非HTTP/2:export GRPC_PROTOCOL=http export GRPC_ENABLE_FORK_SUPPORT=0或者在代码中添加:
import os os.environ['GRPC_PROTOCOL'] = 'http' os.environ['GRPC_ENABLE_FORK_SUPPORT'] = '0'
内容的提问来源于stack exchange,提问作者Aleksa Tešić

