快速启动解决方案:使用无服务器计算的电子商务平台

Last reviewed 2023-08-24 UTC

本指南可帮助您了解、部署和使用使用无服务器计算的电子商务平台解决方案。此解决方案演示了如何为一家零售企业构建和运行电子商务应用,以提供一个可公开访问的网店网站。您将了解如何创建一个可通过扩容来处理用量高峰(例如在季节性促销等峰值事件期间)的应用,该应用还可以根据访问者的地理位置管理请求。这种设计有助于网店为分布在不同地理位置的客户提供一致的服务。

如果您想要了解如何使用无服务器功能部署可扩缩的电子商务 Web 应用,此解决方案是一个很好的起点。如果您想要精细的运营控制,请查看在 Kubernetes 上部署电子商务 Web 应用解决方案。

本文档假定您熟悉基本的云概念,但不一定熟悉 Google Cloud。拥有 Terraform 经验会很有帮助。

目标

本解决方案指南可帮助您执行以下操作:

  • 了解如何为电子商务网站设计系统架构。
  • 优化电子商务网站的性能、扩缩能力和响应速度。
  • 监控和预测负载限制。
  • 使用跟踪和错误报告来了解和管理问题。

产品

此解决方案使用以下 Google Cloud 产品:

  • Cloud Run:这是一项全托管式服务,可让您构建和部署无服务器容器化应用。Google Cloud 负责处理扩缩任务和其他基础架构任务,以便您可以专注于代码的业务逻辑。
  • Cloud SQL:这是一个基于云端的 PostgreSQL 数据库,完全托管在 Google Cloud 基础架构上。
  • Secret Manager:该服务可让您将密钥以二进制 blob 或文本字符串的形式进行存储、管理和访问。您可以使用 Secret Manager 存储应用在运行时需要的数据库密码、API 密钥或 TLS 证书。
  • Cloud Storage:这是一种企业级服务,为各种数据类型提供费用低廉、不受限制的对象存储。可从 Google Cloud 内部和外部访问数据,并以地理位置冗余方式复制数据。
  • Firebase Hosting:这是一种全托管式托管服务,用于部署和提供您的 Web 应用和静态内容。
  • Cloud Logging:此服务可让您存储、搜索、分析、监控来自 Google Cloud 和其他云环境的日志记录数据和事件,并向您发送相关提醒。
  • Cloud Trace:Google Cloud 的分布式跟踪系统,可帮助您了解应用处理来自用户或其他应用的传入请求所需的时间,以及完成处理请求时执行的操作(例如 RPC 调用)所需的时间。
  • Error Reporting:此服务汇总并显示正在运行的云服务中产生的错误。Error Reporting 会将根本原因相同的错误分组在一起。

架构

下图展示了该解决方案的架构:

使用 Cloud Run 部署的电子商务 Web 应用

请求流程

以下是电子商务平台的请求处理流程。流程中的步骤在前面的架构图中进行了编号。

  1. Firebase Hosting 客户端前端。前端使用 Lit 和 Web 组件在客户端呈现 API 数据。
  2. Web 客户端调用作为 Cloud Run 服务运行的 API 后端。Cloud Run API 服务器使用 Django REST 框架Django 编写。
  3. Python 应用的配置和其他密钥存储在 Secrets Manager 中。
  4. 应用的静态资产存储在 Cloud Storage 中。
  5. 使用 PostgreSQL 的 Cloud SQL 数据库用作 Python 应用的关系型数据库后端。
  6. Cloud Logging、Cloud Trace 和 Error Reporting 存储其他云产品和 Cloud Run API 服务器发送的日志、OpenTelemetry 跟踪记录和错误报告。这些数据可用于监控正确的应用行为,以及对意外行为进行问题排查。

费用

如需估算“使用无服务器计算的电子商务平台”解决方案所用的 Google Cloud 资源的费用,请参阅 Google Cloud 价格计算器中预先计算的估算值。

使用估算值作为起点来计算部署费用。您可以修改估算值,以反映您计划对解决方案中使用的资源进行的任何配置更改。

系统会基于某些因素(包括以下因素)做出预先计算的估算:

  • 部署资源的 Google Cloud 位置。
  • 资源的使用时间。

准备工作

如需部署此解决方案,您首先需要一个 Google Cloud 项目和一些 IAM 权限。

创建或选择 Google Cloud 项目

部署解决方案时,您需要选择部署资源的 Google Cloud 项目。您可以创建一个新项目或使用现有项目进行部署。

如果您要创建新项目,请在开始部署之前执行此操作。使用新项目有助于避免与先前预配的资源(例如用于生产工作负载的资源)发生冲突。

