Implementare casi d'uso comuni

Questa pagina descrive come implementare casi d'uso comuni utilizzando l'API Cloud Quotas. Questa API consente di modificare in modo programmatico le quotas e di automatizzare gli aggiustamenti delle quote nei progetti, nelle cartelle o nell'organizzazione di Google Cloud.

Per saperne di più, consulta la panoramica e il riferimento dell'API Cloud Quotas.

Limitazioni

L'API Cloud Quotas presenta le seguenti limitazioni:

  • L'API non supporta Google Cloud CLI.

  • L'API supporta gli aggiustamenti delle quote a livello di progetto. È possibile richiedere riduzioni di quota per le quote a livello di progetto, cartella e organizzazione.

  • L'API non supporta i Controlli di servizio VPC.

Monitora l'utilizzo e richiedi un aumento se l'utilizzo è superiore all'80%

Questo esempio monitora l'utilizzo della quota con Cloud Monitoring e richiede un aumento quando l'utilizzo supera l'80%.

  1. Chiama la risorsa QuotaInfo per il tuo servizio per determinare l'attuale quotaValue. Il servizio in questo esempio è compute.googleapis.com:
    GET projects/PROJECT_NUMBER/locations/global/services/compute.googleapis.com/quotaInfos
    Sostituisci PROJECT_NUMBER con il numero del progetto.
  2. Per trovare le CPU per progetto e le località applicabili, cerca l'ID quota CPUS-per-project-region nella risposta QuotaInfo. Il valore quotaValue è 20.
    "quotaInfos": [
        …
         {
            "name": "projects/PROJECT_NUMBER/locations/global/services/compute.googleapis.com/quotaInfos/CPUS-per-project-region",
            "quotaId": "CPUS-per-project-region",
            "metric": "compute.googleapis.com/cpus",
            "containerType": "PROJECT",
            "dimensions": [
                "region"
            ],
            "dimensionsInfo": [
                {
                    "dimensions": [],
                    "details": {
                        "quotaValue": 20,
                        "resetValue": 20
                    },
                    "applicableLocations": [
                        "us-central1",
                        "us-central2",
                        "us-west1",
                        "us-east1"
                    ]
                }
            ]
        },
          …
    ]
    
    Questo output include i seguenti valori:
    • PROJECT_NUMBER: un identificatore univoco generato automaticamente per il tuo progetto.
  3. Chiama l'API Cloud Monitoring per trovare l'utilizzo della quota. Nell'esempio seguente è stata specificata la regione us-central1. Le metriche delle quote supportate sono elencate in serviceruntime.
    {
    "name": "projects/PROJECT_NUMBER"
        "filter": "metric.type=\"serviceruntime.googleapis.com/quota/allocation/usage\" AND
        metric.labels.quota_metric=\"compute.googleapis.com/cpus\" AND resource.type=\"consumer_quota\" AND
        resource.label.location=\"us-central1\" ",
        "interval": {
        "startTime": "2023-11-10T18:18:18.0000Z",
        "endTime": "2023-11-17T18:18:18.0000Z"
        },
        "aggregation": {
        "alignmentPeriod": "604800s", // 7 days
        "perSeriesAligner": ALIGN_MAX,
        "crossSeriesReducer": REDUCE_MAX
        }
    }
    
    Questo output include i seguenti valori:
    • PROJECT_NUMBER: un identificatore univoco generato automaticamente per il tuo progetto.
  4. Per determinare l'utilizzo, gestisci la risposta dall'API Cloud Monitoring. Confronta il valore di Cloud Monitoring con il quotaValue nei passaggi precedenti per determinare l'utilizzo.

    Nella risposta di esempio seguente il valore di utilizzo in Cloud Monitoring è 19 nella regione us-central1. Il valore quotaValue per tutte le regioni è 20. L'utilizzo è superiore all'80% della quota ed è possibile avviare un aggiornamento delle preferenze di quota.
    time_series {
     metric {
      labels {
       key: "quota_metric"
       value: "compute.googleapis.com/cpus"
      }
         type: "serviceruntime.googleapis.com/quota/allocation/usage"
      }
      resource {
        type: "consumer_quota"
        labels {
          key: "project_id"
          value: "PROJECT_ID"
        }
        labels {
          key: "location"
          value: "us-central1"
        }
      }
      metric_kind: GAUGE
      value_type: INT64
      points {
        interval {
          start_time {
            seconds: "2023-11-10T18:18:18.0000Z"
          }
          end_time {
            seconds: "2023-11-17T18:18:18.0000Z"
          }
        }
        value {
          int64_value: 19
        }
      }
    }
    
    Questo output include i seguenti valori:
    • PROJECT_ID: un identificatore univoco globale per il progetto.
  5. Per evitare la duplicazione delle preferenze di quota, chiama prima ListQuotaPreferences per verificare se ci sono richieste in attesa. Il flag reconciling=true delle chiamate in attesa.
    GET projects/PROJECT_NUMBER/locations/global/quotaPreferences?filter=service=%22compute.googleapis.com%22%20AND%20quotaId=%22CPUS-per-project-region%22%20AND%20reconciling=true
    Sostituisci PROJECT_NUMBER con il numero del tuo progetto.
  6. Chiama UpdateQuotaPreference per aumentare il valore della quota per la regione us-central1. Nell'esempio seguente, è stato specificato un nuovo valore preferito 100.

    Il campo allow_missing è impostato su true. Questo indica al sistema di creare una risorsa QuotaPreference dove non esiste con il nome indicato.
    PATCH projects/PROJECT_NUMBER/locations/global/quotaPreferences/compute_googleapis_com-cpus-us-central1?allowMissing=true {
        "service": "compute.googleapis.com",
        "quotaId": "CPUS-per-project-region",
        "quotaConfig": {
        "preferredValue": 100
        },
        "dimensions": [
        "mapField": {
        "key": "region",
        "value": "us-central1"
        }
        ],
        }
    
    Questo output include i seguenti valori:
    • PROJECT_NUMBER: un identificatore univoco generato automaticamente per il tuo progetto.
  7. Chiama GetQuotaPreference per verificare lo stato della modifica delle preferenze di quota:
    GET projects/PROJECT_NUMBER/locations/global/quotaPreferences/compute_googleapis_com-cpus-us-central1
    Sostituisci PROJECT_NUMBER con il numero di progetto del tuo progetto. Mentre Google Cloud valuta il valore di quota richiesto, lo stato di riconciliazione è impostato su true.
    "name": "projects/PROJECT_NUMBER/locations/global/quotaPreferences/compute_googleapis_com-cpus-us-central1",
    "service": "compute.googleapis.com",
    "quotaId": "CPUS-per-project-region",
    "quotaConfig": {
        "preferredValue": 100,
        "grantedValue": 50,
        "traceId": "123acd-345df23",
        "requestOrigin": "ORIGIN_UNSPECIFIED"
    },
    "dimensions": [
        "mapField": {
            "key": "region",
            "value": "us-central1"
        }
    ],
    "reconciling": true
    "createTime": "2023-01-15T01:30:15.01Z",
    "updateTime": "2023-01-16T02:35:16.01Z"
    
    Questo output include i seguenti valori:
    • PROJECT_NUMBER: un identificatore univoco generato automaticamente per il tuo progetto.
    Una volta elaborata la preferenza di quota, il campo reconciling viene impostato su false. grantedValue corrisponde a preferredValue. La quota preferita è completamente concessa.

    Quando Google Cloud rifiuta o approva parzialmente una richiesta del cliente, il valore di quota concesso può comunque essere inferiore al valore preferito.

