将第 1 代函数升级为 Cloud Run functions

本指南介绍了如何将第 1 代 HTTP 和 Pub/Sub 函数升级为在 Cloud Run 上运行的 Cloud Run 函数。本指南仅适用于使用 Cloud Functions v1 API 创建的第 1 代函数。本指南中的说明不适用于使用 Cloud Functions v2 API 或 Cloud Functions for Firebase(单独的产品)创建的第 2 代函数

升级完成后,您只能使用 Cloud Run Admin API 和 Cloud Run 工具与升级后的函数进行交互。

限制

升级工具目前仅支持升级由 HTTP 和 Pub/Sub 触发的函数。

升级流程概述

下面简要介绍了升级流程:

将第 1 代函数升级到 Cloud Run 的概览。
图 1:简要介绍了将第 1 代函数升级到 Cloud Run 的步骤。

以下部分详细介绍了此流程。

“开始升级”概览

  • 当您开始升级时(使用 Google Cloud CLI 或 Google Cloud 控制台),升级工具会创建一个临时第 2 代函数,该函数是原始第 1 代函数的副本。此第 2 代函数:
    • 充当原始第 1 代函数与最终完全升级的函数之间的桥梁。
    • 与原始第 1 代函数具有相同的名称、代码和配置。
      • 如果升级的是 HTTP 函数,则具有与原始第 1 代函数相同的 cloudfunctions.net 网址,并且还具有 run.app Cloud Run 网址。
        • 开始升级后,第 1 代函数和第 2 代函数副本都会分配到同一 cloudfunctions.net 网址。当向 cloudfunctions.net 网址发送请求时,流量会继续路由到第 1 代函数。第 2 代函数副本也有 Cloud Run run.app 网址。在您在下一步中重定向流量之前,第 2 代函数网址不会接收流量。
      • 如果升级的 Pub/Sub 函数与第 1 代函数使用相同的 Pub/Sub 主题,但尚未订阅。
    • 请注意,如果您未将依赖项固定到特定版本,则新创建的第 2 代函数副本可能会使用较新的依赖项版本。
  • 第 1 代函数会继续在第 1 代 Google Cloud 控制台中列出,而其临时第 2 代副本会首次显示在 Cloud Run 控制台中。

示例:下表显示了在初始升级步骤中 HTTP 函数的状态。

函数 处理流量? 在控制台中可见?
原始的第 1 代函数 可以,通过 cloudfunctions.net 网址 是,第 1 代控制台。
新第 2 代文案 不会。此函数同时具有 cloudfunctions.netrun.app 网址,但在重定向步骤之前不会处理流量。 可以,Cloud Run 控制台。

重定向流量概览

  • 重定向流量时,结果取决于您要升级的函数是 HTTP 函数还是 Pub/Sub 函数:
    • 如果您要升级 HTTP 函数,则定向到 cloudfunctions.net 网址的流量会转到第 2 代函数。您的第 1 代函数会继续存在,但不会接收任何流量。
    • 如果您要升级 Pub/Sub 函数,第 2 代函数触发器会使用相同的 Pub/Sub 主题,但会创建一个新订阅,用于向 Cloud Run 函数发送消息。旧订阅已删除。
  • 第 1 代函数从第 1 代控制台中消失。
  • 如果您运行 gcloud functions describe 命令,则会看到该函数的环境现在为第 2 代。
  • 请注意,在此过渡阶段存在风险,尤其是对于 Pub/Sub 函数:
    • 重复消息:在删除旧订阅之前创建新订阅。在此过渡期间,同一条 Pub/Sub 消息可能会同时发送到旧函数和新函数。
    • 丢失消息:如果您要升级 Pub/Sub 函数,但新函数在流量重定向后无法处理消息,则可能会丢失 Pub/Sub 消息。如果函数已停用重试功能,则尤其如此;详情请参阅升级 Pub/Sub

示例:下表显示了在流量重定向步骤中 HTTP 函数的状态。

函数 处理流量? 在控制台中可见?
原始的第 1 代函数 不会。 不再显示在第 1 代控制台中,但仍然存在。
新第 2 代文案 可以,从 cloudfunctions.net 网址以及 run.app Cloud Run 网址都可以。 可以,Cloud Run 控制台。