如需创建项目,请完成以下步骤:

  1. In the Google Cloud console, go to the project selector page.

    Go to project selector

  2. Click Create project.

  3. Name your project. Make a note of your generated project ID.

  4. Edit the other fields as needed.

  5. Click Create.

获取所需的 IAM 权限

如需开始部署过程,您需要下表中列出的 Identity and Access Management (IAM) 权限。

如果您为此解决方案创建了新项目,则您在该项目中拥有 roles/owner 基本角色,并拥有所有必要的权限。如果您没有 roles/owner 角色,请让管理员授予您这些权限(或包含这些权限的角色)。

所需的 IAM 权限 包含所需权限的预定义角色

serviceusage.services.enable

Service Usage Admin
(roles/serviceusage.serviceUsageAdmin)

iam.serviceAccounts.create

Service Account Admin
(roles/iam.serviceAccountAdmin)

resourcemanager.projects.setIamPolicy

Project IAM Admin
(roles/resourcemanager.projectIamAdmin)
config.deployments.create
config.deployments.list
Cloud Infrastructure Manager Admin
(roles/config.admin)
iam.serviceAccount.actAs Service Account User
(roles/iam.serviceAccountUser)

关于临时服务账号权限

如果您通过控制台启动部署过程,则 Google 会创建一个服务账号,用于代表您部署解决方案(以及稍后删除部署)。系统会临时为此服务账号分配某些 IAM 权限;也就是说,在解决方案部署和删除操作完成后,会自动撤消这些权限。Google 建议您在删除部署后删除服务账号,如本指南后面部分所述。

查看分配给服务账号的角色

此处列出了这些角色,以防 Google Cloud 项目或组织的管理员需要此信息。

部署解决方案

为了减少您部署此解决方案所需的工作量,GitHub 中提供了 Terraform 配置。Terraform 配置定义了解决方案需要的所有 Google Cloud 资源。

您可以使用以下任一方法来部署解决方案:

  • 通过控制台:如果您要试用采用默认配置的解决方案并了解其工作原理,请使用此方法。Cloud Build 会部署此解决方案需要的所有资源。如果您不再需要部署的解决方案,可以通过控制台将其删除。您在部署解决方案后创建的任何资源都可能需要单独删除。

    如需使用此部署方法,请按照通过控制台进行部署中的说明操作。

  • 使用 Terraform CLI:如果您要自定义解决方案,或者要使用基础架构即代码 (IaC) 方法自动预配和管理资源,请使用此方法。从 GitHub 下载 Terraform 配置,根据需要选择性地自定义代码,然后使用 Terraform CLI 部署解决方案。部署解决方案后,您可以继续使用 Terraform 来管理解决方案。

    如需使用此部署方法,请按照使用 Terraform CLI 进行部署中的说明操作。

通过控制台进行部署

完成以下步骤以部署预配置的解决方案。

  1. 在 Google Cloud 快速起步解决方案目录中,打开使用无服务器计算的电子商务平台解决方案。

    打开“使用无服务器计算的电子商务平台”解决方案

  2. 查看页面上提供的信息,例如解决方案的预计费用和预计部署时间。

  3. 准备好开始部署解决方案后,请点击部署

    此时会显示分步配置窗格。

  4. 完成配置窗格中的步骤。

    请记下您输入的部署名称。在稍后删除部署时需要此名称。

    点击部署后,系统会显示解决方案部署页面。此页面的状态字段显示正在部署

  5. 等待解决方案部署。

    如果部署失败,状态字段将显示失败。您可以使用 Cloud Build 日志来诊断错误。如需了解详情,请参阅通过控制台部署时出错

    部署完成后,状态字段将更改为已部署

  6. 如需查看和使用已部署的电子商务 Web 应用,请遵循探索您的 Avocano 部署中的说明。

  7. 如需查看已部署的 Google Cloud 资源及其配置,请进入交互式导览。

    开始导览

如果您不再需要该解决方案,可以将部署删除,以免继续为 Google Cloud 资源计费。如需了解详情,请参阅删除部署

使用 Terraform CLI 进行部署

本部分介绍如何使用 Terraform CLI 自定义解决方案或自动预配和管理解决方案。使用 Terraform CLI 部署的解决方案不会显示在 Google Cloud 控制台的解决方案部署页面中。

设置 Terraform 客户端

您可以在 Cloud Shell 或本地主机上运行 Terraform。本指南介绍如何在 Cloud Shell 中运行 Terraform,其中预安装了 Terraform 并将其配置为向 Google Cloud 进行身份验证。

