排查 Cloud Endpoints 配置部署问题

本页面介绍如何排查您在部署 Cloud Endpoints 配置时可能会遇到的错误。您看到的错误消息包含项目特有的信息。例如,您可能会看到包含项目 ID 的错误消息。您将在本页面看到占位符值,例如 YOUR_PROJECT_ID

完成每个步骤后,请再次运行 gcloud endpoints services deploy 命令,以确定错误是否已得到解决。

无法转换为服务配置

ERROR: unknown location: http: In path template '[PATH]': unexpected end of input '/'.'

当 OpenAPI 文档中的一个或多个路径含有尾随斜杠 (/) 字符时,系统会显示此错误。要解决该问题,请从所有路径中移除尾随斜杠。例如,OpenAPI 文档中的以下代码段会导致此错误:

paths:
  "/echo/":
    post:
      description: "Echo back a given message."

要解决此问题,请移除 /echo/ 中的尾随斜杠:

paths:
  "/echo":
    post:
      description: "Echo back a given message."

不允许获取项目设置

ERROR: (gcloud.endpoints.services.deploy) PERMISSION_DENIED:
Not allowed to get project settings for project YOUR_PROJECT_ID

  1. 再次使用 Cloud SDK 进行身份验证,以确认您是否使用了有权访问错误消息中显示的项目的帐号进行身份验证:
    gcloud auth login
    

    您的浏览器会打开一个新的标签页,并提示您选择一个帐号。

  2. 确认错误消息中显示的项目 ID 与您要在其中部署 Endpoints 配置的 Google Cloud 项目对应:
    gcloud projects list
    
  3. 确认 Cloud SDK 已将正确的项目 ID 设置为当前项目:
    gcloud config set project YOUR_PROJECT_ID
    

调用者没有权限

ERROR: (gcloud.endpoints.services.deploy) PERMISSION_DENIED:
Caller does not have permission 'servicemanagement.services.create' on project YOUR_PROJECT_ID

当您首次部署 Endpoints 配置时,Service Management 会为您的 API 创建托管式服务。如需创建托管式服务,您必须至少拥有项目级层的 Editor 角色。在 Service Management 创建托管式服务后,您必须至少具备该服务的 Service Config Editor 角色 (roles/servicemanagement.configEditor) 才能重新部署 Endpoints 配置。如需了解详情,请参阅授予对 API 的访问权限

无法验证域名所有权

ERROR: (gcloud.endpoints.services.deploy) PERMISSION_DENIED:
Ownership for domain name YOUR_DOMAIN_NAME on project YOUR_PROJECT_ID cannot be verified

  • 如果您在 OpenAPI 文档的 host 字段中配置了自定义网域(例如 example.com),则必须先验证域名,然后才能部署 OpenAPI 文档。
  • 如果您使用的是 cloud.goog 网域,请确认 host 字段的值采用的是以下格式,并且项目 ID 正确无误:
    API_NAME.endpoints.YOUR_PROJECT_ID.cloud.goog
    
  • 如果您使用的是 appspot.com 网域(只有 App Engine 支持该网域),请确认 host 字段采用的是以下格式,并且项目 ID 正确无误:
    YOUR_PROJECT_ID.appspot.com
    

排查其他错误

如果您收到此处未列出的错误,或者相关信息无法解决您的问题,请再次运行 gcloud 命令,并添加用于显示调试信息的标志:

gcloud --verbosity=debug endpoints services deploy openapi.yaml

后续步骤