回滚流量概览

  • 回滚流量时,升级工具会将第 2 代函数副本中的所有流量回滚到原始第 1 代函数,后者现在会处理所有流量。第 2 代函数仍可用于测试。
  • 如果您要回滚 Pub/Sub 函数,系统会重新创建第 1 代函数订阅,并删除第 2 代函数订阅。
  • 如果您想在回滚流量后继续升级,必须先将流量再次重定向到新的第 2 代函数,然后才能继续。

示例:下表显示了回滚流量后 HTTP 函数的状态。

函数 处理流量? 在控制台中可见?
原始的第 1 代函数 可以。 是,第 1 代控制台。
新第 2 代文案 不会。 不再显示在 Cloud Run 控制台中,但仍存在。

中止概览

在提交之前,您可以随时中止升级。一旦提交,升级便不可逆转。

示例:下表显示了中止升级时 HTTP 函数的状态。

函数 处理流量? 在控制台中可见?
原始的第 1 代函数 可以。 是,第 1 代控制台。
第 2 代文案 不会。 不再显示在 Cloud Run 控制台中,不再存在。

提交概览(不可逆)

  • 提交升级会完成第 1 代函数的升级过程。此操作无法撤消。
  • 临时第 2 代函数会转换为基于 Cloud Run Admin API 的成熟 Cloud Run 函数。
    • 这相当于对第 2 代函数运行 detach 命令detach 命令可将 Cloud Functions v2 函数从其现有的 API 环境中分离出来。
    • 升级后,您只能使用 Cloud Run Admin API 和 Cloud Run 工具与升级后的函数进行交互。
  • 第 1 代函数会被删除,所有流量都会转到升级后的 Cloud Run 函数。

示例:下表显示了提交升级后 HTTP 函数的状态:

函数 处理流量? 在控制台中可见?
基于 Cloud Run Admin API 的新 Cloud Run 函数。 可以,从 cloudfunctions.net 网址以及 run.app Cloud Run 网址都可以。 可以,Cloud Run 控制台。
原始的第 1 代函数 不会。 否,已不存在。
第 2 代文案 不会。 否,已不存在。

测试提示

测试是升级流程中不可或缺的一环。

建议您先在非生产函数上测试升级工具,熟悉该工具。当您熟练掌握此流程并取得持续成功后,就可以开始升级制作功能了。

以下是一些工具和技巧,可用于在升级期间测试函数:

  • 每当函数更改状态时,请使用 Google Cloud CLI describe 命令验证函数是否存在,以及其环境和版本是否符合预期。根据要升级的函数的当前状态,使用以下任一方法

    • Cloud Run:

      gcloud run services describe FUNCTION_NAME --format yaml
      
    • Cloud Functions:

      gcloud functions describe --region REGION_NAME FUNCTION_NAME
      
  • 使用第 1 代 Cloud Functions 控制台和 Cloud Run 控制台中的“日志记录”页面查看函数流量的详细信息。

  • 在升级过程中,使用 Cloud Run 控制台查看并测试第 2 代函数副本:

    • 升级开始后,您可以使用触发器标签页测试第 2 代函数副本。
    • 使用 YAML 标签页查看有关函数的详细信息,包括其 Cloud Run run.app 网址。

准备工作

在开始升级之前,请确保您满足以下前提条件:

  • 您已启用 Cloud Run API:

    gcloud services enable run.googleapis.com
  • 您有现有的第 1 代 HTTP 或 Pub/Sub 函数。

  • 您拥有所需的 IAM 角色:

    • 您必须在函数的服务账号上设置 roles/iam.serviceAccountUser
    • 您必须拥有项目的 roles/cloudfunctions.admin 角色或同等角色才能执行升级。
    • 对于具有 no-retry 设置的 Pub/Sub 函数,您拥有 roles/serviceusage.consumer 角色或具有 serviceusage.services.user 权限的自定义角色。
    • 如需提交 Pub/Sub 函数升级,您必须具有 roles/pubsub.admin 角色。角色 roles/pubsub.admin 是一种项目级角色,可授予对项目内所有 Pub/Sub 资源的管理员权限。

    您可以按如下方式查看函数的 IAM 政策:

    gcloud functions get-iam-policy FUNCTION_NAME
  • 您必须对函数的服务账号拥有 roles/cloudfunctions.admin 权限。如需授予 roles/cloudfunctions.admin 角色,请使用 gcloud functions add-iam-policy-binding 命令,例如:

    gcloud functions add-iam-policy-binding FUNCTION_NAME \
       --region=REGION \
       --member=serviceAccount:SERVICE_ACCOUNT \
       --role="roles/cloudfunctions.admin"
    

    如果您在尝试运行此命令时遇到错误,请确保您的函数符合贵组织的政策。例如,您的组织可能不允许未经身份验证的 HTTP 函数。