GitHub 代码库中提供了此解决方案的 Terraform 代码。

  1. 将 GitHub 代码库克隆到 Cloud Shell。

    在 Cloud Shell 中打开

    系统会显示一条提示,要求您确认将 GitHub 代码库下载到 Cloud Shell。

  2. 点击确认

    Cloud Shell 会在单独的浏览器标签页中启动,而 Terraform 代码会下载到 Cloud Shell 环境的 $HOME/cloudshell_open 目录中。

  3. 在 Cloud Shell 中,检查当前工作目录是否为 $HOME/cloudshell_open/terraform-dynamic-python-webapp/infra。这是包含此解决方案的 Terraform 配置文件的目录。如果您需要切换到该目录,请运行以下命令:

    cd $HOME/cloudshell_open/terraform-dynamic-python-webapp/infra
    
  4. 通过运行以下命令来初始化 Terraform:

    terraform init
    

    等待系统显示以下消息:

    Terraform has been successfully initialized!
    

配置 Terraform 变量

您下载的 Terraform 代码包含可用于根据需要自定义部署的变量。例如,您可以指定 Google Cloud 项目以及要在其中部署解决方案的区域。

  1. 确保当前工作目录为 $HOME/cloudshell_open/terraform-dynamic-python-webapp/infra。如果不是,请转到该目录。

  2. 在同一目录中,创建一个名为 terraform.tfvars 的文本文件。

  3. terraform.tfvars 文件中,复制以下代码段,并为所需的变量设置值。

    • 按照代码段中作为注释提供的说明进行操作。
    • 此代码段仅包含您必须为其设置值的变量。Terraform 配置包括具有默认值的其他变量。如需查看所有变量和默认值,请参阅 $HOME/cloudshell_open/terraform-dynamic-python-webapp/infra 目录中提供的 variables.tf 文件。
    • 确保您在 terraform.tfvars 文件中设置的每个值都与 variables.tf 文件中声明的变量类型匹配。例如,如果为 variables.tf 文件中的变量定义的类型为 bool,则必须将 truefalse 指定为该变量在 terraform.tfvars 文件中的值。

      # This is an example of the terraform.tfvars file.
      # The values in this file must match the variable types declared in variables.tf.
      # The values in this file override any defaults in variables.tf.
      
      # ID of the project in which you want to deploy the solution
      project_id = "PROJECT_ID"
      
      # Google Cloud region where you want to deploy the solution
      # Example: us-central1
      region = "REGION"
      
      # Google Cloud zone where you want to deploy the solution
      # Example: us-central1-a
      zone = "ZONE"
      
      # Container Registry that hosts the client image
      client_image_host = "hsa-public/serverless-ecommerce"
      
      # Container Registry that hosts the server image
      server_image_host = "hsa-public/serverless-ecommerce"
      

      如需了解可分配给所需变量的值,请查看:

验证并查看 Terraform 配置

  1. 确保当前工作目录为 $HOME/cloudshell_open/terraform-dynamic-python-webapp/infra。如果不是,请转到该目录。

  2. 验证 Terraform 配置没有错误:

    terraform validate
    

    如果该命令返回任何错误,请在配置中进行所需的更正,然后再次运行 terraform validate 命令。重复此步骤,直到命令返回以下消息:

    Success! The configuration is valid.
    
  3. 查看配置中定义的资源:

    terraform plan
    
  4. 如果您未按照上文所述创建 terraform.tfvars 文件,则 Terraform 会提示您为没有默认值的变量输入值。输入必需的值。

    terraform plan 命令的输出是在应用配置时 Terraform 预配的资源列表。

    如果要进行任何更改,请修改配置,然后再次运行 terraform validateterraform plan 命令。

预配资源

如果 Terraform 配置中不需要进一步更改,请部署资源。

  1. 确保当前工作目录为 $HOME/cloudshell_open/terraform-dynamic-python-webapp/infra。如果不是,请转到该目录。

  2. 应用 Terraform 配置:

    terraform apply
    
  3. 如果您未按照上文所述创建 terraform.tfvars 文件,则 Terraform 会提示您为没有默认值的变量输入值。输入必需的值。

    Terraform 会显示将创建的资源列表。

  4. 当系统提示您执行操作时,请输入 yes

    Terraform 展示一些显示部署进度的消息。

    如果无法完成部署,则 Terraform 会显示导致失败的错误。查看错误消息,并更新配置以修复错误。然后,再次运行 terraform apply 命令。如需有关排查 Terraform 错误的帮助,请参阅使用 Terraform CLI 部署解决方案时出错

    创建完所有资源后,Terraform 会显示以下消息:

    Apply complete!
    
  5. 如需查看和使用已部署的电子商务 Web 应用,请遵循探索您的 Avocano 部署中的说明。

  6. 如需查看已部署的 Google Cloud 资源及其配置,请进入交互式导览。

    开始导览

