如需对现有 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_SERVICE和APPENGINE_IMAGES_SERVICE_ENDPOINT后,应用才会应用新行为。
准备工作
确保您有权访问 App Engine 源代码。
启用 Cloud Run Admin API 和 Artifact Registry API:
所需的角色
您可以选择创建新的服务帐号,也可以在 Cloud Run 中使用您用于 App Engine 的用户代管式服务账号。 您或您的管理员必须为部署者账号和 Cloud Build 服务帐号授予以下 IAM 角色。
点击可查看部署者账号所需的角色
如需获得从来源进行构建和部署所需的权限,请让管理员向您授予以下 IAM 角色:
- 针对项目的 Cloud Run Source Developer (
roles/run.sourceDeveloper) - 针对项目的 Service Usage Consumer (
roles/serviceusage.serviceUsageConsumer) - 针对 Cloud Run 服务身份的 Service Account User (
roles/iam.serviceAccountUser)
点击可查看 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 客户端库)进行交互,请参阅服务身份配置指南。如需详细了解如何授予角色,请参阅 部署权限 和管理访问权限。
迁移过程
此迁移包括以下步骤:
- 在 Cloud Run上部署图像转换服务以获取服务网址。
- 使用 Cloud Run 服务网址和路由标志配置 App Engine 源文件,然后部署或 重新部署 App Engine 应用。
- 测试应用,以检查图像处理功能。
在 Cloud Run 上部署图像转换服务
如需部署图像转换服务并配置其对 Cloud Storage 的访问权限,请按照以下步骤操作:
将预构建的图像转换服务容器部署到 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。向默认 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向默认 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 上的图像转换服务,请按照以下步骤操作:
将以下依赖项添加到您的
requirements.txt文件中:appengine-python-standard>=3.0.0b0或者,如需在本地安装依赖项,请运行以下命令:
pip install --pre "appengine-python-standard>=3.0.0b0"更新
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 服务的网址。
将应用部署到 App Engine:
gcloud app deploy您的 App Engine 服务部署在
https://PROJECT_ID.REGION_ID.r.appspot.com。启动浏览器,然后运行以下命令以访问您的 Web 服务:
gcloud app browse
测试您的应用
如需验证您的应用是否成功使用 Cloud Run 图像转换服务,请执行以下操作:
- 触发应用中的图像处理功能。
- 检查 App Engine 应用的日志浏览器。确保没有与
google.appengine.api.images调用相关的错误。 - 检查 Cloud Run
image-processing-service的日志,以验证 Cloud Run 是否收到并处理了请求。