Ridurre una quota

L'esempio seguente riduce il numero di TPU a 10 in ogni area geografica.

  1. Recupera l'ID quota e il valore di quota attuale con una chiamata ListQuotaInfos:
    GET projects/PROJECT_NUMBER/locations/global/services/compute.googleapis.com/quotaInfos
    Sostituisci PROJECT_NUMBER con il numero del progetto del tuo progetto.
  2. Esamina i campi della risposta per trovare una voce QuotaInfo per V2-TPUS-per-project-region.
    "quotaInfos": [
        …
         {
            "name": "projects/PROJECT_NUMBER/locations/global/services/compute.googleapis.com/quotaInfos/V2-TPUS-per-project-region",
            "quotaId": "V2-TPUS-per-project-region",
            "metric": "compute.googleapis.com/Tpus",
            "containerType": "PROJECT",
            "dimensions": [
                "region"
            ],
            "dimensionsInfo": [
                {
                    "dimensions": [],
                    "details": {
                        "quotaValue": 20,
                        "resetValue": 20
                    },
                    "applicableLocations": [
                        "us-central1",
                        "us-central2",
                        "us-west1",
                        "us-east1"
                    ]
                }
            ]
        },
          …
    ]
    
    Questo output include i seguenti valori:
    • PROJECT_NUMBER: un identificatore univoco generato automaticamente per il tuo progetto.
    In questa risposta, l'ID quota è V2-TPUS-per-project-region e il valore attuale di quotaValue è 20.
  3. Riduci la quota TPU in ogni regione a 10 con un CreateQuotaPreferenceRequest. Imposta preferredValue su 10.
    POST projects/PROJECT_NUMBER/locations/global/quotaPreferences?quotaPreferenceId=compute_googleapis_com-Tpu-all-regions {
        "quotaConfig": {
            "preferredValue": 10
        },
        "dimensions": [],
        "service": "compute.googleapis.com",
        "quotaId": "V2-TPUS-per-project-region",
    }
    
    Questo output include i seguenti valori:
    • PROJECT_NUMBER: un identificatore univoco generato automaticamente per il tuo progetto.
  4. Conferma il nuovo valore di quota con una chiamata GetQuotaInfo che definisce l'ID quota come V2-TPUS-per-project-region.
    GET projects/PROJECT_NUMBER/locations/global/services/compute.googleapis.com/quotaInfos/V2-TPUS-per-project-region
    Sostituisci PROJECT_NUMBER con il numero del tuo progetto. Di seguito è riportata una risposta di esempio, value è 10 ed è applicabile in tutte le regioni.
    "name": "projects/PROJECT_NUMBER/locations/global/services/compute.googleapis.com/quotaInfos/V2-TPUS-per-project-region",
    "quotaId": "V2-TPUS-per-project-region",
    "metric": "compute.googleapis.com/v2_tpus",
    "containerType": "PROJECT",
    "dimensions": [
        "region"
    ],
    "dimensionsInfo": [
        {
            "dimensions": [],
            "details": {
                "value": 10,
            },
            "applicableLocations": [
                "us-central1",
                "us-central2",
                "us-west1",
                "us-east1"
            ]
        }
    ]
    
    Questo output include i seguenti valori:
    • PROJECT_NUMBER: un identificatore univoco generato automaticamente per il tuo progetto.