如果您不再需要该解决方案,可以将部署删除,以免继续为 Google Cloud 资源计费。如需了解详情,请参阅删除部署

探索您的 Avocano 部署

您已成功部署 Avocano 网站应用!您可以访问 Avocano 网站并四处浏览,然后在 Google Cloud 控制台中探索该解决方案的工作原理。请注意,部署应用后,可能需要几分钟时间网站才会在提供的地址中显示。

什么是 Avocano?

此解决方案使用名为 Avocano 的示例应用,演示如何使用许多用于无服务器应用的工具和产品来部署和管理 Web 应用。Avocano 是一款模拟真实的电子商务 Web 应用实现的应用。

Avocano 前端呈现了一个假的店面,您可以在其中将商品添加到购物车,并尝试完成结账流程,但此时您会发现这个商店是假的 (Avoca--no!)。虽然您实际上无法购买牛油果,但该应用会将现货数量减少一个以展示库存管理功能。

Avocano 着陆页

探索前端

如需启动解决方案部署的前端,请执行以下操作:

  1. 打开 Firebase 控制台
  2. 选择现有项目。
  3. 导航到构建 > Hosting 部分。
  4. 选择以 web.app 结尾的网域。示例应用的前端会在新的浏览器窗口中打开。

您现在可以像顾客一样与 Avocano 网站交互,包括浏览商品、将商品添加到购物车,以及以访客身份结账。

查看自动扩缩和并发配置

Cloud Run 会根据流量自动扩缩容器实例,从而缩短应用的启动时间。

了解自动扩缩和并发设置

请务必注意,Cloud Run 上的自动扩缩和并发设置可能会影响应用的性能和费用:

  • 实例数下限:您可以设置实例数下限,为服务启用空闲实例。如果您预期流量会增加,提高实例数下限可以最大限度地减少前 N 位用户的响应时间。如果您的服务要求缩短延迟时间(尤其是在从零个活跃实例扩容时),您可以指定要保持备用状态并准备处理请求的容器实例数下限。

  • 实例数上限:增加 Cloud Run 中的实例数上限可帮助您处理极高的预期流量。在这种情况下,您还应评估当前配额并考虑申请增加配额。减少实例数上限设置有助于避免意外费用或过高的底层基础架构(例如数据库容量)利用率。

  • 并发:Cloud Run 并发设置指定一个给定容器实例可以同时处理的最大请求数。针对应用行为优化内存、CPU 和并发可确保每个容器实例利用率达到最佳,并最大限度地减少扩容到新实例的需求。如需了解详情,请参阅优化并发设置

查看自动扩缩和并发设置

如需查看 Cloud Run 服务的当前实例数下限和上限设置以及并发设置,请执行以下操作:

  1. 转到 Cloud Run
  2. 点击您感兴趣的服务以打开“服务详细信息”页面。
  3. 点击修订版本标签页。
  4. 在右侧的详细信息面板中,容器标签页下列出了当前的实例数下限、实例数上限和并发设置。

如果您想了解如何调整这些设置以优化应用性能,请参阅 Cloud Run 文档中的常规开发技巧

查看流量日志

您可以使用 Cloud Run 中的日志记录工具来监控应用的流量,并在出现问题时收到提醒。

如需查看 Cloud Run 服务的日志,请执行以下操作:

  1. 转到 Cloud Run
  2. 在显示的列表中点击所选服务。
  3. 点击日志标签页,以获取此服务的所有修订版本的请求日志及容器日志。您可以按日志严重级别进行过滤。

Cloud Run 会自动从多个位置捕获日志:写入标准输出和标准错误的所有日志记录、/var/log/ 中的所有日志记录等等。还会捕获使用 Cloud Logging 库完成的所有手动日志记录。您还可以点击在 Logs Explorer 中查看,直接在 Cloud Logging 中查看此服务的日志。

在 Avocano 应用中,尝试执行以下用户操作来触发您可以在日志中查看的相应输出。

用户操作 日志输出
使用到付作为付款方式购买购物车中的商品,并且购物车中的商品数量不超过库存数量。 日志输出显示 info 日志,httpRequest 状态为 200。
使用到付作为付款方式购买购物车中的商品,但购物车中的商品数量超过库存数量。 日志输出显示 Warning 日志,httpRequest 状态为 400。
使用信用卡作为付款方式购买购物车中的商品。 日志输出显示 Error 日志,httpRequest 状态为 501。

