實作常見用途

本文說明如何使用 Cloud Quotas API 實作常見用途。透過這項 API,您可以利用程式調整配額,並自動調整配額 Trusted Cloud by S3NS 專案、資料夾或機構的配額。

詳情請參閱 Cloud Quotas API 的總覽參考資料

限制

Cloud Quotas 具有下列限制:

  • 在大多數情況下,配額調高調整作業必須在專案層級進行。只有少數產品支援機構層級的配額調高調整。如要確認 Trusted Cloud by S3NS 產品是否支援組織層級的配額提高調整,請參閱該產品的說明文件。

  • 您可以要求調降專案、機構和資料夾層級的配額。

追蹤用量,並在用量超過 80% 時要求增加配額

這個範例會使用 Cloud Monitoring 追蹤配額用量,並在用量超過 80% 時申請增加配額。

  1. 呼叫服務的 QuotaInfo 資源,判斷目前的 quotaValue。本範例中的服務為 compute.googleapis.com

    GET projects/PROJECT_NUMBER/locations/global/services/compute.googleapis.com/quotaInfos

    PROJECT_NUMBER 替換為專案的專案編號。

  2. 如要找出每個專案的 CPU 數量和適用位置,請在 QuotaInfo 回應中尋找 CPUS-per-project-region 配額 ID。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"
                  ]
              }
          ]
      },
      ...
    ]
  3. 呼叫 Cloud Monitoring API,找出配額用量。在以下範例中,系統已指定區域 us-central1。支援的配額指標列於 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"
      }
    }
  4. 如要判斷用量,請處理 Cloud Monitoring API 的回應。將 Cloud Monitoring 的值與先前步驟中的 quotaValue 進行比較,判斷用量。

    在下列範例回應中,Cloud Monitoring 的用量值為 19,位於 us-central1 區域。所有區域的 quotaValue 都是 20。用量超過配額的 80%,且可啟動配額偏好設定更新。

    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
      }
    }
    }
  5. 為避免重複設定配額偏好設定,請先呼叫 ListQuotaPreferences,確認是否有待處理的要求。reconciling=true 旗標會呼叫待處理的要求。

    GET projects/PROJECT_NUMBER/locations/global/quotaPreferences?filter=service=%22compute.googleapis.com%22%20AND%20quotaId=%22CPUS-per-project-region%22%20AND%20reconciling=true

    PROJECT_NUMBER 替換為專案的專案編號。

  6. 請撥打 UpdateQuotaPreference,提高區域 us-central1 的配額值。在下列範例中,已指定新的偏好值 100。

    欄位 allow_missing 已設為 true。這會告知系統建立 QuotaPreference 資源 (如果沒有提供名稱)。

    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": { "region": "us-central1" },
    "justification": "JUSTIFICATION",
    "contactEmail": "EMAIL"
    }

    更改下列內容:

    • PROJECT_NUMBER:專案的專屬 ID。
    • JUSTIFICATION:說明要求的選用字串。
    • EMAIL:如果 Trusted Cloud by S3NS 需要更多資訊才能核發額外配額,可將這個電子郵件地址做為聯絡方式。
  7. 呼叫 GetQuotaPreference,查看配額偏好設定變更的狀態:

    GET projects/PROJECT_NUMBER/locations/global/quotaPreferences/compute_googleapis_com-cpus-us-central1

    PROJECT_NUMBER 替換為專案的專案編號。

    Trusted Cloud by S3NS 評估要求的配額值時,配額的對帳狀態會設為 true

    有時 Trusted Cloud by S3NS 不會完全核准您的要求,而是只核准部分要求。如果要求部分獲准,配額偏好設定會包含 stateDetail 欄位。stateDetail 欄位會說明部分核准狀態。「grantedValue」欄位會顯示為部分滿足要求而進行的調整。

    如要查看核准的最終值是否為授予的值,請查看 reconciling 欄位。如果要求仍在評估中,reconciling 欄位會設為 true。如果 reconciling 欄位設為 false 或省略,則核准值為最終值。

    在下列範例中,要求的配額值為 100,而 reconciling 欄位表示要求正在審查中。

    "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": { "region": "us-central1" },
    "reconciling": true,
    "createTime": "2023-01-15T01:30:15.01Z",
    "updateTime": "2023-01-16T02:35:16.01Z"

    配額偏好設定處理完畢後,reconciling 欄位會設為 falsegrantedValuepreferredValue 相同。系統已完全核准偏好配額。

    當 Trusted Cloud by S3NS 拒絕或部分核准客戶要求時,核准的配額值仍可能低於偏好值。

