将 App Engine 柔性环境应用迁移到 Cloud Run

区域 ID

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

详细了解区域 ID

本指南介绍如何迁移使用公共 IP 连接到 Cloud SQL 实例的现有 App Engine 应用。

通常,本指南中的步骤演示了如何在 Cloud Run 中部署相同的应用源代码,然后将其配置为使用相同的 Cloud SQL 数据库用户连接现有实例和数据库。

本指南中的步骤不包括如何使用内部专用 IP 连接,因为这需要您先修改应用代码。但是,将应用部署到 Cloud Run 后,您可以按照从 Cloud Run 连接到 Cloud SQL 中的步骤了解要求以及如何使用专用 IP。

如需详细了解 App Engine 和 Cloud Run 之间的异同,包括迁移到 Cloud Run 的优势,请参阅比较摘要

须知事项

  1. 确保 Cloud Run 满足您的应用要求。查看 App Engine 和 Cloud Run 比较,确定 CPU 和内存等 Cloud Run 资源是否满足您的需求。
  2. 本指南假定您的应用可以正常运行,未发生错误。

  3. 您需要有权访问 Cloud SQL 实例,包括用于连接应用的数据库用户名和密码。 Cloud Run 使用加密功能,并使用 Unix 套接字或 Cloud SQL 连接器通过 Cloud SQL Auth 代理进行连接。

  4. 查看以下 Cloud Run 差异:

    • 每次将更改部署到特定服务时,Cloud Run 都会使用 Revision 而不是 Version 一词来表示。首次将应用部署到 Cloud Run 中的服务会创建其第一个修订版本。服务的每个后续部署都会创建其他修订版本。详细了解如何部署到 Cloud Run

    • 您可以使用 Google Cloud CLI 或 Google Cloud 控制台将源代码部署到 Cloud Run 来配置和管理应用设置。Cloud Run 不需要基于文件的配置,但 YAML 配置受支持,您可以使用 app2run 工具转换 Cloud Run 的现有 App Engine 文件。

    • 您部署到 Cloud Run 的每项服务都使用网址中的 run.app 网域来公开访问服务。

    • 与默认为公开的 App Engine 服务不同,Cloud Run 服务默认为专用,并要求您将其配置为允许公开(未经身份验证)访问。

将应用迁移到 Cloud Run

概括来讲,将 App Engine 应用迁移到 Cloud Run 的过程包括以下步骤:

  1. 启用所需的 API
  2. 配置 Cloud Run 服务账号
  3. 在 Cloud Run 中部署应用

启用所需的 API

您必须先启用 Cloud Run API 和 Artifact Registry API,然后才能将应用部署到 Cloud Run。

使用 Google Cloud 控制台启用 API:

转到“API 和服务”

配置 Cloud Run 服务账号

您可以选择创建新的服务账号,也可以继续在 Cloud Run 中使用您用于 App Engine 的用户管理的服务账号。在服务账号中,您必须确保配置以下 Identity and Access Management (IAM) 角色或等效权限:

如需部署到 Cloud Run,您必须拥有以下各项之一:

  • Owner
  • Editor
  • Cloud Run Admin 和 Service Account User 角色
  • 等效的 Cloud Run 权限

对于与 Cloud SQL 的公共 IP 连接,您必须拥有以下各项之一:

在 Cloud Run 中部署应用

您无需做出任何代码更改即可将 App Engine 应用部署到 Cloud Run。

在以下步骤中,您会将应用部署到 Cloud Run 中的新服务,同时配置该服务以连接到 Cloud SQL。

与 App Engine 柔性环境一样,Cloud Run 同时支持基于容器和基于来源的部署。您需要有权访问容器映像或源代码库,具体取决于您遵循的部署方法。

部署容器映像

