如何在 GCP 中获得 Method: instances.aggregatedList Compute API 的部分响应

How can I get a partial response for Method: instances.aggregatedList Compute API in GCP

我正在尝试根据 https://cloud.google.com/resource-manager/docs/performance#partial-response

设置 fields 请求参数,从计算 API 方法 instances.aggregatedList 获得特定响应

但我得到 400 BAD REQUEST

有没有我可以参考的示例,以获得聚合方法的部分响应?

如果您使用以下 CURL 命令:

curl -H "Authorization: Bearer "$(gcloud auth application-default print-access-token) "https://compute.googleapis.com/compute/v1/projects/[CHANGE-FOR-YOUR-PROJECT-ID]/aggregated/instances?maxResults=1"

您会注意到结果的形式类似于:

{
  "id": "projects/[PROJECT-ID]/aggregated/instances",
  "items": {
    "zones/us-central1-a": {
      "instances": [
        {
          "id": "[INSTANCE-ID]",
          "creationTimestamp": "2020-09-21T06:22:21.604-07:00",
          "name": "instance-1",
          "description": "",
          "tags": {
            "items": [
              "http-server",
              "https-server"
            ],
            "fingerprint": "XXXXXX"
          },
          "machineType": "https://www.googleapis.com/compute/v1/projects/[PROJECT-ID]/zones/us-central1-a/machineTypes/e2-medium",
          "status": "RUNNING",
          "zone": "https://www.googleapis.com/compute/v1/projects/[PROJECT-ID]/zones/us-central1-a",
          "canIpForward": false,
          "networkInterfaces": [
            {
              "network": "https://www.googleapis.com/compute/v1/projects/[PROJECT-ID]/global/networks/default",
              "subnetwork": "https://www.googleapis.com/compute/v1/projects/[PROJECT-ID]/regions/us-central1/subnetworks/[SUBNETWORK_NAME]",
              "networkIP": "10.8.0.13",
              "name": "nic0",
              ... with a lot more fields

如您所见,结果与 response body explained in the documentation:

略有不同
{
  "id": string,
  "items": [
    {
      "scopeName": string,
      "instances": [
        {
          "id": string,
          "creationTimestamp": string,
          "name": string,
          "description": string,
          "tags": {
            "items": [
              string
            ],
            "fingerprint": string
          },
          "machineType": string,
          "status": enum,
          "statusMessage": string,
          "zone": string,
          "canIpForward": boolean,
          "networkInterfaces": [
            {
              "network": string,
              "subnetwork": string,
              "networkIP": string,
              "ipv6Address": string,
              "name": string,
              .... with a lot more fields

请注意,如果您比较这两个结果,您收到的实际响应在 instances: 字段之前有一个额外的 "zones/us-central1-a": 字段,我认为这是导致您遇到的行为的原因。

如果您有兴趣使用部分资源并且只获取响应中的某些特定字段,您只需要遵守查询参数中的 syntax rules explained on the documentation you've shared and use the escape characters accordingly

例如如果您只对获取项目的 id 以及 instances' namemachineTypestatus 感兴趣,我测试了以下 curl 命令Cloud Shell 与我的 GCP 项目一起工作,没有问题:

curl -H "Authorization: Bearer "$(gcloud auth application-default print-access-token) "https://compute.googleapis.com/compute/v1/projects/[PROJECT-ID]/aggregated/instances?fields=id,items/zones%2Finstances(name,machineType,status)"

我看到返回了类似于以下内容的内容:

{
  "id": "projects/[PROJECT-ID]/aggregated/instances",
  "items": {
    "zones/us-central1-a": {
      "instances": [
        {
          "name": "instance-1",
          "machineType": "https://www.googleapis.com/compute/v1/projects/[PROJECT-ID]/zones/us-central1-a/machineTypes/e2-medium",
          "status": "RUNNING"
        },
        {
          "name": "instance-2",
          "machineType": "https://www.googleapis.com/compute/v1/projects/[PROJECT-ID]/zones/us-central1-a/machineTypes/e2-medium",
          "status": "TERMINATED"
        }
      ]
    }
  }
}