本教程介绍如何在 App Engine 应用中使用 Cloud Tasks 触发 Cloud Run 函数并定期发送电子邮件。
目标
- 了解每个组件中的代码。
- 创建一个 SendGrid 账号。
- 下载源代码。
- 部署 Cloud Run 函数,以接收 Cloud Tasks 请求并通过 SendGrid API 发送电子邮件。
- 创建 Cloud Tasks 队列。
- 创建服务账号以对您的 Cloud Tasks 请求进行身份验证。
- 部署允许用户发送电子邮件的客户端代码。
费用
Cloud Tasks、Cloud Run functions 和 App Engine 具有免费层级,因此只要您在给定产品的免费层级中运行教程,就不会产生额外费用。要了解详情,请参阅价格。
准备工作
选择或创建 Google Cloud 项目。
在您的项目中初始化 App Engine 应用:
在欢迎使用 App Engine网页点击创建应用。
为您的应用选择一个区域。此位置将用作 Cloud Tasks 请求的
LOCATION_ID
参数,因此请记下该位置。请注意,App Engine 命令中名为 europe-west 和 us-central 的两个位置在 Cloud Tasks 命令中分别称为 europe-west1 和 us-central1。选择 Node.js 作为语言,选择标准作为环境。
如果系统弹出启用结算窗口,请选择您的结算账号。如果您目前没有结算账号,请点击创建结算账号并按照向导中的说明操作。
在开始页面,点击下一页。您稍后会处理此内容。
启用 Cloud Run functions 和 Cloud Tasks API。
安装并初始化 gcloud CLI。
了解代码
此部分介绍了应用代码及其工作原理。
创建任务
索引页面使用 app.yaml
中的处理程序提供。创建任务所需的变量将作为环境变量传入。
此代码会创建端点 /send-email
。此端点会处理从索引页面提交的表单,并将该数据传递给任务创建代码。
此代码实际上会创建任务并将其发送到 Cloud Tasks 队列。代码通过以下方式构建任务:
将目标类型指定为
HTTP Request
。指定要使用的
HTTP method
和目标的URL
。将
Content-Type
标头设置为application/json
,以便下游应用可以解析结构化载荷。添加服务账号电子邮件,以便 Cloud Tasks 可以向请求目标提供凭据,这需要身份验证。此服务账号是单独创建的。
检查以确保用户输入日期不超过 30 天,并将其作为字段
scheduleTime
添加到请求中。
创建电子邮件
此代码会创建 Cloud Run 函数,该函数是 Cloud Tasks 请求的目标。它使用请求正文来构建电子邮件并通过 SendGrid API 发送它。
准备应用
设置 SendGrid
创建一个 SendGrid 账号。
- 您可以通过 SendGrid 网站手动执行此操作
- 您也可以使用 Google Cloud Launcher(该服务将为您创建一个账号,并集成结算功能)。请参阅使用 Cloud Launcher 创建 SendGrid 账号。
创建 SendGrid API 密钥:
登录您的 SendGrid 账号。
在左侧导航栏中,打开设置,然后点击 API 密钥。
点击创建 API 密钥,然后选择受限访问权限。在邮件发送标头下,选择完整访问权限。
复制所显示的 API 密钥(您只能看到一次,请务必将其粘贴到别处,方便日后使用)。
下载源代码
将示例应用代码库克隆到本地机器:
git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git
转到包含示例代码的目录:
cd cloud-tasks/
部署 Cloud Run 函数
导航到
function/
目录:cd function/
部署函数的方法如下:
gcloud functions deploy sendEmail --runtime nodejs14 --trigger-http \ --no-allow-unauthenticated \ --set-env-vars SENDGRID_API_KEY=SENDGRID_API_KEY \
将
SENDGRID_API_KEY
替换为您的 API 密钥。此命令使用以下标志:
使用
--trigger-http
以指定 Cloud Run functions 触发器类型。--no-allow-unauthenticated
以指定函数调用需要进行身份验证。使用
--set-env-var
以设置您的 SendGrid 凭据
将该函数的访问权限控制设置为仅允许经过身份验证的用户。
在 Cloud Run functions 界面中选择
sendEmail
函数。如果您没有看到
sendEmail
的权限信息,请点击右上角的显示信息面板。点击上方的添加主账号按钮。
将新的主账号设置为
allAuthenticatedUsers
。设置角色。
- 第 1 代函数:将角色设置为
Cloud Function Invoker
- 第 2 代函数:将角色设置为
Cloud Run Invoker
- 第 1 代函数:将角色设置为
点击保存。
创建 Cloud Tasks 队列
使用以下
gcloud
命令创建队列:gcloud tasks queues create my-queue --location=LOCATION
将
LOCATION
替换为队列的首选位置,例如us-west2
。如果您未指定位置,gcloud CLI 会选择默认位置。验证是否已成功创建队列:
gcloud tasks queues describe my-queue --location=LOCATION
将
LOCATION
替换为队列的位置。
创建服务账号
Cloud Tasks 请求必须在 Authorization
标头中提供凭据,以便 Cloud Run 函数对请求进行身份验证。此服务账号允许 Cloud 任务为此创建和添加 OIDC 令牌。
在服务账号界面,点击 +创建服务账号。
添加服务账号名称(易记显示名),然后选择创建。
设置角色,然后点击继续。
- 第 1 代函数:将角色设置为
Cloud Function Invoker
- 第 2 代函数:将角色设置为
Cloud Run Invoker
- 第 1 代函数:将角色设置为
选择完成。
将端点和任务创建者部署到 App Engine
导航到
app/
目录:cd ../app/
使用您的值更新
app.yaml
中的变量:如需查找您的队列位置,请使用以下命令:
gcloud tasks queues describe my-queue --location=LOCATION
将
LOCATION
替换为队列的位置。如需查找函数网址,请使用以下命令:
gcloud functions describe sendEmail
使用以下命令将应用部署到 App Engine 标准环境:
gcloud app deploy
打开应用,以电子邮件的形式发送明信片:
gcloud app browse
清除数据
完成本教程后,您可以清理您创建的资源,让它们停止使用配额,以免产生费用。以下部分介绍如何删除或关闭这些资源。
删除资源
您可以清理在 Google Cloud 上创建的资源,以避免这些资源占用配额,日后产生费用。以下部分介绍如何删除或关闭这些资源。
删除 Cloud Run functions 函数
前往 Google Cloud 控制台中的 Cloud Run functions 概览页面:
点击函数旁边的复选框。
点击页面顶部的删除按钮并确认删除操作。
删除 Cloud Tasks 队列
在控制台打开 Cloud Tasks 队列页面。
选择要删除的队列名称,然后点击删除队列。
确认该操作。
删除项目
为了避免产生费用,最简单的方法是删除您为本教程创建的项目。
如需删除项目,请执行以下操作:
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
后续步骤
- 了解如何创建 HTTP 目标任务。
- 详细了解如何配置 Cloud Tasks 队列。