如果 App Engine 服务是使用手动构建的容器部署的,则您可以使用同一容器映像将服务部署到 Cloud Run。 如需将 App Engine 容器映像部署到 Cloud Run,请执行以下操作:

  1. 记下容器映像所在的仓库网址。此网址与您在 App Engine 上部署时在 --image-url 标志中提供的网址相同。

  2. 部署容器映像:

    控制台

    1. 在 Google Cloud 控制台中,转到 Cloud Run 页面。

      前往 Cloud Run

    2. 点击创建服务

    3. 点击容器映像网址字段中的选择按钮,然后选择您为 App Engine 部署的容器映像。

    4. 输入服务的名称。选择代表您要部署的应用的唯一名称。

    5. 身份验证部分中,选择允许未通过身份验证的调用

    6. 您必须为 Cloud Run 创建在 App Engine 应用的 app.yaml 文件中定义的环境变量。展开容器、网络、安全部分,然后通过点击环境变量下的添加变量来创建以下环境变量:

      • 对于 Unix 套接字,请添加以下内容:

          INSTANCE_UNIX_SOCKET: /cloudsql/INSTANCE_CONNECTION_NAME
        
      • 对于 Cloud SQL 连接器,请添加以下内容:

          INSTANCE_CONNECTION_NAME:INSTANCE_CONNECTION_NAME
        

        INSTANCE_CONNECTION_NAME 替换为您的项目 ID、区域和实例,遵循 project:region:instance-id 格式。您可以在 Google Cloud 控制台中的实例概览页面上找到它。

        这些连接会自动加密,无需任何额外配置。

      • DB_NAME:您的数据库的名称。

      • DB_USER:您的数据库用户的用户名。

      • DB_PASS:您在创建数据库时指定的密码。

    7. Cloud SQL 连接部分中,点击添加连接按钮,然后选择您之前为 App Engine 创建的实例。

    8. 点击部署。 在部署 Cloud Run 服务之后,服务详情页面顶部会显示网址。点击网址链接,以查看 Cloud Run 上连接到 Cloud SQL 的已部署应用。

    gcloud

    运行以下命令以在 Cloud Run 中创建新服务。您必须设置配置标志,使其包含在 App Engine 应用的 app.yaml 文件中定义的 SQL 连接环境变量:

    gcloud run deploy run-sql --image IMAGE \
      --allow-unauthenticated \
      --add-cloudsql-instances INSTANCE_CONNECTION_NAME\
      --set-env-vars INSTANCE_UNIX_SOCKET="/cloudsql/INSTANCE_CONNECTION_NAME" \
      --set-env-vars INSTANCE_CONNECTION_NAME="INSTANCE_CONNECTION_NAME" \
      --set-env-vars DB_NAME="DB_NAME" \
      --set-env-vars DB_USER="DB_USER" \
      --set-env-vars DB_PASS="DB_PASS"
    

    您需要将其中的:

    • IMAGE 替换为您要部署的映像
    • INSTANCE_CONNECTION_NAME 替换为 Cloud SQL 实例的实例连接名称,或以英文逗号分隔的连接名称列表。您可以通过运行以下命令找到 INSTANCE_CONNECTION_NAME

        gcloud instances describe INSTANCE_NAME
      
    • DB_NAME 替换为您的数据库的名称。

    • DB_USER 替换为您的数据库的用户名。

    • DB_PASS 替换为您的数据库用户的密码。

部署源代码

Cloud Run 在内部使用 buildpackCloud Build 从源代码自动构建容器映像,您无需手动构建容器或指定 Dockerfile。但是,如果存在 Dockerfile,则系统将使用它。

从源代码部署 Cloud Run 服务使用 Artifact Registry,因此此功能仅在 Artifact Registry 支持的区域中提供。

如需部署您之前部署到 App Engine 的源代码,请执行以下操作:

  1. 切换到应用的源代码所在的源目录。

      cd YOUR_APPENGINE_CODE_DIR
    
  2. 部署到 Cloud Run。

    如需构建源代码并部署应用,请在运行部署命令时使用 --source 标志。您必须设置配置标志,使其包含在 App Engine 应用的 app.yaml 文件中定义的 SQL 连接环境变量:

      gcloud run deploy run-sql --source SOURCE \
        --allow-unauthenticated \
        --add-cloudsql-instances INSTANCE_CONNECTION_NAME\
        --set-env-vars INSTANCE_UNIX_SOCKET="/cloudsql/INSTANCE_CONNECTION_NAME" \
        --set-env-vars INSTANCE_CONNECTION_NAME="INSTANCE_CONNECTION_NAME" \
        --set-env-vars DB_NAME="DB_NAME" \
        --set-env-vars DB_USER="DB_USER" \
        --set-env-vars DB_PASS="DB_PASS"
    

    您需要将其中的:

    • SOURCE 替换为 App Engine 源目录的路径
    • INSTANCE_CONNECTION_NAME 替换为 Cloud SQL 实例的实例连接名称,或以英文逗号分隔的连接名称列表。 您可以通过运行以下命令找到 INSTANCE_CONNECTION_NAME
        gcloud instances describe INSTANCE_NAME
    
    • DB_NAME 替换为您的数据库的名称。
    • DB_USER 替换为您的数据库的用户名。
    • DB_PASS 替换为您的数据库用户的密码。
  3. 当系统现提示时,输入 SERVICE 的名称。

  4. 在系统提示时通过响应 y 来响应任何提示,以安装所需 API。您只需为项目执行一次此操作。 等待构建和部署完成。完成后,系统会显示如下所示的消息:

    Service [my-app] revision [my-app-00000-xxx] has been deployed and is serving 100 percent of traffic. Service URL: https://sample.run.app
    

    如需详细了解如何将源代码部署到 Cloud Run,请参阅从源代码部署

后续步骤