Copia le preferenze di quota in un altro progetto

L'esempio seguente copia tutte le preferenze di quota da un progetto a un altro.

  1. Chiama ListQuotaPreferences sul progetto di origine senza filtro:
    GET projects/PROJECT_NUMBER1/locations/global/quotaPreferences
    PROJECT_NUMBER1 è il numero del progetto di origine. La risposta contiene tutte le preferenze di quota per il progetto di origine.
  2. Per ogni preferenza di quota nella risposta, chiama UpdateQuotaPreference e definisci i seguenti campi:
    • name: il campo del nome aggiornato viene estratto dalla risposta e il numero del progetto di origine (PROJECT_NUMBER1) viene sostituito con il numero del progetto di destinazione (PROJECT_NUMBER2).
    • service, quotaId, preferredValue, dimensions: questi campi possono essere recuperati direttamente dalla risposta così com'è.
    for (QuotaPreference srcPreference : listResponse.getQuotaPreferences()) {
        QuotaPreference.Builder targetPreference = QuotaPreference.newBuilder()
            .setName(srcPreference.getName().replace("PROJECT_NUMBER1", "PROJECT_NUMBER2"))
            .setService(srcPreference.getService())
            .setQuotaId(srcPreference.getQuotaId())
            .setQuotaConfig(
                QuotaConfig.newBuilder().setPreferredValue(srcPreference.getQuotaConfig().getPreferredValue()))
            .putAllDimensions(srcPreference.getDimensionsMap());
        UpdateQuotaPreferenceRequest updateRequest = UpdateQuotaPreferenceRequest.newBuilder()
            .setQuotaPreference(targetPreference)
            .setAllowMissing(true)
            .build();
        cloudQuotas.updateQuotaPreference(updateRequest);
    }
    
  3. Chiama ListQuotaPreferences per verificare lo stato delle preferenze di quota per il progetto di destinazione:
    GET projects/PROJECT_NUMBER2/locations/global/quotaPreferences
    Sostituisci PROJECT_NUMBER2 con il numero di progetto del tuo progetto di destinazione.

Elenco richieste di quota in attesa

Per elencare tutte le richieste di preferenze di quota in attesa per un progetto, chiama ListQuotaPreferences con il filtro reconciling=true.

Get projects/PROJECT_NUMBER/locations/global/quotaPreferences?reconciling=true