您可以在 serializers.py 文件中查看引发导致 400/501 HTTP 响应的错误的代码。Cloud Run 会记录响应,并生成相应的请求日志条目。

您可以使用基于日志的提醒,以便在包含的日志中出现特定消息时收到通知。

查看跟踪记录插桩和捕获的跟踪记录

此解决方案使用 Open Telemetry Python 自动插桩来捕获 Avocano 应用的遥测数据。

了解如何实现跟踪

解决方案实现以下代码和配置设置,以使用自动插桩生成跟踪记录:

  1. requirements.txt 文件中添加 Cloud Trace 的依赖项,包括:
    • opentelemetry-distro:安装 Open Telemetry API、SDK 和命令行工具。
    • opentelemetry-instrumentation:添加对 Python 自动插桩的支持。
    • opentelemetry-exporter-gcp-trace:支持将跟踪记录导出到 Cloud Trace。
    • opentelemetry-resource-detector:支持检测 Google Cloud 资源。
    • opentelemetry-instrumentation-django:允许跟踪 Django 应用的请求。
  2. iam.tf 文件中设置 IAM 绑定,让服务器能够写入 Cloud Trace。
  3. services.tf 文件中配置 OTEL_TRACES_EXPORTER 环境变量,以将该导出器用于 Cloud Trace。
  4. server/Procfile 中,将服务器配置为在 Avocano 应用上运行 opentelemetry-instrument 命令。此命令会检测 Avocano 中的软件包,并对它们应用自动跟踪插桩(如果可能的话)。

如需详细了解如何收集 Python 版 Cloud Trace 数据,请参阅 Python 和 OpenTelemetry

查看延迟时间数据

如需查看请求的延迟时间数据,请按以下步骤操作:

  1. 前往 Cloud Trace
  2. 跟踪记录列表页面的选择跟踪记录部分中,点击蓝点,该蓝点代表捕获的跟踪记录。延迟时间列显示的是捕获的跟踪记录的延迟时间。

您还可以在跟踪记录列表页面中使用以下可视化项查看跟踪记录数据:

  • 瀑布图:表示通过应用的完整请求。时间轴中的每个步骤都是一个 span,您可以点击以查看其详情。Cloud Run 会自动为内部操作(例如请求处理和负载均衡)创建 span。这些 span 与 Avocano 生成的 span 显示在同一个瀑布图中,使您可以查看请求的完整生命周期。
  • span 详情:显示您对应用代码进行插桩以进行跟踪时,向其添加的任何标签或注解。

如果您想添加自定义跟踪记录,请参阅 Open Telemetry 文档中的手动插桩

设计建议

本部分就如何使用“使用无服务器计算的电子商务平台”解决方案来开发符合安全性、可靠性、费用和性能要求的架构提供了相关建议。

要查看每个区域的设计建议,请点击相应的标签页。

增强安全性

设计重点 建议
数据加密

默认情况下,Cloud Run 使用 Google 拥有和 Google 管理的密钥加密数据。如需使用您控制的密钥保护容器,您可以使用客户管理的加密密钥。如需了解详情,请参阅使用客户管理的加密密钥

软件供应链安全 如需确保仅将获得授权的容器映像部署到 Cloud Run 服务,您可以使用 Binary Authorization

提高可靠性

设计重点 建议
应用扩缩 解决方案中的 Cloud Run 服务配置为根据请求负载水平自动扩缩容器实例。根据您的要求检查并调整自动扩缩参数。如需了解详情,请参阅容器实例自动扩缩简介
请求处理 要提高在容器实例上存储客户端特定状态的 Cloud Run 服务的响应速度,您可以使用会话亲和性。系统会尽最大努力将来自同一客户端的请求路由到相同的容器实例。如需了解详情,请参阅设置会话亲和性(服务)
数据耐用性 如要防止数据丢失,您可以使用 Cloud SQL 数据库的自动备份。如需了解详情,请参阅 Cloud SQL 备份简介
数据库高可用性 (HA)

解决方案中的 Cloud SQL 数据库部署在单个可用区中。为了实现高可用性,您可以使用多可用区配置。如需了解详情,请参阅高可用性简介

如果数据库高可用性是一项关键要求,则可以考虑使用 AlloyDB for PostgreSQL 作为备用 Google Cloud 服务。

数据库可靠性