如需详细了解成员和角色,请参阅添加主账号并授予角色

升级 HTTP 函数

本部分介绍如何将第 1 代 HTTP 函数升级为 Cloud Run 函数。如需了解如何升级第 1 代 Pub/Sub 函数,请参阅后面的部分

按照以下部分所述重定向流量提交升级后,与原始第 1 代 HTTP 函数关联的 cloudfunctions.net 网址将继续有效,并将流量路由到新的 Cloud Run 函数。

启动 HTTP 函数升级

此步骤会创建第 1 代函数的第 2 代副本。

控制台

  1. 在 Google Cloud 控制台中,前往“函数(第 1 代)”页面:

    前往 Functions(第 1 代)

  2. 找到要升级的第 1 代函数,并确认其在升级状态列中的状态为可升级

  3. 点击函数名称以显示其详情页面。

  4. 在函数详情页面上,点击可升级下的升级

  5. 按照提示开始升级流程。

完成此步骤后,系统会显示升级正在进行中面板,提示您点击前往 Cloud Run 链接以继续升级流程。

gcloud

运行带有 --setup-config 标志的 gcloud beta functions upgrade 命令:

gcloud beta functions upgrade FUNCTION_NAME --setup-config

FUNCTION_NAME 替换为第 1 代函数的名称。

开始升级后:

  • 第 1 代函数会继续处理发送到其原始网址的流量。如需查看此网址,请前往第 1 代 Cloud Functions 控制台中的函数详情页面,然后打开触发器标签页。
  • 系统会创建一个临时第 2 代函数,它是第 1 代函数的副本。它具有与第 1 代函数相同的 cloudfunctions.net 网址,以及新的 Cloud Run run.app 网址。如需查看这两个网址,请前往 Cloud Run 控制台中的函数详情页面,然后打开 YAML 标签页。或者,您也可以使用以下命令:

    gcloud run services describe YOUR_SERVICE_NAME \
        --region YOUR_REGION \
        --format="value(status.url)"
  • 您可以验证第 1 代函数的第 2 代副本是否存在:

    gcloud run services describe FUNCTION_NAME --format yaml
    
  • 您可以验证第 1 代函数环境,其中输出应显示函数环境为 1st gen

    gcloud functions describe --region REGION_NAME FUNCTION_NAME
    

排查“开始升级”步骤

在以下情况下,升级会失败:

  • 同一区域和项目中已存在同名的函数。
  • 第 1 代函数使用已停用的运行时,因此在您使用受支持的运行时重新部署该函数之前,它无法升级。
  • 调用方缺少 cloudfunctions.functions.generationUpgrade 权限。请注意,调用者需要拥有项目的 roles/cloudfunctions.admin 角色或同等角色。

重定向 HTTP 函数的流量

此时,您应测试原始函数及其副本的网址。请确保它们按预期运行,然后再继续。如果遇到问题,请中止升级以返回到干净状态,以便解决第 1 代函数中的任何潜在问题。

重定向步骤会将流量从第 1 代 Cloud Functions 网址重定向到第 2 代函数副本。

控制台

  1. 在 Cloud Run functions 详情页面的升级正在进行中面板中,点击前往 Cloud Run
  2. 点击测试函数以测试函数(可选,但强烈建议执行)。
  3. 准备就绪后,点击重定向流量

gcloud

运行带有 --redirect-traffic 标志的 gcloud beta functions upgrade 命令:

gcloud beta functions upgrade FUNCTION_NAME --redirect-traffic

重定向流量后,第 2 代函数副本会同时通过函数网址 (cloudfunctions.net) 和 Cloud Run 网址 (run.app) 处理流量。

在重定向后测试 HTTP 函数

  • 验证函数环境:

    gcloud functions describe --region REGION_NAME FUNCTION_NAME
    

    输出显示环境为 2nd gen

  • 使用控制台日志记录工具将第 2 代函数副本与原始第 1 代函数进行比较。

排查重定向问题

在以下情况下,重定向会失败:

  • 您未运行上一步 (--setup-config)。

回滚 HTTP 函数的流量