調降配額

以下範例會將每個區域的 TPU 數量減少至 10 個。

  1. 使用 ListQuotaInfos 呼叫取得配額 ID 和目前的配額值:

    GET projects/PROJECT_NUMBER/locations/global/services/compute.googleapis.com/quotaInfos

    PROJECT_NUMBER 替換為專案的專案編號。

  2. 查看回應欄位,找出 QuotaInfoV2-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"
                  ]
              }
          ]
      },
      ...
    ]

    在這個回應中,配額 ID 為 V2-TPUS-per-project-region,目前的 quotaValue 為 20。

  3. 將各區域的 TPU 配額減少至 10 個,並使用 CreateQuotaPreferenceRequest。 將 preferredValue 設為 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",
      "justification": "JUSTIFICATION",
      "contactEmail": "EMAIL"
    }

    更改下列內容:

    • PROJECT_NUMBER:專案的專屬 ID。
    • JUSTIFICATION:說明要求的選用字串。
    • EMAIL:如果 Trusted Cloud by S3NS 需要更多資訊才能核發額外配額,可將這個電子郵件地址做為聯絡方式。
  4. 使用 GetQuotaInfo 呼叫確認新的配額值,將配額 ID 定義為 V2-TPUS-per-project-region

    GET projects/PROJECT_NUMBER/locations/global/services/compute.googleapis.com/quotaInfos/V2-TPUS-per-project-region

    PROJECT_NUMBER 替換為專案的專案編號。

    以下是回應範例,value 為 10,適用於所有區域。

    "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"
          ]
      }
    ]

將配額偏好設定複製到其他專案

以下範例會將配額偏好設定從一個專案複製到另一個專案。這項服務是以 Java 編寫,但您可以使用任何程式設計語言。

  1. 在來源專案上呼叫 ListQuotaPreferences,不使用任何篩選器:

    GET projects/PROJECT_NUMBER1/locations/global/quotaPreferences

    PROJECT_NUMBER1 是來源專案的專案號碼。回應包含來源專案的所有配額偏好設定。

  2. 針對回應中的每個配額偏好設定,呼叫 UpdateQuotaPreference 並定義下列欄位:

    • name:更新後的名稱欄位取自回應,且來源專案編號 (PROJECT_NUMBER1) 會替換為目的地專案編號 (PROJECT_NUMBER2)。

    • servicequotaIdpreferredValuedimensions - 這些欄位可直接從回應中取得。

    for (QuotaPreference srcPreference : listResponse.getQuotaPreferences()) {
      QuotaPreference.Builder targetPreference = QuotaPreference.newBuilder()
          .setName(srcPreference.getName().replace("PROJECT_NUMBER1", "PROJECT_NUMBER2"))
          .setService(srcPreference.getService())
          .setQuotaId(srcPreference.getQuotaId())
          .setJustification(srcPreference.getJustification())
          .setContactEmail(srcPreference.getContactEmail())
          .setQuotaConfig(
              QuotaConfig.newBuilder().setPreferredValue(srcPreference.getQuotaConfig().getPreferredValue()))
          .putAllDimensions(srcPreference.getDimensionsMap());
      UpdateQuotaPreferenceRequest updateRequest = UpdateQuotaPreferenceRequest.newBuilder()
          .setQuotaPreference(targetPreference)
          .setAllowMissing(true)
          .build();
      cloudQuotas.updateQuotaPreference(updateRequest);
    }
  3. 呼叫 ListQuotaPreferences,驗證目標專案的配額偏好設定狀態:

    GET projects/PROJECT_NUMBER2/locations/global/quotaPreferences

    PROJECT_NUMBER2 替換為目的地專案的專案編號。

列出待處理的配額要求

如要列出專案的所有待處理配額偏好設定要求,請使用篩選器 reconciling=true 呼叫 ListQuotaPreferences

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

PROJECT_NUMBER 替換為專案的專案編號。

這項要求的回應會傳回最新的待處理配額偏好設定。由於 Cloud Quotas API 是宣告式 API,系統會盡量滿足最新的配額偏好設定。

範例回應如下:

  "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": {
        "region": "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"
    }
  ]

要求提高群組配額

如要為新專案的一組配額申請調高額度,請將新專案的偏好配額儲存在 CSV 檔案中,並包含下列值:服務名稱、配額 ID、偏好配額值、維度。

針對 CSV 檔案中的每個資料列,將內容讀取至 serviceNamequotaIdpreferredValuedimensionMap 欄位。

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

PROJECT_NUMBER 替換為專案的專案編號。

由於目標專案是新的,因此在讀取及指派欄位時,可以安全地呼叫 CreateQuotaPreference 方法。或者,您也可以呼叫 UpdateQuotaPreference 方法,並將 allow_missing 設為 true

方法 buildYourOwnQuotaPreferenceId 會根據您的命名架構,從服務名稱、配額 ID 和維度對應建立配額偏好設定 ID。也可以選擇不設定配額偏好 ID。系統會為您產生配額偏好設定 ID。

要求調整未使用的配額

如果配額沒有配額用量,且具有服務專屬維度 (例如 vm_family),則這些配額可能不會顯示在 Trusted Cloud 控制台中。您可能需要改用 Cloud Quotas API。

舉例來說,您可能會複製專案,並事先知道需要增加 compute.googleapis.com/gpus_per_gpu_family 的值。這個值只會顯示在 Trusted Cloud 主控台中,適用於您已使用的 GPU 系列。如要使用 Cloud Quotas API 要求增加 us-central1 中的 NVIDIA_H100 GPU,可以傳送類似下列的要求:

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": { "region": "us-central1", "gpu_family": "NVIDIA_H100" },
    "justification": "JUSTIFICATION",
    "contactEmail": "EMAIL"
}

更改下列內容:

  • PROJECT_NUMBER:專案的專屬 ID。
  • JUSTIFICATION:說明要求的選用字串。
  • EMAIL:如果 Trusted Cloud by S3NS 需要更多資訊才能核發額外配額,這個電子郵件地址可用於聯絡。

詳情請參閱「維度優先順序」和「合併維度」的說明。

取得特定服務維度的配額資訊

GPU 系列是服務專屬的維度。下列範例要求使用 GPUS-PER-GPU-FAMILY-per-project-region 配額 ID 取得 QuotaInfo 資源。

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

PROJECT_NUMBER 替換為專案的專案編號。

這是回覆範例。針對每個不重複的 gpu_family 鍵,quotaValueapplicableLocations 都不相同:

"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": {
            "region": "us-central1",
            "gpu_family": "NVIDIA_H200"
        },
        "details": {
            "quotaValue": 30,
            "resetValue": 30,
        },
        "applicableLocations": [
            "us-central1"
        ]
    },
    {
        "dimensions": {
            "region": "us-central1"
            }
        "details": {
            "quotaValue": 100,
            "resetValue": 100,
        },
        "applicableLocations": [
            "us-central1"
        ]
    },
    {
        "dimensions": {
            "gpu_familly": "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"
        ]
    }
]

為服務專屬維度建立配額偏好設定

以下範例說明如何為特定區域和 GPU 系列建立配額,並將偏好值設為 100。目標位置是在維度對應中以 region 鍵指定,目標 GPU 系列則是以 gpu_family 鍵指定。

下列 CreateQuotaPreference 範例指定 GPU 系列為 NVIDIA_H100,區域為 us-central1

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": {"region": "us-central1", "gpu_family": "NVIDIA_H100"},
    "justification": "JUSTIFICATION",
    "contactEmail": ""EMAIL"
}

更改下列內容:

  • PROJECT_NUMBER:專案的專屬 ID。
  • JUSTIFICATION:說明要求的選用字串。
  • EMAIL:如果 Trusted Cloud by S3NS 需要更多資訊才能核發額外配額,這個電子郵件地址可用於聯絡。

更新特定服務維度的配額偏好設定

下列程式碼範例會取得維度 {"region" : "us-central1"; gpu_family:"NVIDIA_H100"}, 的目前值,然後將偏好值設為該值的兩倍。這項服務是以 Java 編寫,但您可以使用任何程式設計語言。

// 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)
        .setJustification(justification)
        .setContactEmail(contactEmail)
        .setQuotaConfig(QuotaConfig.newBuilder().setPreferredValue(currentQuotaValue * 2))
        .putAllDimensions(targetDimensions));
UpdateQuotaPreferenceRequest updateRequest = UpdateQuotaPreferenceRequest.newBuilder()
        .setQuotaPreference(targetPreference)
        .setAllowMissing(true)
        .build();
 cloudQuotas.updateQuotaPreference(updateRequest);

PROJECT_NUMBER 替換為專案的專屬 ID。

後續步驟