此解决方案中的 Cloud SQL 实例使用 db-custom-2-4096 机器类型,该机器类型使用两个 CPU 和 4 GB 内存。此机器类型旨在为可能仅适用于测试和开发环境的低成本数据库提供资源。如果您需要生产级可靠性,请考虑使用提供更多 CPU 和内存的机器类型

Cloud SQL 服务等级协议 (SLA) 不包含使用 db-g1-small 机器类型的 Cloud SQL 实例。如需详细了解 SLA 中排除的配置,请参阅操作指南

配额和限制

Cloud Run 资源的数量是有限的。如果您预计会出现流量激增(例如由于季节性活动或促销活动),则应申请增加配额。如需了解详情,请参阅如何增加配额

某些配额申请需要人工批准,因此您应提前计划。您还可以设置配额消耗进度的提醒。

优化费用

设计重点 建议
资源效率

Cloud Run 会根据 CPU 使用率和内存用量来确定应发送到容器实例的请求数。通过提高最大并发设置,您可以减少 Cloud Run 需要创建的容器实例数量,从而降低费用。如需了解详情,请参阅每个实例的并发请求数上限(服务)

此解决方案中的 Cloud Run 服务配置为仅在处理请求期间分配 CPU。当 Cloud Run 服务处理完请求后,容器实例便不会再获得 CPU 分配。如需了解此配置的费用和性能影响,请参阅 CPU 分配(服务)

提升性能

设计重点 建议
应用启动时间 为了降低冷启动对性能的影响,您可以将 Cloud Run 容器实例数下限配置为非零值。如需了解详情,请参阅 Cloud Run 的常规开发技巧
调整并发设置 此解决方案经过调整,以最大限度地提高单个容器吞吐量。Cloud Run 会自动调整并发设置以处理多个请求。但是,如果您的容器无法处理许多并发请求,或者容器能够处理更多请求,您应该调整默认的最大并发数。如需了解详情,请参阅优化并发设置
数据库性能

对于性能敏感型应用,您可以通过使用更大的机器类型和增加存储容量来提高 Cloud SQL 的性能。

如果数据库性能是一项关键要求,则可以考虑使用 AlloyDB for PostgreSQL 作为备用 Google Cloud 服务。

请注意以下几点:

  • 在进行任何设计更改之前,请评估费用影响并考虑与其他功能的潜在权衡。您可以使用 Google Cloud 价格计算器评估设计更改的费用影响。
  • 要在解决方案中实现设计更改,您需要具备 Terraform 编码方面的专业知识,以及解决方案中使用的 Google Cloud 服务的高级知识。
  • 如果您修改了 Google 提供的 Terraform 配置,然后遇到错误,请在 GitHub 中创建问题。GitHub 问题会尽量得到查看,且不适用于一般使用问题。
  • 如需详细了解如何在 Google Cloud 中设计和设置生产级环境,请参阅 Google Cloud 中的着陆区设计Google Cloud 设置核对清单

删除解决方案部署

如果不再需要解决方案部署,为避免继续为创建的资源计费,请删除部署。

通过控制台删除

如果您通过控制台部署了解决方案,请按以下流程操作。

  1. 在 Google Cloud 控制台中,转到解决方案部署页面。

    转到“解决方案部署”

  2. 选择您要删除的部署所在的项目。

  3. 找到您要删除的部署。

  4. 在部署对应的行中,点击 操作,然后选择删除

    您可能需要向下滚动才能看到该行中的操作

  5. 输入部署的名称,然后点击确认

    状态字段显示正在删除

    如果删除失败,请参阅删除部署时出错中的问题排查指南。

如果您不再需要用于此解决方案的 Google Cloud 项目,则可以删除该项目。如需了解详情,请参阅可选:删除项目

使用 Terraform CLI 进行删除

如果您使用 Terraform CLI 部署了解决方案,请按照以下步骤操作。

  1. 在 Cloud Shell 中,确保当前工作目录为 $HOME/cloudshell_open/terraform-dynamic-python-webapp/infra。如果不是,请转到该目录。

  2. 移除 Terraform 预配的资源:

    terraform destroy
    

    Terraform 会显示将被销毁的资源列表。

  3. 当系统提示您执行操作时,请输入 yes

    Terraform 会显示显示进度的消息。删除所有资源后,Terraform 将显示以下消息:

    Destroy complete!
    

    如果删除失败,请参阅删除部署时出错中的问题排查指南。

如果您不再需要用于此解决方案的 Google Cloud 项目,则可以删除该项目。如需了解详情,请参阅可选:删除项目

可选:删除项目

