从 App Engine Images 服务迁移到 Cloud Run

区域 ID

REGION_ID 是 Google 根据您在创建应用时选择的区域分配的缩写代码。此代码不对应于国家/地区或省,尽管某些区域 ID 可能类似于常用国家/地区代码和省代码。对于 2020 年 2 月以后创建的应用,REGION_ID.r 包含在 App Engine 网址中。对于在此日期之前创建的现有应用,网址中的区域 ID 是可选的。

详细了解区域 ID。

如需对现有 App Engine 应用中的图像处理进行现代化改造,您可以 将容器化的图像转换服务部署到 Cloud Run,并将 App Engine Images service 服务调用路由到该服务。

此迁移不需要对图像处理代码进行重大重写,也不需要在 Cloud Run 上托管 App Engine 应用。相反,当您配置应用时,App Engine 服务 SDK 会拦截 App Engine Images 服务调用,并将其路由到 Cloud Run 服务。该服务通过 gRPC 使用开源 Pillow 引擎处理图像,并将结果返回给 App Engine 应用。此设置会将旧版 App Engine Images 服务后端替换为现代化的云原生解决方案。

限制

  • 使用自定义图像处理服务时,您无法生成传送网址。当您调用 get_serving_url() 方法时,App Engine 会抛出运行时异常。此限制可防止依赖旧版后端来存储和传送图像。

    如需传送图像,我们建议您直接从 Cloud Storage 网址传送图像,或者使用由 Cloud CDN 提供支持的 Cloud Storage 存储桶,具体取决于您的应用要求。

    您通过使用对 get_serving_url() 方法的旧版调用创建的现有网址会继续传送图像。

  • 升级 App Engine 服务 SDK 版本时,App Engine 不会自动将 App Engine 调用路由到 Cloud Run 服务。只有在您配置迁移环境变量 APPENGINE_USE_CUSTOM_IMAGES_GRPC_SERVICEAPPENGINE_IMAGES_SERVICE_ENDPOINT 后,应用才会应用新行为。

准备工作

  1. 确保您有权访问 App Engine 源代码。

  2. 启用 Cloud Run Admin API 和 Artifact Registry API:

    启用 API

所需的角色

您可以选择创建新的服务帐号,也可以在 Cloud Run 中使用您用于 App Engine 的用户代管式服务账号。 您或您的管理员必须为部署者账号和 Cloud Build 服务帐号授予以下 IAM 角色。

点击可查看部署者账号所需的角色

如需获得从来源进行构建和部署所需的权限,请让管理员向您授予以下 IAM 角色:

点击可查看 Cloud Build 服务账号需要的角色

除非您替换此行为,否则 Cloud Build 会自动使用 Compute Engine 默认服务账号作为默认 Cloud Build 服务账号来构建源代码和 Cloud Run 资源。为了让 Cloud Build 能够构建来源,请让管理员向项目的 Compute Engine 默认服务账号授予 Cloud Run Builder (roles/run.builder):

  gcloud projects add-iam-policy-binding PROJECT_ID \
      --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \
      --role=roles/run.builder
  

PROJECT_NUMBER 替换为您的 Google Cloud项目编号,将 PROJECT_ID 替换为您的 Google Cloud项目 ID。如需详细了解如何查找项目 ID 和项目编号,请参阅创建和管理项目

向 Compute Engine 默认服务账号授予 Cloud Run Builder 角色需要几分钟时间才能传播

如需查看与 Cloud Run 关联的 IAM 角色和权限的列表,请参阅 Cloud Run IAM 角色Cloud Run IAM 权限。如果您的 Cloud Run 服务与Google Cloud API(例如 Cloud 客户端库)进行交互,请参阅服务身份配置指南。如需详细了解如何授予角色,请参阅 部署权限管理访问权限

迁移过程

此迁移包括以下步骤:

  1. 在 Cloud Run上部署图像转换服务以获取服务网址。
  2. 使用 Cloud Run 服务网址和路由标志配置 App Engine 源文件,然后部署或 重新部署 App Engine 应用。
  3. 测试应用,以检查图像处理功能。

在 Cloud Run 上部署图像转换服务

如需部署图像转换服务并配置其对 Cloud Storage 的访问权限,请按照以下步骤操作:

  1. 将预构建的图像转换服务容器部署到 Cloud Run 服务。请务必在强制执行身份验证的情况下进行部署 (--no-allow-unauthenticated)。App Engine 服务 SDK 在调用此服务时会处理身份验证:

    gcloud run deploy image-processing-service \
        --image=us-central1-docker.pkg.dev/gae-bundled-services-images/image-processing-service-staging/image-processing-service:public-image-d476f7ef9d1b \
        --no-allow-unauthenticated \
        --region=REGION
    

    REGION 替换为您要在其中部署 Cloud Run 服务的区域。我们建议您在与 App Engine 服务相同的区域中部署该服务。

    记下已部署的 Cloud Run 服务的服务网址,例如 https://image-processing-service-xyz-uc.a.run.app

  2. 向默认 App Engine 服务帐号授予 Cloud Run Invoker (roles/run.invoker) 角色。这样,您的 App Engine 应用就可以授权调用私有 Cloud Run 服务并将其路由到该服务:

    gcloud run services add-iam-policy-binding image-processing-service \
        --member="serviceAccount:PROJECT_ID@appspot.gserviceaccount.com" \
        --role="roles/run.invoker" \
        --region=REGION
    
  3. 向默认 Compute Engine 服务 账号授予 Cloud Storage Object Viewer (roles/storage.objectViewer) 角色。这样,图像转换服务就可以读取存储在 Cloud Storage 中的图像:

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member="serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com" \
        --role="roles/storage.objectViewer"
    

    替换以下内容:

    • PROJECT_ID:您要在其中部署 Cloud Run 服务的项目的 ID。
    • PROJECT_NUMBER:您要在其中部署 Cloud Run 服务的项目的项目编号。

配置源文件

如需将 Python 应用配置为使用 Cloud Run 上的图像转换服务,请按照以下步骤操作:

  1. 将以下依赖项添加到您的 requirements.txt 文件中:

    appengine-python-standard>=3.0.0b0
    

    或者,如需在本地安装依赖项,请运行以下命令:

    pip install --pre "appengine-python-standard>=3.0.0b0"
    
  2. 更新 app.yaml 文件以启用 API 代理并配置所需的环境变量:

    runtime: RUNTIME  # a supported python version
    
    # List the Images service
    app_engine_bundled_services:
    - images
    
    env_variables:
      # Enable the custom gRPC Images service
      APPENGINE_USE_CUSTOM_IMAGES_GRPC_SERVICE: "true"
    
      # The URL of the Cloud Run service you deployed
      APPENGINE_IMAGES_SERVICE_ENDPOINT: "RUN_SERVICE_URL"
    

    替换以下内容:

    • RUNTIME:受支持的 Python 运行时版本。
    • RUN_SERVICE_URL:已部署的 Cloud Run 服务的网址。
  3. 将应用部署到 App Engine:

    gcloud app deploy
    

    您的 App Engine 服务部署在 https://PROJECT_ID.REGION_ID.r.appspot.com

  4. 启动浏览器,然后运行以下命令以访问您的 Web 服务:

    gcloud app browse
    

测试您的应用

如需验证您的应用是否成功使用 Cloud Run 图像转换服务,请执行以下操作:

  1. 触发应用中的图像处理功能。
  2. 检查 App Engine 应用的日志浏览器。确保没有与 google.appengine.api.images 调用相关的错误。
  3. 检查 Cloud Run image-processing-service 的日志,以验证 Cloud Run 是否收到并处理了请求。

后续步骤