如果您尚未准备好提交升级,可以将流量回滚到第 1 代函数。

控制台

Cloud Run 控制台的 Cloud Run functions 详情页面中,点击升级正在进行中面板中的回滚流量

gcloud

运行带有 --rollback-traffic 标志的 gcloud beta functions upgrade 命令:

gcloud beta functions upgrade FUNCTION_NAME --rollback-traffic

回滚流量后:

  • 第 1 代函数会处理发送到 cloudfunctions.net 网址的流量。
  • 第 2 代函数副本仍可供使用,您可以使用其 run.app 网址触发该函数。

您可以按如下方式验证函数环境。输出应显示函数环境为 1st gen

gcloud functions describe --region REGION_NAME FUNCTION_NAME

如果您尚未将流量重定向到第 2 代函数,回滚会失败。

提交 HTTP 函数的升级

此步骤会完成升级,之后您将无法再中止该流程。在执行此步骤之前,请确保您已全面测试函数。

控制台

Cloud Run 控制台的 Cloud Run functions 详情页面中,点击升级正在进行中面板中的提交升级

gcloud

运行带有 --commit 标志的 gcloud beta functions upgrade 命令:

gcloud beta functions upgrade FUNCTION_NAME --commit

提交升级后:

  • 第 1 代函数会被删除,第 2 代函数副本会被分离,成为成熟的 Cloud Run 函数。
  • Cloud Run function 会保留 cloudfunctions.net 网址以及新的 run.app 网址。
  • 您可以验证第 1 代函数是否不再存在:

    gcloud functions describe --region REGION_NAME FUNCTION_NAME
    
  • 您可以验证 Cloud Run 服务详情:

    gcloud run services describe FUNCTION_NAME --format yaml
    

输出结果显示已创建新代,并且 Goog-managed-by 标签的值为空。

如果流量尚未重定向到 Cloud Run 函数,提交会失败。

升级 Pub/Sub 函数

本部分介绍了如何将第 1 代 Pub/Sub 函数升级为 Cloud Run 函数。

升级第 1 代 Pub/Sub 函数的过程与升级 HTTP 函数的基本模式相同,但还有一些额外的注意事项:

  • 停用“在失败时重试”功能不是 Cloud Run 支持的功能,但它是第 1 代的默认设置。因此,您可能同时拥有这两种类型的函数。升级工具执行的操作取决于此设置:

    • 如果第 1 代函数已停用重试功能(第 1 代函数的默认设置),升级工具会创建 Eventarc Pub/Sub 触发器以及死信队列 (DLQ)。升级工具会为订阅及其主题设置 Identity and Access Management (IAM) 政策。升级完成后,死信队列主题会存储未传送的消息,您可以通过创建对该死信队列的新订阅来检索这些消息。
    • 如果第 1 代函数已启用重试,升级工具会创建具有默认设置的 Eventarc Pub/Sub 触发器。

开始升级 Pub/Sub 函数

此步骤会创建第 1 代函数的第 2 代副本。

控制台

  1. 在 Google Cloud 控制台中,前往 Cloud Functions(第 1 代)页面:

    前往 Functions(第 1 代)

  2. 找到要升级的第 1 代函数,并确认其在升级状态列中的状态为可升级

  3. 点击函数名称以显示其详情页面。

  4. 在函数详情页面上,点击可升级下的升级

此阶段完成后,系统会显示正在升级面板,提示您点击前往 Cloud Run 链接以继续升级流程。

gcloud

运行带有 --setup-config 标志的 gcloud beta functions upgrade 命令:

gcloud beta functions upgrade FUNCTION_NAME --setup-config

FUNCTION_NAME 替换为第 1 代函数的名称。

(可选)为触发器指定服务账号:

gcloud beta functions upgrade FUNCTION_NAME --setup-config --trigger-service-account=CUSTOM_SA_EMAIL

CUSTOM_SA_EMAIL 替换为您的自定义服务账号的电子邮件地址。

如果触发服务账号(默认 Compute Engine 服务账号或指定的自定义服务账号)缺少 run.route.invoke 权限,系统会提示您绑定 roles/run.invoker 角色。

开始升级后:

  • 第 1 代函数会继续处理发送到其原始网址的流量。
  • 系统会创建第 1 代函数的第 2 代副本。您可以使用其 Cloud Run 网址触发该工作流。
  • 第 1 代函数会继续处理发送到其 cloudfunctions.net 网址的流量。