如果您在新的 Google Cloud 项目中部署了解决方案,但不再需要该项目,请完成以下步骤来将其删除:

  1. 在 Google Cloud 控制台中,进入管理资源页面:

    打开“管理资源”

  2. 在项目列表中,选择要删除的项目,然后点击删除
  3. 在提示符处,输入项目 ID,然后点击关停

如果您决定保留项目,请删除为此解决方案创建的服务账号,如下一部分所述。

可选:删除服务账号

如果删除了用于解决方案的项目,请跳过此部分。

如本指南前面部分所述,当您部署解决方案时,系统代表您创建了一个服务账号。系统为服务账号临时分配了某些 IAM 权限;也就是说,在解决方案的部署和删除操作完成后,系统会自动撤消这些权限,但不会删除服务账号。Google 建议您删除此服务账号。

  • 如果您通过 Google Cloud 控制台部署了解决方案,请进入解决方案部署页面。(如果您已进入该页面,请刷新浏览器。)系统会在后台触发进程来删除服务账号。无需进一步操作。

  • 如果您使用 Terraform CLI 部署了解决方案,请完成以下步骤:

    1. 在 Google Cloud 控制台中,转到服务账号页面。

      转到“服务账号”

    2. 选择您用于解决方案的项目。

    3. 选择要删除的服务账号。

      为解决方案创建的服务账号的电子邮件 ID 采用以下格式:

      goog-sc-DEPLOYMENT_NAME-NNN@PROJECT_ID.iam.gserviceaccount.com
      

      电子邮件 ID 包含以下值:

      • DEPLOYMENT_NAME:部署的名称。
      • NNN:随机 3 位数。
      • PROJECT_ID:部署了解决方案的项目的 ID。
    4. 点击删除

排查错误

可以诊断和解决错误的操作取决于部署方法和错误的复杂程度。

通过控制台进行部署时发生错误

如果您使用控制台时部署失败,请执行以下操作:

  1. 转到解决方案部署页面。

    如果部署失败,状态字段将显示失败

  2. 查看导致失败的错误的详细信息:

    1. 在部署对应的行中,点击 操作

      您可能需要向下滚动才能看到该行中的操作

    2. 选择查看 Cloud Build 日志

  3. 查看 Cloud Build 日志,并采取适当的措施来解决导致失败的问题。

使用 Terraform CLI 进行部署时发生错误

如果在使用 Terraform 时部署失败,terraform apply 命令的输出将包含错误消息,您可以查看这些错误消息以诊断问题。

以下部分中的示例显示了您在使用 Terraform 时可能会遇到的部署错误。

“API 未启用”错误

如果您创建了一个项目,然后立即尝试在新项目中部署此解决方案,则部署可能会失败,并显示如下错误:

Error: Error creating Network: googleapi: Error 403: Compute Engine API has not
been used in project PROJECT_ID before or it is disabled. Enable it by visiting
https://console.developers.google.com/apis/api/compute.googleapis.com/overview?project=PROJECT_ID
then retry. If you enabled this API recently, wait a few minutes for the action
to propagate to our systems and retry.

如果发生此错误,请等待几分钟,然后再次运行 terraform apply 命令。

“无法分配请求的地址”错误

运行 terraform apply 命令时,可能会发生 cannot assign requested address 错误,并显示如下消息:

Error: Error creating service account:
 Post "https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts:
 dial tcp [2001:db8:ffff:ffff::5f]:443:
 connect: cannot assign requested address

如果发生此错误,请再次运行 terraform apply 命令。

删除部署时出错

在某些情况下,尝试删除部署可能会失败:

  • 通过控制台部署解决方案后,如果您更改此解决方案预配的任何资源,然后尝试删除部署,则删除操作可能会失败。解决方案部署页面上的状态字段会显示失败,并且 Cloud Build 日志会显示错误原因。
  • 使用 Terraform CLI 部署解决方案后,如果您使用非 Terraform 界面(例如控制台)更改任何资源,然后尝试删除部署,则删除操作可能会失败。terraform destroy 命令输出中的消息会显示错误的原因。

查看错误日志和消息,找出并删除导致错误的资源,然后再次尝试删除部署。

如果基于控制台的部署未删除,并且您无法使用 Cloud Build 日志诊断错误,则可以使用 Terraform CLI 删除该部署,如下一部分所述。

使用 Terraform CLI 删除基于控制台的部署

