“资源项目的权限被拒绝” - 服务帐户激活后无法使用 cURL 调用已部署的模型

问题描述

我使用 Predict 将基于 sklearn 的模型部署到 GCP AI Platform。使用 GCP AI Platform 控制台中的“测试和使用”选项卡时,我能够成功测试模型。

enter image description here

但是,在使用终端进行测试时,出现错误

curl -X POST -d '{"instances": [[12.85,3.27,2.58,22.0,106.0,1.65,0.6,0.96,5.58,0.87,2.11,570.0],[12.08,1.13,2.51,24.0,78.0,2.0,1.58,0.4,1.4,2.2,1.31,2.72,630.0],[12.0,0.92,19.0,86.0,2.42,2.26,0.3,1.43,2.5,1.38,3.12,278.0]]}' https://ml.googleapis.com/v1/projects/ml_deployment_tutorials/models/sklearn/versions/v1_0:predict\?access_token\=$(gcloud auth application-default print-access-token)

{
  "error": {
    "code": 403,"message": "Permission denied on resource project ml_deployment_tutorials.","status": "PERMISSION_DENIED","details": [
      {
        "@type": "type.googleapis.com/google.rpc.Help","links": [
          {
            "description": "Google developer console API key","url": "https://console.developers.google.com/project/ml_deployment_tutorials/apiui/credential"
          }
        ]
      }
    ]
  }

此外,在 Postman 中进行测试时,我也遇到了类似的错误

{
    "error": {
        "code": 401,"message": "Request is missing required authentication credential. Expected OAuth 2 access token,login cookie or other valid authentication credential. See https://developers.google.com/identity/sign-in/web/devconsole-project.","status": "UNAUTHENTICATED"
    }
}

但是,我确实已经在终端中登录了 gcloud sdk,因为在运行 gcloud auth list 时,我得到了:

               Credentialed Accounts
ACTIVE  ACCOUNT
        ai-assets@appspot.gserviceaccount.com
        ***@***.com
        ***@gmail.com
*       ml-deploy@datakademy.iam.gserviceaccount.com

服务账户“ml-deploy@datakademy.iam.gserviceaccount.com”是我刚刚创建的,我下载了密钥文件并在终端中做了export GOOGLE_APPLICATION_CREDENTIALS="/home/george/Documents/datakademy-ml.json"(创建服务账户时,我也选择了角色“ML Engine Admin”,也尝试了“Owner”)。这是成功的,因为当我执行 gcloud auth application-default print-access-token 时,我得到了下面这个长字符串:

ya29.c.Kp0B7gcRXl4cyLCWnc-olIZ3Bh3Ak-YQO-t0fDOp-1nx6BWS5xGOv-4Qa6tS7RPYYfIwBw-mRgzPHoIlCM-eCt67wKQhYbfEvEafsB_V-*****

服务账号创建好后,我也在终端激活:

gcloud auth activate-service-account ml-deploy@datakademy.iam.gserviceaccount.com --key-file=/home/george/Documents/datakademy-ml.json

Activated service account credentials for: [ml-deploy@datakademy.iam.gserviceaccount.com]

解决方法

我在您的屏幕截图上注意到模型名称为 sklearn_model,但在您的 AI Platform 端点上您使用了 sklearn。此外,使用的项目 ID 似乎不正确,因为 a project ID 不能包含下划线。

项目ID必须是6到30个小写字母的唯一字符串, 数字或连字符。它必须以字母开头,并且不能有 尾随连字符。

通过转到 GCP Home-> Dashboard 加倍 check your project ID。您的项目 ID 应位于“项目信息”下方。

enter image description here

correct structure of the endpoint 应该是:

https://ml.googleapis.com/v1/projects/your-project-id/models/your-model-name/versions/your-version-name:predict

您的终点应该是这样的(只需放置您正确的项目 ID):

https://ml.googleapis.com/v1/projects/your-project-id/models/sklearn_model/versions/v1_0:predict
,

在@Ricco D 指出的错误项目和模型名称之上,事实证明我使用的端点是错误的。由于我的模型是在“us-central1”区域中创建的,我应该使用端点 https://us-central1-ml.googleapis.com/ 而不是 https://ml.googleapis.com/。更改此设置后,使用以下命令,我现在可以恢复预测。

curl -X POST -d '{"instances": [[12.85,3.27,2.58,22.0,106.0,1.65,0.6,0.96,5.58,0.87,2.11,570.0],[12.08,1.13,2.51,24.0,78.0,2.0,1.58,0.4,1.4,2.2,1.31,2.72,630.0],[12.0,0.92,19.0,86.0,2.42,2.26,0.3,1.43,2.5,1.38,3.12,278.0]]}' https://us-central1-ml.googleapis.com/v1/projects/datakademy/models/sklearn_model/versions/v0_1:predict\?access_token\=$(gcloud auth application-default print-access-token)