在启动升级步骤后测试 Pub/Sub 函数

  • 您可以验证第 1 代函数的第 2 代副本是否存在:

    gcloud run services describe FUNCTION_NAME --format yaml
    
  • 您可以验证第 1 代函数环境,其中输出应显示函数环境为 1st gen

    gcloud functions describe --region REGION_NAME FUNCTION_NAME
    
  • 向目标主题发布消息以触发第 1 代函数。

  • 如需测试新函数,请向其添加 Pub/Sub 触发器,并确认该函数按预期响应触发器:

    1. 在 Cloud Run 控制台中选择相应函数,然后打开触发器标签页。
    2. 点击添加触发器,然后在 Eventarc 触发器面板中,选择一个用于触发该函数的主题。默认情况下,当有消息发布到主题时,系统会触发该函数。
    3. 正在升级面板中,点击测试函数
    4. 在打开的 Cloud Code for Cloud Shell 窗口中,向您在触发器标签页中添加的主题发布消息。
    5. 在 Cloud Run 控制台中,前往可观测性 > 日志,确认您的函数已发布消息。或者,您也可以使用 Cloud Shell 版 Cloud Code 中的命令行查看日志记录输出。

    例如,假设您有一个发布问候语的基本 Hello World 函数。指定新触发器后,您可以在 Cloud Code for Cloud Shell 中对其进行测试,如下所示:

    gcloud pubsub topics publish YOUR_TOPIC_NAME --message YOUR_NAME
    gcloud functions logs read --region YOUR_REGION --limit 50
    

排查 Pub/Sub 启动升级步骤

在以下情况下,升级会失败:

  • 同一区域和项目中已存在同名的 Cloud Run 函数。
  • 您尝试升级第 2 代函数。
  • 第 1 代函数已在进行升级流程。
  • 第 1 代函数不存在。
  • 第 1 代函数处于错误状态。
  • 第 1 代函数既不是 HTTP 函数,也不是 Pub/Sub 函数。
  • 调用方缺少 cloudfunctions.functions.generationUpgrade 权限。请注意,调用者需要拥有项目的 roles/cloudfunctions.admin 角色或同等角色。

重定向 Pub/Sub 函数的流量

此步骤会将流量从第 1 代 Cloud Functions 网址重定向到第 2 代函数副本。

控制台

  1. 在 Cloud Run functions 详情页面的升级正在进行中面板中,点击前往 Cloud Run
  2. 点击测试函数以测试函数(可选,但强烈建议执行)。
  3. 准备就绪后,点击重定向流量

gcloud

运行带有 --redirect-traffic 标志的 gcloud beta functions upgrade 命令:

gcloud beta functions upgrade FUNCTION_NAME --redirect-traffic

重定向流量后,第 2 代函数会同时通过 Cloud Functions 网址和 Cloud Run 网址处理流量。

在重定向流量后测试 Pub/Sub

  • 您可以验证函数环境:

    gcloud functions describe --region REGION_NAME FUNCTION_NAME
    

    输出显示环境为 2nd gen

    • eventTrigger.retryPolicy 与函数创建期间指定的重试政策相匹配。
    • eventTrigger.serviceAccountEmail 是默认的 Compute Engine 服务账号或指定的自定义服务账号。
    • 现在,向目标主题发布消息会触发第 2 代函数复制。

排查 Pub/Sub 重定向问题

在以下情况下,重定向会失败:

  • 您未运行上一步 (--setup-config)。
  • Cloud Run functions 函数已被手动删除。

回滚 Pub/Sub 函数的流量

此步骤会将流量恢复到第 1 代函数。

控制台

在 Cloud Run functions 详情页面的正在升级面板中,点击回滚流量

gcloud

运行带有 --rollback-traffic 标志的 gcloud beta functions upgrade 命令:

gcloud beta functions upgrade FUNCTION_NAME --rollback-traffic

回滚流量后:

  • 该函数会恢复到初始升级步骤完成后的状态。
  • 第 1 代函数会处理发送到 cloudfunctions.net 网址的流量。
  • 第 2 代副本仍可供使用,您可以使用其 Cloud Run 网址触发该副本。

  • 您可以验证函数环境:

    gcloud functions describe --region REGION_NAME FUNCTION_NAME
    

    输出应显示函数环境为 1st gen

  • 向目标主题发布消息会触发第一代函数。