本部分介绍在尝试通过控制台删除基于控制台的部署出错时如何删除该部署。在此方法中,您可以下载要删除的部署的 Terraform 配置,然后使用 Terraform CLI 删除部署。

  1. 确定部署的 Terraform 代码、日志和其他数据的存储区域。此区域可能与您在部署解决方案时选择的区域不同。

    1. 在 Google Cloud 控制台中,转到解决方案部署页面。

      转到“解决方案部署”

    2. 选择您要删除的部署所在的项目。

    3. 在部署列表中,找到要删除的部署所在的行。

    4. 点击 查看所有行内容

    5. 位置列中,记下第二个位置,如以下示例中突出显示部分所示:

      部署代码、日志和其他工件的位置。

  2. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  3. 为要删除的部署的项目 ID、区域和名称创建环境变量:

    export REGION="REGION"
    export PROJECT_ID="PROJECT_ID"
    export DEPLOYMENT_NAME="DEPLOYMENT_NAME"
    

    在这些命令中,替换以下内容:

    • REGION:您先前在此过程中记下的位置。
    • PROJECT_ID:您在其中部署解决方案的项目的 ID。
    • DEPLOYMENT_NAME:您要删除的部署的名称。
  4. 获取您要删除的最新修订版本部署的 ID:

    export REVISION_ID=$(curl \
        -H "Authorization: Bearer $(gcloud auth print-access-token)" \
        -H "Content-Type: application/json" \
        "https://config.googleapis.com/v1alpha2/projects/${PROJECT_ID}/locations/${REGION}/deployments/${DEPLOYMENT_NAME}" \
        | jq .latestRevision -r)
        echo $REVISION_ID
    

    输出类似于以下内容:

    projects/PROJECT_ID/locations/REGION/deployments/DEPLOYMENT_NAME/revisions/r-0
    
  5. 获取该部署的 Terraform 配置的 Cloud Storage 位置:

    export CONTENT_PATH=$(curl \
        -H "Authorization: Bearer $(gcloud auth print-access-token)" \
        -H "Content-Type: application/json" \
        "https://config.googleapis.com/v1alpha2/${REVISION_ID}" \
        | jq .applyResults.content -r)
        echo $CONTENT_PATH
    

    以下是此命令的输出示例:

    gs://PROJECT_ID-REGION-blueprint-config/DEPLOYMENT_NAME/r-0/apply_results/content
    
  6. 将 Terraform 配置从 Cloud Storage 下载到 Cloud Shell:

    gcloud storage cp $CONTENT_PATH $HOME --recursive
    cd $HOME/content/infra
    

    等到系统显示 Operation completed 消息,如以下示例所示:

    Operation completed over 45 objects/268.5 KiB
    
  7. 初始化 Terraform:

    terraform init
    

    等待系统显示以下消息:

    Terraform has been successfully initialized!
    
  8. 移除已部署的资源:

    terraform destroy
    

    Terraform 会显示将被销毁的资源列表。

    如果显示的警告与未声明变量有关,请忽略这些警告。

  9. 当系统提示您执行操作时,请输入 yes

    Terraform 会显示显示进度的消息。删除所有资源后,Terraform 将显示以下消息:

    Destroy complete!
    
  10. 删除部署工件:

    curl -X DELETE \
        -H "Authorization: Bearer $(gcloud auth print-access-token)" \
        -H "Content-Type: application/json" \
        "https://config.googleapis.com/v1alpha2/projects/${PROJECT_ID}/locations/${REGION}/deployments/${DEPLOYMENT_NAME}?force=true&delete_policy=abandon"
    
  11. 等待几秒钟,然后验证部署工件是否已删除:

    curl -H "Authorization: Bearer $(gcloud auth print-access-token)" \
        -H "Content-Type: application/json" \
        "https://config.googleapis.com/v1alpha2/projects/${PROJECT_ID}/locations/${REGION}/deployments/${DEPLOYMENT_NAME}" \
        | jq .error.message
    

    如果输出显示 null,请等待几秒钟,然后再次运行该命令。

    删除部署工件后,系统会显示一条如以下示例所示的消息:

    Resource 'projects/PROJECT_ID/locations/REGION/deployments/DEPLOYMENT_NAME' was not found
    

提交反馈

快速起步解决方案仅供参考,并非官方支持的产品。Google 可能会在不事先通知的情况下更改或移除解决方案。

如需排查错误,请查看 Cloud Build 日志和 Terraform 输出。

如需提交反馈,请执行以下操作:

  • 对于文档、控制台教程或解决方案,请使用页面上的发送反馈按钮。
  • 对于未经修改的代码,请在相应的 GitHub 代码库中创建问题:

    GitHub 问题会尽量得到查看,且不适用于一般使用问题。

后续步骤

此解决方案演示了如何使用 Cloud Run 部署电子商务 Web 应用。如需继续详细了解 Google Cloud 产品和功能,请参阅: