本教程介绍如何在 App Engine 应用中使用 Cloud Tasks 触发 Cloud Run 函数并定期发送电子邮件。
目标
- 了解每个组件中的代码。
- 创建一个 SendGrid 账号。
- 下载源代码。
- 部署 Cloud Run 函数,以接收 Cloud Tasks 请求并通过 SendGrid API 发送电子邮件。
- 创建 Cloud Tasks 队列。
- 创建服务账号以对您的 Cloud Tasks 请求进行身份验证。
- 部署允许用户发送电子邮件的客户端代码。
费用
Cloud Tasks、Cloud Run 函数和 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 函数和 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 函数触发器类型。--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 函数
前往 Google Cloud 控制台中的 Cloud Run 函数页面。
点击函数旁边的复选框。
点击页面顶部的删除按钮并确认删除操作。
删除 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 队列。