如果您尚未将流量重定向到 Cloud Run 函数,回滚会失败。

提交 Pub/Sub 函数的升级

此步骤会完成升级,之后您将无法再中止该流程。此步骤无法撤消。 在执行此步骤之前,请确保您已全面测试函数。

控制台

在 Cloud Run functions 详情页面的升级正在进行中面板中,点击提交升级

gcloud

运行带有 --commit 标志的 gcloud beta functions upgrade 命令:

gcloud beta functions upgrade FUNCTION_NAME --commit

提交升级后:

  • 第 1 代函数已被删除。
  • Cloud Run 函数会保留 cloudfunctions.net 网址。
  • 您可以验证该函数是否不再显示在列表中:
    gcloud functions describe --region REGION_NAME FUNCTION_NAME
    
  • 您可以验证 Cloud Run 服务详情:
    gcloud run services describe FUNCTION_NAME --format yaml
    
    • 输出结果显示已创建新一代。Goog-managed-by 标签的值应为空。
  • 如果您在创建第 1 代函数时未勾选失败时重试,则触发器的 Pub/Sub 订阅将具有死信队列 (DLQ)。
  • 现在,向目标主题发布消息会触发 Cloud Run 函数。

在以下情况下,提交会失败:

  • 流量尚未重定向到 Cloud Run 函数。
  • Cloud Run functions 函数已被手动删除。

中止升级

此操作会取消升级流程。新的第 2 代函数副本会被删除,第 1 代函数会继续处理发送到原始 cloudfunctions.net 网址的流量。您可以在升级过程中的任何时间执行此操作,但必须在提交升级之前执行。

如果您使用 Google Cloud 控制台执行升级,则界面仅允许您在初始升级操作后立即中止该过程。中止按钮位于 Functions(第 1 代)控制台的左上角。如果您使用的是 Google Cloud CLI,可以在提交升级之前的任何时间中止升级,之后该流程将不可逆。

即使您使用 Google Cloud 控制台执行升级流程,也可以使用 Google Cloud CLI 中止函数升级:

gcloud beta functions upgrade FUNCTION_NAME --abort

中止升级后:

  • 第 2 代函数副本已被删除。
  • 第 1 代函数会处理发送到 cloudfunctions.net 网址的流量。
  • Google Cloud 控制台中,函数的升级状态从已复制配置变回准备升级
  • 您可以验证 Cloud Run 服务是否不再显示在列表中:

    gcloud run services list
  • 您可以验证函数环境:

    gcloud functions describe --region REGION_NAME FUNCTION_NAME
    

输出显示函数环境为 1st gen

如果您已提交升级,则中止操作会失败。

检查转换后的 IAM 政策

在升级过程中,该工具会尽最大努力在第 1 代 Cloud Functions 和新的 Cloud Run functions 之间转换角色和权限。

升级过程会将第 1 代 Cloud Functions IAM 角色转换为等效的 Cloud Run 角色。

转化规则

  • roles/cloudfunctions.invoker 转换为 roles/run.invoker
  • roles/cloudfunctions.developer 转换为 roles/run.sourceDeveloper
  • roles/cloudfunctions.viewer 转换为 roles/run.sourceViewer
  • roles/cloudfunctions.admin 转换为 roles/run.adminroles/run.sourceDeveloper

如果调用者缺少 projects.getIamPolicyrun.setIamPolicy 权限,则 IAM 政策升级会失败。调用者需要具有项目的 roles/cloudfunctions.admin 角色或等效角色。

验证 IAM 政策升级

如需验证您的 IAM 政策是否已正确升级,请在升级过程的每个阶段检查这些政策,以确认它们是否具有预期值:

  1. 开始升级函数:

    gcloud beta functions upgrade FUNCTION_NAME --setup-config
    

    如果检测到自定义角色绑定,输出会显示一条警告消息。

  2. 验证为第 1 代函数设置的 IAM 政策是否已转换为 Cloud Run 函数并升级:

    gcloud functions get-iam-policy FUNCTION_NAME
    gcloud run services get-iam-policy FUNCTION_NAME
    
  3. 验证项目级 Cloud Run functions 调用者角色绑定是否已转换为 Cloud Run function 并升级:

    gcloud projects get-iam-policy PROJECT_ID | grep "roles/cloudfunctions.invoker"
    gcloud run services get-iam-policy FUNCTION_NAME
    

后续步骤