管理服务配额

本页介绍如何查看特定服务在 Google Cloud 项目上的所有配额指标和限制,以及如何使用配额替换值来限制该服务的配额使用量。您可以使用 Service Usage 来管理任何服务项目的配额,包括公共 Google Cloud 服务和使用 Cloud Endpoints 创建的专用服务。如需详细了解公共和专用 API 和服务之间的差异,请参阅公共服务和专用服务

对于大多数操作使用场景,管理配额的最简单方法是使用 Google Cloud 控制台。如果您需要针对 Service Usage API 进行编程,则可以使用我们提供的某一客户端库。如需试用 API,您可以按照本指南中的说明进行操作,并使用 gcurl 命令测试 API,而无需设置完整的应用开发环境。

如果您使用的是 Terraform,请参阅使用 Terraform 管理服务使用情况资源

准备工作

如需使用本页中的示例,请完成使用入门指南中列出的所有步骤。相关步骤包括定义 gcurl(标准 curl 命令的经过身份验证的别名),以及定义环境变量 PROJECT_NUMBER

确保熟悉服务配额模型,以更好地理解本教程中使用的术语。

显示服务配额

如需查看适用于服务上特定使用方的所有配额指标和限制,请使用以下命令:

gcurl "https://serviceusage.googleapis.com/v1beta1/projects/${PROJECT_NUMBER}/services/compute.googleapis.com/consumerQuotaMetrics"

调用会返回服务定义的指标列表作为响应,每个响应都包含针对这些指标的限制列表,适用于使用方、这些限制的值以及任何替换值。以下是部分示例响应:


{
  "metrics": [
    ...
    {
      "name": "projects/${PROJECT_NUMBER}/services/compute.googleapis.com/consumerQuotaMetrics/compute.googleapis.com%2Fcpus",
      "displayName": "CPUs",
      "consumerQuotaLimits": [
        {
          "name": "projects/${PROJECT_NUMBER}/services/compute.googleapis.com/consumerQuotaMetrics/compute.googleapis.com%2Fcpus/limits/%2Fproject%2Fzone",
          "unit": "1/{project}/{zone}",
          "isPrecise": true,
          "metric": "compute.googleapis.com/cpus",
          "quotaBuckets": [
            {
              "effectiveLimit": "-1",
              "defaultLimit": "-1"
            }
          ]
        },
        {
          "name": "projects/${PROJECT_NUMBER}/services/compute.googleapis.com/consumerQuotaMetrics/compute.googleapis.com%2Fcpus/limits/%2Fproject%2Fregion",
          "unit": "1/{project}/{region}",
          "isPrecise": true,
          "metric": "compute.googleapis.com/cpus",
          "quotaBuckets": [
            {
              "effectiveLimit": "24",
              "defaultLimit": "24"
            },
            {
              "effectiveLimit": "72",
              "defaultLimit": "72",
              "dimensions": {
                "region": "asia-northeast1"
              }
            },

            ...

            {
              "effectiveLimit": "72",
              "defaultLimit": "72",
              "dimensions": {
                "region": "australia-southeast1"
              }
            }
          ]
        }
      ],
      "metric": "compute.googleapis.com/cpus",
      "unit": "1"
    },
    ...
    {
      "name": "projects/${PROJECT_NUMBER}/services/compute.googleapis.com/consumerQuotaMetrics/compute.googleapis.com%2Fexternal_vpn_gateways",
      "displayName": "External VPN gateways",
      "consumerQuotaLimits": [
        {
          "name": "projects/${PROJECT_NUMBER}/services/compute.googleapis.com/consumerQuotaMetrics/compute.googleapis.com%2Fexternal_vpn_gateways/limits/%2Fproject",
          "unit": "1/{project}",
          "isPrecise": true,
          "metric": "compute.googleapis.com/external_vpn_gateways",
          "quotaBuckets": [
            {
              "effectiveLimit": "15",
              "defaultLimit": "15"
            }
          ]
        }
      ],
      "metric": "compute.googleapis.com/external_vpn_gateways",
      "unit": "1"
    },
    ...

响应中的每个指标都有一个 name 字段;如需仅针对该指标检查配额设置而不针对所有指标,请在网址中使用其 name。在本教程中,环境变量 METRIC_RESOURCE_NAME 存储配额指标资源名称:

METRIC_RESOURCE_NAME="projects/${PROJECT_NUMBER}/services/compute.googleapis.com/consumerQuotaMetrics/compute.googleapis.com%2Fexternal_vpn_gateways"
gcurl "https://serviceusage.googleapis.com/v1beta1/${METRIC_RESOURCE_NAME}"

由于指定了特定的指标资源名称,调用仅返回该指标的信息:

{
  "name": "projects/${PROJECT_NUMBER}/services/compute.googleapis.com/consumerQuotaMetrics/compute.googleapis.com%2Fexternal_vpn_gateways",
  "displayName": "External VPN gateways",
  "consumerQuotaLimits": [
    {
      "name": "projects/${PROJECT_NUMBER}/services/compute.googleapis.com/consumerQuotaMetrics/compute.googleapis.com%2Fexternal_vpn_gateways/limits/%2Fproject",
      "unit": "1/{project}",
      "isPrecise": true,
      "metric": "compute.googleapis.com/external_vpn_gateways",
      "quotaBuckets": [
        {
          "effectiveLimit": "15",
          "defaultLimit": "15"
        }
      ]
    }
  ],
  "metric": "compute.googleapis.com/external_vpn_gateways",
  "unit": "1"
}

同样,指标中的每个限制都有一个 name字段;要仅针对该指标的限制检查配额设置而不针对某个指标或所有指标的所有限制,请在网址中使用其 name。在本教程中,环境变量 LIMIT_RESOURCE_NAME 存储配额限制资源名称:

LIMIT_RESOURCE_NAME="projects/${PROJECT_NUMBER}/services/compute.googleapis.com/consumerQuotaMetrics/compute.googleapis.com%2Fexternal_vpn_gateways/limits/%2Fproject"
gcurl "https://serviceusage.googleapis.com/v1beta1/${LIMIT_RESOURCE_NAME}"

如果给定了特定的限制,则调用仅返回该限制的信息:

{
  "name": "projects/${PROJECT_NUMBER}/services/compute.googleapis.com/consumerQuotaMetrics/compute.googleapis.com%2Fexternal_vpn_gateways/limits/%2Fproject",
  "unit": "1/{project}",
  "isPrecise": true,
  "metric": "compute.googleapis.com/external_vpn_gateways",
  "quotaBuckets": [
    {
      "effectiveLimit": "15",
      "defaultLimit": "15"
    }
  ]
}

创建使用方配额替换值

项目的所有者可以将使用方替换值应用于针对该项目的特定配额限制,以减少使用方可以针对该限制为配额总量支付的费用。

请注意,使用方替换值不能将可用配额增加到超出服务默认值和其他方(例如服务所有者或组织的配额管理员)现有的所有替换值允许的范围。如需增加可用配额,请使用主配额页面上的“修改配额”选项,或要求组织管理员进行配额提升。

如需确定要替换的限制,请先使用之前任一方法来查找相关配额限制。然后,使用配额限制的名称字段创建该限制的新使用方替换值。以下示例演示了 Compute Engine 服务的“外部 VPN 网关”配额指标的项目限制:

LIMIT_RESOURCE_NAME="projects/${PROJECT_NUMBER}/services/compute.googleapis.com/consumerQuotaMetrics/compute.googleapis.com%2Fexternal_vpn_gateways/limits/%2Fproject"
gcurl "https://serviceusage.googleapis.com/v1beta1/${LIMIT_RESOURCE_NAME}/consumerOverrides" -d '{"overrideValue": "14"}'

如果调用成功,则在配额更改传播到后端系统时,它将返回一个操作标识符,代表服务器上正在进行的工作:

{
  "name": "operations/quf.92accba3-6530-4fc1-9a95-c1280d48a6b7"
}

如需检查操作的进度,只需使用其 name

OPERATION_NAME="operations/quf.92accba3-6530-4fc1-9a95-c1280d48a6b7"
gcurl "https://serviceusage.googleapis.com/v1/${OPERATION_NAME}"

如果操作成功,则响应消息将包含 done: true,并包含新创建的替换资源。如果操作失败,则响应消息包括 done: true,但不包含资源而是包含错误详细信息。

要验证是否已创建替换值,请列出限制的所有使用方替换值:

gcurl "https://serviceusage.googleapis.com/v1beta1/${LIMIT_RESOURCE_NAME}/consumerOverrides"

新创建的替换值应出现在列表中:

{
  "overrides": [
    {
      "name": "projects/${PROJECT_NUMBER}/services/compute.googleapis.com/consumerQuotaMetrics/compute.googleapis.com%2Fexternal_vpn_gateways/limits/%2Fproject/consumerOverrides/Cg1RdW90YU92ZXJyaWRl",
      "overrideValue": "14"
    }
  ]
}

创建区域或地区配额替换值

有些配额限制是按区域或地区强制实施的;这由限制的 unit 字段中存在的 {region}{zone} 来指示。例如,按区域强制实施以 "1/{project}/{region}" 为单位的限制。对此类限制应用替换值会更改每个区域或地区的基本配额。如需仅更改特定区域或地区的配额,请在创建替换值时使用 dimensions 字段添加配额维度。例如,创建 Compute Engine 区域配额限制的区域替换值,如下所示:

REGIONAL_LIMIT_RESOURCE_NAME="projects/${PROJECT_NUMBER}/services/compute.googleapis.com/consumerQuotaMetrics/compute.googleapis.com%2Fcpus/limits/%2Fproject%2Fregion"
gcurl "https://serviceusage.googleapis.com/v1beta1/${REGIONAL_LIMIT_RESOURCE_NAME}/consumerOverrides" -d '{"overrideValue": "65", "dimensions": {"region": "southamerica-east1"} }'

要验证是否已创建区域替换值,请列出限制的所有使用方替换值:

gcurl "https://serviceusage.googleapis.com/v1beta1/${REGIONAL_LIMIT_RESOURCE_NAME}/consumerOverrides"

新创建的区域替换值应显示在列表中:

{
  "overrides": [
    {
      "name": "projects/${PROJECT_NUMBER}/services/compute.googleapis.com/consumerQuotaMetrics/compute.googleapis.com%2Fcpus/limits/%2Fproject%2Fregion/consumerOverrides/Cg1RdW90YU92ZXJyaWRlGhwKBnJlZ2lvbhISc291dGhhbWVyaWNhLWVhc3Qx",
      "overrideValue": "65",
      "dimensions": {
        "region": "southamerica-east1"
      }
    }
  ]
}

更新使用方配额替换值

项目的所有者还可以更改项目上现有使用方替换值的值。

例如,假设先前的 create 调用返回了一个带有 name 字段的替换值,如下所示:

name: "projects/${PROJECT_NUMBER}/services/compute.googleapis.com/consumerQuotaMetrics/compute.googleapis.com%2Fexternal_vpn_gateways/limits/%2Fproject/consumerOverrides/Cg1RdW90YU92ZXJyaWRl"

然后,使用该名称标识要更新的替换值,如下所示:

OVERRIDE_RESOURCE_NAME="projects/${PROJECT_NUMBER}/services/compute.googleapis.com/consumerQuotaMetrics/compute.googleapis.com%2Fexternal_vpn_gateways/limits/%2Fproject/consumerOverrides/Cg1RdW90YU92ZXJyaWRl"
gcurl "https://serviceusage.googleapis.com/v1beta1/${OVERRIDE_RESOURCE_NAME}" -X PATCH -d '{"overrideValue": "13"}'

如果调用成功,则在配额更改传播到后端系统时,它将返回一个操作标识符,代表服务器上正在进行的工作:

{
  "name": "operations/quf.92accba3-6530-4fc1-9a95-c1280d48a6b7"
}

如需检查操作的进度,只需使用其 name

OPERATION_NAME="operations/quf.92accba3-6530-4fc1-9a95-c1280d48a6b7"
gcurl "https://serviceusage.googleapis.com/v1/${OPERATION_NAME}"

如果操作成功,则响应消息将包含 done: true,并包含更新的替换资源。如果操作失败,则响应消息包括 done: true,但不包括更新的资源而是包含错误详细信息。

要验证是否已更新替换值,请列出限制的所有使用方替换值:

LIMIT_RESOURCE_NAME="projects/${PROJECT_NUMBER}/services/compute.googleapis.com/consumerQuotaMetrics/compute.googleapis.com%2Fexternal_vpn_gateways/limits/%2Fproject"
gcurl "https://serviceusage.googleapis.com/v1beta1/${LIMIT_RESOURCE_NAME}/consumerOverrides"

更新后的替换值现在应出现在列表中:

{
  "overrides": [
    {
      "name": "projects/${PROJECT_NUMBER}/services/compute.googleapis.com/consumerQuotaMetrics/compute.googleapis.com%2Fexternal_vpn_gateways/limits/%2Fproject/consumerOverrides/Cg1RdW90YU92ZXJyaWRl",
      "overrideValue": "13"
    }
  ]
}

删除使用方配额替换值

项目的所有者还可以从项目中移除使用方替换值。

例如,假设先前的 create 调用返回了一个带有 name 字段的替换值,如下所示:

name: "projects/${PROJECT_NUMBER}/services/compute.googleapis.com/consumerQuotaMetrics/compute.googleapis.com%2Fdefault_requests/limits/%2Fmin%2Fproject/consumerOverrides/Cg1RdW90YU92ZXJyaWRl"

如需删除替换值,请按以下顺序发出命令:

OVERRIDE_RESOURCE_NAME="projects/${PROJECT_NUMBER}/services/compute.googleapis.com/consumerQuotaMetrics/compute.googleapis.com%2Fdefault_requests/limits/%2Fmin%2Fproject/consumerOverrides/Cg1RdW90YU92ZXJyaWRl"
gcurl "https://serviceusage.googleapis.com/v1beta1/${OVERRIDE_RESOURCE_NAME}" -X DELETE

要验证是否已删除替换值,请列出限制的所有使用方替换值:

LIMIT_RESOURCE_NAME="projects/${PROJECT_NUMBER}/services/compute.googleapis.com/consumerQuotaMetrics/compute.googleapis.com%2Fexternal_vpn_gateways/limits/%2Fproject"
gcurl "https://serviceusage.googleapis.com/v1beta1/${LIMIT_RESOURCE_NAME}/consumerOverrides"

已删除的替换值不应再出现在列表中。

强制更改大幅配额

如果更改任何配额都将导致强制配额减少超过 10%,则将拒绝该调用,这是一种安全措施,可避免意外地过快降低配额。如需忽略此限制,请使用 force 标志。例如,这是一个带有 force 标志的创建调用:

LIMIT_RESOURCE_NAME="projects/${PROJECT_NUMBER}/services/compute.googleapis.com/consumerQuotaMetrics/compute.googleapis.com%2Fexternal_vpn_gateways/limits/%2Fproject"
gcurl "https://serviceusage.googleapis.com/v1beta1/${LIMIT_RESOURCE_NAME}/consumerOverrides?force=true" -d '{"overrideValue": "0"}'