Sostituisci PROJECT_NUMBER con il numero del tuo progetto.

La risposta per questa richiesta restituisce l'ultima preferenza di quota in attesa. Poiché l'API Cloud Quotas è un'API dichiarativa, l'ultima preferenza di quota è ciò che il sistema cerca di soddisfare.

Ecco un esempio di risposta:

"quotaPreferences": [
    {
        "name": "projects/PROJECT_NUMBER/locations/global/quotaPreferences/compute_googleapis_com-cpus-us-central1",
        "service": "compute.googleapis.com",
        "quotaId": "CPUS-per-project-region",
        "quotaConfig": {
            "preferredValue": 100,
            "grantedValue": 30,
            "traceId": "123acd-345df23",
            "requestOrigin": "ORIGIN_UNSPECIFIED"
        },
        "dimensions": [
            "map_field": {
                "key": "region",
                "value": "us-central1"
            }
        ],
        "reconciling": true
    "createTime": "2023-01-15T01:30:15.01Z",
        "updateTime": "2023-01-16T02:35:16.01Z"
    },
    {
        "name": "projects/PROJECT_NUMBER/locations/global/quotaPreferences/compute_googleapis_com-cpus-cross-regions",
        "service": "compute.googleapis.com",
        "quotaId": "CPUS-per-project-region",
        "quotaConfig": {
            "preferredValue": 10,
            "grantedValue": 5,
            ,
            "traceId": "456asd-678df43",
            "requestOrigin": "ORIGIN_UNSPECIFIED"
        },
        "reconciling": true
    "createTime": "2023-01-15T01:35:15.01Z",
        "updateTime": "2023-01-15T01:35:15.01Z"
    }
]

Questo output include i seguenti valori:

  • PROJECT_NUMBER: un identificatore univoco generato automaticamente per il tuo progetto.

Richiedi aumenti della quota del gruppo

Per richiedere aumenti per un gruppo di quote in un nuovo progetto, archivia le quote preferite per il nuovo progetto in un file CSV con i seguenti valori: nome servizio, ID quota, valore di quota preferito, dimensioni.

Leggi il contenuto di ogni riga del file CSV nei campi serviceName, quotaId, preferredValue e dimensionMap.

CreateQuotaPreferenceRequest request =
  CreateQuotaPreferenceRequest.newBuilder()
     .setParent("projects/PROJECT_NUMBER/locations/global")
     .setQuotaPreferenceId(buildYourOwnQuotaPreferenceId(serviceName, quotaId, dimensionMap))
     .setQuotaPreference(
        QuotaPreference.newBuilder()
            .setService(serviceName)
            .setQuotaId(quotaId)
            .setQuotaConfig(QuotaConfig.newBuilder().setPreferredValue(preferredValue))
            .putAllDimensions(dimensionMap))
  .build();
cloudQuotas.createQuotaPreference(request);

Sostituisci PROJECT_NUMBER con il numero del tuo progetto.

Poiché il progetto di destinazione è nuovo, puoi chiamare il metodo CreateQuotaPreference durante la lettura e l'assegnazione dei campi. In alternativa, puoi chiamare il metodo UpdateQuotaPreference con allow_missing impostato su true.

Il metodo buildYourOwnQuotaPreferenceId crea un ID preferenza di quota dal nome del servizio, dall'ID quota e da una mappa delle dimensioni in base allo schema di denominazione. In alternativa, puoi scegliere di non impostare l'ID preferenza di quota. Viene generato automaticamente un ID preferenza di quota.

Visualizza informazioni sulla quota per una dimensione specifica di un servizio

La famiglia di GPU è una dimensione specifica del servizio. La richiesta di esempio seguente utilizza l'ID quota GPUS-PER-GPU-FAMILY-per-project-region per ottenere la risorsa QuotaInfo.

GET projects/PROJECT_NUMBER/locations/global/services/compute.googleapis.com/quotaInfos/GPUS-PER-GPU-FAMILY-per-project-region

Sostituisci PROJECT_NUMBER con il numero del tuo progetto.

Questa è un'esempio di risposta. Per ogni chiave gpu_family univoca, quotaValue e applicableLocations sono diversi:

