Как я могу получить частичный ответ для метода: instance.aggregatedList Compute API в GCP

Я пытаюсь получить конкретный ответ от метода Compute API instances.aggregatedList установив fieldsпараметр запроса согласно https://cloud.google.com/resource-manager/docs/performance#partial-response

Но я получаю 400 BAD REQUEST.

Есть ли образец, по которому я могу получить частичный ответ для агрегированных методов?

1 ответ

Решение

Если вы используете следующую команду 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

Как видите, результат немного отличается от тела ответа, описанного в документации :

      {
  "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

Обратите внимание, что если вы сравните оба результата, в фактическом ответе, который вы получите, будет дополнительный "zones/us-central1-a": поле перед instances: поле, которое, как я полагаю, вызывает поведение, которое вы испытываете.

Если вы заинтересованы в работе с частичными ресурсами и получаете только некоторые определенные поля в ответе, вам просто нужно соблюдать правила синтаксиса, описанные в документации, которой вы поделились, и соответственно использовать escape-символы в параметрах запроса.

Например, если вы заинтересованы только в получении id вашего проекта, а также instances' name, machineType и status Я протестировал следующую команду 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"
        }
      ]
    }
  }
}
Другие вопросы по тегам