"name": "projects/PROJECT_NUMBER/locations/global/services/compute.googleapis.com/quotaInfos/GpusPerProjectPerRegion",
"quotatName": "CPUS-per-project-region",
"metric": "compute.googleapis.com/gpus_per_gpu_family",
"isPrecise": true,
"quotaDisplayName": "GPUs per GPU family",
"metricDisplayName": "GPUs",
"dimensions": [
    "region",
    "gpu_family"
],
"dimensionsInfo": [
    {
        "dimensions": [
            "mapField": {
                "key": "region",
                "value": "us-central1"
            },
            "mapField": {
                "key": "gpu_family",
                "value": "NVIDIA_H200"
            }
        ],
        "details": {
            "quotaValue": 30,
            "resetValue": 30,
        },
        "applicableLocations": [
            "us-central1"
        ]
    },
    {
        "dimensions": [
            "mapField": {
                "key": "region",
                "value": "us-central1"
            }
        ],
        "details": {
            "quotaValue": 100,
            "resetValue": 100,
        },
        "applicableLocations": [
            "us-central1"
        ]
    },
    {
        "dimensions": [
            "mapField": {
                "key": "gpu_familly",
                "value": "NVIDIA_H100"
            }
        ],
        "details": {
            "quotaValue": 10,
        },
        "applicableLocations": [
            "us-central2",
            "us-west1",
            "us-east1"
        ]
    }
      {
        "dimensions": [],
        "details": {
            "quotaValue": 50,
            "resetValue": 50,
        },
        "applicableLocations": [
            "us-central1",
            "us-central2",
            "us-west1",
            "us-east1"
        ]
    }
]

Questo output include i seguenti valori:

  • PROJECT_NUMBER: un identificatore univoco generato automaticamente per il tuo progetto.

Creare una preferenza di quota per una dimensione specifica per un servizio

L'esempio seguente mostra come creare una quota per una determinata regione e famiglia di GPU con un valore preferito pari a 100. La posizione target è specificata nella mappa delle dimensioni con la chiave region e la famiglia di GPU target con la chiave gpu_family.

Il seguente esempio di CreateQuotaPreference specifica una famiglia di GPU NVIDIA_H100 e una regione us-central1. Sostituisci PROJECT_NUMBER con il numero del progetto.

POST projects/PROJECT_NUMBER/locations/global/quotaPreferences?quotaPreferenceId=compute_googleapis_com-gpus-us-central1-NVIDIA_H100 {
    "service": "compute.googleapis.com",
    "quotaId": "GPUS-PER-GPU-FAMILY-per-project-region",
    "quotaConfig": {
        "preferredValue": 100
    },
    "dimensions": [
        "mapField": {
            "key": "region",
            "value": "us-central1"
        }
          "mapField": {
            "key": "gpu_family",
            "value": "NVIDIA_H100"
        }
    ],
}

Aggiornare una preferenza di quota per una dimensione specifica per un servizio

Il seguente codice campione recupera il valore corrente per le dimensioni {"region" : "us-central1"; gpu_family:"NVIDIA_H100"}, quindi imposta il valore preferito sul doppio. Sostituisci PROJECT_NUMBER con il numero del progetto.

// Get the current quota value for the target dimensions
Map<String, String> targetDimensions = Maps.createHashMap("region", "us-central1", "gpu_family", "NVIDIA_H100");
long currentQuotaValue = 0;
QuotaInfo quotaInfo = cloudQuotas.GetQuotaInfo(
    "projects/PROJECT_NUMBER/locations/global/services/" + serviceName + "quotaInfos/" + quotaId;
for (dimensionsInfo : quotaInfo.getDimensionsInfoList()) {
    If (targetDimensions.entrySet().containsAll(dimensionsInfo.getDimensionsMap().entrySet()) {
       currentQuotaValue = dimensionsInfo.getDetails().getValue();
       break;
    })
}

// Set the preferred quota value to double the current value for the target dimensions
QuotaPreference.Builder targetPreference = QuotaPreference.newBuilder()
        .setName(buildYourOwnQuotaPreferenceId(serviceName, quotaId, targetDimensions))
        .setService(serviceName)
        .setQuotaId(quotaId)
        .setQuotaConfig(QuotaConfig.newBuilder().setPreferredValue(currentQuotaValue * 2))
        .putAllDimensions(targetDimensions));
UpdateQuotaPreferenceRequest updateRequest = UpdateQuotaPreferenceRequest.newBuilder()
        .setQuotaPreference(targetPreference)
        .setAllowMissing(true)
        .build();
 cloudQuotas.updateQuotaPreference(updateRequest);

Passaggi successivi