在 Cloud Run 上使用 Node.js 构建 Slack 聊天机器人

1. 概览

5f529fb87abc11c9.png

在此 Codelab 中,您将学习如何使用 Botkit 工具包构建 Slack 机器人,并在 Google Cloud 上运行该机器人。您将能够在实时 Slack 频道中与聊天机器人互动。

学习内容

  • 如何在 Slack 中创建聊天机器人自定义集成
  • 如何使用 Secret Manager 保护 Slack 密文的安全
  • 如何在 Cloud Run(一个全托管式计算平台,可自动扩缩您的无状态容器)上部署 Slack 聊天机器人

所需条件

  • Google Cloud 项目
  • 一个浏览器,例如 ChromeFirefox

您打算如何使用本教程?

仅阅读教程内容 阅读并完成练习

您如何评价自己在 Google Cloud 方面的经验水平?

新手水平 中等水平 熟练水平

2. 设置和要求

自定进度的环境设置

  1. 登录 Google Cloud 控制台,然后创建一个新项目或重复使用现有项目。如果您还没有 Gmail 或 Google Workspace 账号,则必须创建一个

98e4187c97cf2e0e.png

37d264871000675d.png

c20a9642aaa18d11.png

  • 项目名称是此项目参与者的显示名称。它是 Google API 尚未使用的字符串。您可以随时对其进行更新。
  • 项目 ID 在所有 Google Cloud 项目中是唯一的,并且是不可变的(一经设置便无法更改)。Cloud 控制台会自动生成一个唯一字符串;通常情况下,您无需关注该字符串。在大多数 Codelab 中,您都需要引用项目 ID(通常用 PROJECT_ID 标识)。如果您不喜欢生成的 ID,可以再随机生成一个 ID。或者,您也可以尝试自己的项目 ID,看看是否可用。完成此步骤后便无法更改该 ID,并且此 ID 在项目期间会一直保留。
  • 此外,还有第三个值,即部分 API 使用的项目编号,供您参考。如需详细了解所有这三个值,请参阅文档
  1. 接下来,您需要在 Cloud 控制台中启用结算功能,以便使用 Cloud 资源/API。运行此 Codelab 应该不会产生太多的费用(如果有的话)。若要关闭资源以避免产生超出本教程范围的结算费用,您可以删除自己创建的资源或删除项目。Google Cloud 新用户符合参与 300 美元免费试用计划的条件。

启动 Cloud Shell

虽然可以通过笔记本电脑对 Google Cloud 进行远程操作,但在此教程中,您将使用 Cloud Shell,这是一个在云端运行的命令行环境。

激活 Cloud Shell

  1. 在 Cloud Console 中,点击激活 Cloud Shelld1264ca30785e435.png

84688aa223b1c3a2.png

如果您是第一次启动 Cloud Shell,系统会显示一个介绍其功能的过渡页面。如果您看到了过渡页面,请点击继续

d95252b003979716.png

预配和连接到 Cloud Shell 只需花几分钟时间。

7833d5e1c5d18f54.png

这个虚拟机已加载了所需的所有开发工具。它提供了一个持久的 5 GB 主目录,并且在 Google Cloud 中运行,大大增强了网络性能和身份验证。只需使用一个浏览器即可完成本 Codelab 中的大部分工作。

连接到 Cloud Shell 后,您应该会看到自己已通过身份验证,并且相关项目已设置为您的项目 ID。

  1. 在 Cloud Shell 中运行以下命令以确认您已通过身份验证:
gcloud auth list

命令输出

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. 在 Cloud Shell 中运行以下命令,以确认 gcloud 命令了解您的项目:
gcloud config list project

命令输出

[core]
project = <PROJECT_ID>

如果不是上述结果,您可以使用以下命令进行设置:

gcloud config set project <PROJECT_ID>

命令输出

Updated property [core/project].

3. 启用 API

在 Cloud Shell 中,启用 Artifact Registry API、Cloud Build API、Cloud Run API 和 Secret Manager API:

gcloud services enable \
  artifactregistry.googleapis.com \
  cloudbuild.googleapis.com \
  run.googleapis.com \
  secretmanager.googleapis.com

这会输出一条类似如下的成功消息:

Operation "operations/..." finished successfully.

现在,您可以准备和部署应用了...

4. 创建 Slack 工作区

您需要一个允许您创建自定义集成的 Slack 工作区。如果您还没有要用于本教程的工作区,可以免费创建一个工作区

aa1f0fda82263bf8.png

5. 创建 Slack 机器人用户

机器人用户可以侦听 Slack 上的消息、发布消息和上传文件。在此 Codelab 中,您将创建一个用于发布简单问候消息的机器人。

创建一个新的 Slack 应用

  • 前往 Slack 应用管理页面
  • 点击右上角的创建新应用按钮。
  • 为应用命名,例如“Kittenbot”。
  • 选择要安装该应用的 Slack 团队。

创建聊天机器人用户

  • 前往左侧面板中功能下的 App Home

414213b184fcc992.png

  • 点击查看要添加的范围,为您的机器人令牌分配范围
  • 向下滚动到聊天机器人令牌范围,然后点击添加 OAuth 范围。选择 chat:write 以“以 Kittenbot 的身份发送消息”

74a6fa87c64c2b23.png

  • 向上滚动,然后点击将应用安装到工作区按钮。
  • 此操作会将应用安装到您的团队,添加您刚刚创建的聊天机器人用户,并生成聊天机器人令牌。
  • 系统提示时,点击“允许”,以授权聊天机器人在您的工作区中聊天。

启用消息和命令

  • 向下滚动到显示标签页,并确保已启用以下两个选项:

5ca52f7abbdc15c.png

获取客户端签名密钥

  • 前往设置下的基本信息
  • 向下滚动到 Signing Secret,点击 Show,然后将密文复制到剪贴板:

74cfd6616fa71dc4.png

  • 将 Secret 保存到环境变量中:
CLIENT_SIGNING_SECRET=PASTE_THE_SIGNING_SECRET

获取机器人令牌

  • 前往功能下的 OAuth 和权限
  • 点击复制按钮,将聊天机器人用户 OAuth 访问令牌文本复制到剪贴板。

6f5a18069471101.png

  • 将机器人令牌保存在环境变量中:
BOT_TOKEN=PASTE_THE_BOT_TOKEN

别担心。如果您需要再次获取这些令牌,可以从 应用管理页面 返回到此配置页面。

6. 保护您的 Secret

我们希望确保您的机器人令牌和客户端签名密钥得到安全存储。如果将这些密文硬编码到源代码中,则很可能会因将它们发布到版本控制系统或将它们嵌入到 Docker 映像中而意外泄露这些密文。

Secret Manager 提供了一种安全便捷的方法来存储 API 密钥、密码、证书和其他敏感数据。Secret Manager 提供了一个集中、单一的数据源,便于您管理、访问和审核 Google Cloud 中的密文。

创建 Secret

使用以下命令保存您的客户端签名密钥和机器人令牌:

  • 客户端签名密钥
echo -n $CLIENT_SIGNING_SECRET | gcloud secrets create client-signing-secret \
  --replication-policy automatic \
  --data-file -
  • 机器人令牌
echo -n $BOT_TOKEN | gcloud secrets create bot-token \
  --replication-policy automatic \
  --data-file -

访问您的 Secret

我们来确认一下您的 Secret 是否已正确创建,以及您的权限是否正常运行。使用以下命令访问您的 Secret:

echo $(gcloud secrets versions access 1 --secret client-signing-secret)
echo $(gcloud secrets versions access 1 --secret bot-token)

您还可以在 Google Cloud 控制台中查看和管理 Secret。

7. 获取示例代码

在 Cloud Shell 的命令行中,运行以下命令以克隆 GitHub 代码库

git clone https://github.com/googlecodelabs/cloud-slack-bot.git

将目录切换为 cloud-slack-bot/start

cd cloud-slack-bot/start

了解代码

使用您偏好的命令行编辑器(nano、vim、emacs 等)打开 kittenbot.js 文件,或使用以下命令直接在 Cloud Shell 编辑器中打开当前文件夹:

cloudshell workspace .

kittenbot 代码具有两个主要功能。一个用于检索密钥,另一个用于运行机器人。

首先,我们导入依赖项:

kittenbot.js

const { Botkit } = require('botkit');
const {
  SlackAdapter,
  SlackEventMiddleware,
} = require('botbuilder-adapter-slack');
const { SecretManagerServiceClient } = require('@google-cloud/secret-manager');

SlackAdapter 和 SlackEventMiddleware 是扩展 Botkit 的软件包,可让机器人轻松地将消息转换为 Slack API 消息,并从 Slack API 消息转换为消息。借助 Secret Manager 客户端,您可以访问在之前的步骤中保存的 Secret。

接下来,我们编写用于检索 Secret 的函数:

/**
 * Returns the secret string from Google Cloud Secret Manager
 * @param {string} name The name of the secret.
 * @return {Promise<string>} The string value of the secret.
 */
async function accessSecretVersion(name) {
  const client = new SecretManagerServiceClient();
  const projectId = process.env.PROJECT_ID;
  const [version] = await client.accessSecretVersion({
    name: `projects/${projectId}/secrets/${name}/versions/1`,
  });

  // Extract the payload as a string.
  const payload = version.payload.data.toString('utf8');

  return payload;
}

此函数返回对机器人进行身份验证所需的密钥的字符串值。

下一个函数用于初始化机器人:

/**
 * Function to initialize kittenbot.
 */
async function kittenbotInit() {
  const adapter = new SlackAdapter({
    clientSigningSecret: await accessSecretVersion('client-signing-secret'),
    botToken: await accessSecretVersion('bot-token'),
  });

  adapter.use(new SlackEventMiddleware());

  const controller = new Botkit({
    webhook_uri: '/api/messages',
    adapter: adapter,
  });

  controller.ready(() => {
    controller.hears(
      ['hello', 'hi', 'hey'],
      ['message', 'direct_message'],
      async (bot, message) => {
        await bot.reply(message, 'Meow. :smile_cat:');
      }
    );
  });
}

该函数的第一部分使用密钥配置 SlackAdapter,然后指定用于接收消息的端点。然后,当控制器开启后,如果收到包含“hello”“hi”或“hey”的任何消息,机器人都会回复“Meow. 😺”。

查看应用清单中的以下特定部分:

package.json

{
  // ...
  "scripts": {
    "start": "node kittenbot.js",
    // ...
  },
  "engines": {
    "node": "16"
  },
  // ...
}

您可以使用 Cloud Run 直接从源代码部署 Node.js 应用。系统会在后台执行以下操作:

  • Cloud Run 会调用 Cloud Build 来构建容器映像(请参阅从源代码进行部署)。
  • 如果源代码目录中有 Dockerfile,Cloud Build 会使用它来构建容器映像。
  • 由于没有,Cloud Build 会调用 Buildpack 来分析源代码并自动生成可用于生产用途的映像。
  • Buildpack 会检测 package.json 清单并构建 Node.js 映像。
  • scripts.start 字段用于确定应用的启动方式。
  • engines.node 字段用于确定容器基础映像的 Node.js 版本。
  • 在部署时,系统会自动应用已知的安全修复。

您已准备好部署应用!

8. 部署应用

Slack Events API 使用 webhook 发送有关事件的出站消息。配置 Slack 应用时,您必须提供一个可公开访问的网址,供 Slack API 进行 ping 操作。

Cloud Run 是托管 webhook 目标的理想解决方案。它允许您使用任何喜欢的语言或运行时,并提供并发性,这意味着您的应用将能够处理更高的流量。

检索项目 ID

定义 PROJECT_ID 环境变量:

PROJECT_ID=$(gcloud config get-value core/project)

定义 Cloud Run 区域

Cloud Run 是区域级的,这意味着运行 Cloud Run 服务的基础架构位于特定区域,并且由 Google 托管,以便在该区域内的所有地区以冗余方式提供。定义您将用于部署的区域,例如:

REGION="us-central1"

更新权限

如需能够从 Secret Manager 中访问 Secret,Cloud Run 服务账号需要被授予 roles/secretmanager.secretAccessor 角色。

首先,将默认服务账号保存到环境变量中:

SERVICE_ACCOUNT=$(gcloud iam service-accounts list \
  --format "value(email)" \
  --filter "displayName:Compute Engine default service account")

确认您已保存电子邮件地址:

echo $SERVICE_ACCOUNT

服务账号的格式如下:PROJECT_NUMBER-compute@developer.gserviceaccount.com

获得电子邮件地址后,为服务账号启用该角色:

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member serviceAccount:$SERVICE_ACCOUNT \
  --role roles/secretmanager.secretAccessor

部署应用

Cloud Run 服务会公开唯一端点,并根据需要处理的传入请求数量自动扩缩底层基础架构。

将应用部署到 Cloud Run:

gcloud run deploy kittenbot \
  --source . \
  --platform managed \
  --region $REGION \
  --set-env-vars PROJECT_ID=$PROJECT_ID \
  --allow-unauthenticated
  • 这将创建一个名为 kittenbot 的服务。
  • --source 选项使用当前文件夹通过 Cloud Build 构建应用。Cloud Build 会自动检测 package.json 文件的存在。
  • 您也可以使用以下命令定义默认区域:gcloud config set run/region $REGION
  • 您还可以使用以下命令将 Cloud Run 默认设置为受管:gcloud config set run/platform managed
  • --set-env-vars 选项用于设置服务环境变量。
  • --allow-unauthenticated 选项可使服务公开可用。

首次执行此操作时,系统会提示您创建 Artifact Registry 代码库。点按 Enter 键进行验证:

Deploying from source requires an Artifact Registry Docker repository to store
built containers. A repository named [cloud-run-source-deploy] in region [REGION]
will be created.

Do you want to continue (Y/n)?

此命令会启动源代码向 Artifact Registry 代码库的上传以及容器映像的构建:

Building using Dockerfile and deploying container ...
* Building and deploying new service... Building Container.
  OK Creating Container Repository...
  OK Uploading sources...
  * Building Container... Logs are available at ...

然后,等待构建和部署完成。成功部署后,命令行中便会显示该服务的网址:

...
OK Building and deploying new service... Done.
  OK Creating Container Repository...
  OK Uploading sources...
  OK Building Container... Logs are available at ...
  OK Creating Revision... Creating Service.
  OK Routing traffic...
  OK Setting IAM Policy...
Done.
Service [SERVICE]... has been deployed and is serving 100 percent of traffic.
Service URL: https://SERVICE-PROJECTHASH-REGIONID.a.run.app

您可以使用以下命令获取服务网址:

SERVICE_URL=$( \
  gcloud run services describe kittenbot \
  --platform managed \
  --region $REGION \
  --format "value(status.url)" \
)
echo $SERVICE_URL

网址的格式如下:

https://kittenbot-PROJECTHASH-REGIONID.a.run.app

此网址将用作启用 Slack Events API 的基础。将其复制到剪贴板,以便在下一步中使用。

您的服务现已上线并可供公开访问!如需了解详情,请前往 Cloud Run 控制台fee46ea7c8483d56.png

您可以查看上次修订版本的创建时间、接收的流量,以及查看日志。如果我们点击进入日志,可以看到 Botkit 控制器已开启并准备好接收消息。

现在,我们开始从 Slack 频道发送消息!

9. 启用 Slack 事件

如前所述,我们的 kittenbot 代码为 webhook 目标指定了一个相对端点。

kittenbot.js

 const controller = new Botkit({
    webhook_uri: '/api/messages',
    adapter: adapter,
  });

这意味着,我们的完整网址将是 Cloud Run 服务中的基本部分加上 /api/messages

启用活动

应用管理页面中,前往边栏上的事件订阅部分,然后将启用事件切换为开启状态。输入您的服务网址:

PASTE_THE_SERVICE_URL/api/messages

5179a99339839999.png

系统可能会在您输入完网址之前尝试进行验证,具体取决于您输入网址的速度。如果失败,请点击“重试”。

订阅

订阅所有消息机器人事件。

1e8f200390908a9b.png

点击页面底部的保存更改。系统会提示您重新安装应用。按照提示操作,然后点击允许

至此,您的机器人已完全集成!工作区中的消息将触发 Slack 向您的 Cloud Run 服务发送消息,而 Cloud Run 服务会以简单的问候语作为回应。

10. 测试聊天机器人

向 Kittenbot 发送私信:

1f442dd7fd7b5773.png

输入“@kittenbot”,然后点击“邀请他们”,将 kittenbot 添加到您的频道:

9788d2167ce47167.png

现在,您频道中的所有人都可以与 Kittenbot 互动了!

9c0d1d7907a51767.png

Slack 中的每条消息都会触发一个事件,并向我们的 Cloud Run 服务发送 HTTP POST 消息。如果您查看 Cloud Run 服务日志,会发现每条消息都对应于日志中的一个 POST 条目。

1ff0c2347bf464e8.png

kittenbot 会以“喵”回复每条消息。😺”。

11. 奖励 - 更新聊天机器人

此可选部分应需要几分钟时间。您可以直接跳到“清理”部分。

对话串

我们希望机器人不仅能说“喵”。但如何部署在 Cloud Run 上运行的新版本?

转到 cloud-slack-bot/extra-credit 目录:

cd ../extra-credit/

在 Cloud Shell 编辑器中打开当前文件夹:

cloudshell workspace .

Botkit 能够处理对话。借助这些功能,机器人可以请求更多信息,并对消息做出回应,而不仅仅是回复一个字。

定义对话框

首先,请查看文件末尾的对话函数是如何定义的:

// ...
const maxCats = 20;
const catEmojis = [
  ':smile_cat:',
  ':smiley_cat:',
  ':joy_cat:',
  ':heart_eyes_cat:',
  ':smirk_cat:',
  ':kissing_cat:',
  ':scream_cat:',
  ':crying_cat_face:',
  ':pouting_cat:',
  ':cat:',
  ':cat2:',
  ':leopard:',
  ':lion_face:',
  ':tiger:',
  ':tiger2:',
];

/**
 * Function to concatenate cat emojis
 * @param {number} numCats Number of cat emojis.
 * @return {string} The string message of cat emojis.
 */
function makeCatMessage(numCats) {
  let catMessage = '';
  for (let i = 0; i < numCats; i++) {
    // Append a random cat from the list
    catMessage += catEmojis[Math.floor(Math.random() * catEmojis.length)];
  }
  return catMessage;
}

/**
 * Function to create the kitten conversation
 * @param {Object} controller The botkit controller.
 * @return {Object} The BotkitConversation object.
 */
function createKittenDialog(controller) {
  const convo = new BotkitConversation('kitten-delivery', controller);

  convo.ask('Does someone need a kitten delivery?', [
    {
      pattern: 'yes',
      handler: async (response, convo, bot) => {
        await convo.gotoThread('yes_kittens');
      },
    },
    {
      pattern: 'no',
      handler: async (response, convo, bot) => {
        await convo.gotoThread('no_kittens');
      },
    },
    {
      default: true,
      handler: async (response, convo, bot) => {
        await convo.gotoThread('default');
      },
    },
  ]);

  convo.addQuestion(
    'How many would you like?',
    [
      {
        pattern: '^[0-9]+?',
        handler: async (response, convo, bot, message) => {
          const numCats = parseInt(response);
          if (numCats > maxCats) {
            await convo.gotoThread('too_many');
          } else {
            convo.setVar('full_cat_message', makeCatMessage(numCats));
            await convo.gotoThread('cat_message');
          }
        },
      },
      {
        default: true,
        handler: async (response, convo, bot, message) => {
          if (response) {
            await convo.gotoThread('ask_again');
          } else {
            // The response '0' is interpreted as null
            await convo.gotoThread('zero_kittens');
          }
        },
      },
    ],
    'num_kittens',
    'yes_kittens'
  );

  // If numCats is too large, jump to start of the yes_kittens thread
  convo.addMessage(
    'Sorry, {{vars.num_kittens}} is too many cats. Pick a smaller number.',
    'too_many'
  );
  convo.addAction('yes_kittens', 'too_many');

  // If response is not a number, jump to start of the yes_kittens thread
  convo.addMessage("Sorry I didn't understand that", 'ask_again');
  convo.addAction('yes_kittens', 'ask_again');

  // If numCats is 0, send a dog instead
  convo.addMessage(
    {
      text:
        'Sorry to hear you want zero kittens. ' +
        'Here is a dog, instead. :dog:',
      attachments: [
        {
          fallback: 'Chihuahua Bubbles - https://youtu.be/s84dBopsIe4',
          text: '<https://youtu.be/s84dBopsIe4|' + 'Chihuahua Bubbles>!',
        },
      ],
    },
    'zero_kittens'
  );

  // Send cat message
  convo.addMessage('{{vars.full_cat_message}}', 'cat_message');

  convo.addMessage('Perhaps later.', 'no_kittens');

  return convo;
}

这个新对话会根据回答引导对话串。例如,如果用户对“小猫”问题回答“否”,则会跳转到标记为“no_kittens”的消息,该消息是相应对话线程的结尾。

将对话框添加到控制器

对话定义完毕后,请参阅如何将其添加到控制器:

async function kittenbotInit() {
  // ...
  const controller = new Botkit({
    webhook_uri: '/api/messages',
    adapter: adapter,
  });

  // Add Kitten Dialog
  const convo = createKittenDialog(controller);
  controller.addDialog(convo);

  // Controller is ready
  controller.ready(() => {
    // ...
  });
}

触发对话框

现在,控制器可以使用该对话框了。请看当聊天机器人听到“kitten”“kittens”“cat”或“cats”时,对话是如何开始的:

  // ...

  controller.ready(() => {
    controller.hears(
      ['hello', 'hi', 'hey'],
      ['message', 'direct_message'],
      async (bot, message) => {
        await bot.reply(message, 'Meow. :smile_cat:');
        return;
      }
    );

    // START: listen for cat emoji delivery
    controller.hears(
      ['cat', 'cats', 'kitten', 'kittens'],
      ['message', 'direct_message'],
      async (bot, message) => {
        // Don't respond to self
        if (message.bot_id !== message.user) {
          await bot.startConversationInChannel(message.channel, message.user);
          await bot.beginDialog('kitten-delivery');
          return;
        }
      }
    );
    // END: listen for cat emoji delivery

    // ...
  });

  // ...

更新应用

将应用重新部署到 Cloud Run:

gcloud run deploy kittenbot \
  --source . \
  --platform managed \
  --region $REGION \
  --set-env-vars PROJECT_ID=$PROJECT_ID \
  --allow-unauthenticated

试试看

eca12b3463850d52.png

恭喜!您刚刚将 Cloud Run 上运行的 Slack 机器人更新到了新版本。

斜杠命令

如果您不想与用户对话,该怎么办?如果您希望通过一条简单命令触发操作,该怎么办?

Slack 通过斜杠命令提供此功能,用户只需在消息框中输入命令,即可调用您的应用。

启用 Slack 斜杠命令

  • 在应用管理页面上,前往功能下的斜杠命令部分。
  • 点击创建新命令
  • 使用您的 kittenbot 服务网址配置 /cats 命令。请务必使用您之前用于启用 Events API 的同一端点!这是您的网址,加上 '/api/messages'

e34d393c14308f28.png

  • 按照提示更新应用和权限。

向控制器添加斜杠命令

请参阅如何在 controller.ready 函数内添加斜杠命令的处理程序:

  // ...

  // Controller is ready
  controller.ready(() => {
    // ...

    // START: slash commands
    controller.on('slash_command', async (bot, message) => {
      const numCats = parseInt(message.text);
      const response = makeCatMessage(numCats);
      bot.httpBody({ text: response });
    });
    // END: slash commands
  });

  // ...

试试看

输入“/cats”加一个数字即可发送斜杠命令。例如:/cats 8

c67f6fe1ffcafec8.png

机器人将回复 8 张猫的照片,只有您自己可以看到:

9c1b256987fd379a.png

12. 清理

恭喜,您现在已在 Cloud Run 上运行 Slack 机器人。现在该清理一下所用的资源了(以节省成本,践行良好的云资源管理实践)。

删除项目

您可以直接从 Cloud Shell 中删除整个项目:

gcloud projects delete $PROJECT_ID

或者,如果您想逐个删除不同的资源,请继续学习下一部分。

删除部署

gcloud run services delete kittenbot --region $REGION

命令输出

Service [kittenbot] will be deleted.
Do you want to continue (Y/n)?  y
Deleted service [kittenbot].

删除客户端签名密钥

gcloud secrets delete client-signing-secret

命令输出

You are about to destroy the secret [client-signing-secret] and its
[1] version(s). This action cannot be reversed.
Do you want to continue (Y/n)?  y
Deleted secret [client-signing-secret].

删除机器人令牌密钥

gcloud secrets delete bot-token

命令输出

You are about to destroy the secret [bot-token] and its [1]
version(s). This action cannot be reversed.
Do you want to continue (Y/n)?  y
Deleted secret [bot-token].

删除存储分区

首先,列出 Google Cloud Storage 存储分区以获取存储分区路径:

gsutil ls

命令输出

gs://[REGION.]artifacts.<PROJECT_ID>.appspot.com/
gs://<PROJECT_ID>_cloudbuild/

现在,删除制品存储分区:

gsutil rm -r gs://[REGION.]artifacts.${PROJECT_ID}.appspot.com/

命令输出

Removing gs://[REGION.]artifacts.<PROJECT_ID>.appspot.com/...

最后,删除 cloudbuild 存储分区:

gsutil rm -r gs://${PROJECT_ID}_cloudbuild/

命令输出

Removing gs://<PROJECT_ID>_cloudbuild/...

13. 恭喜!

528302981979de90.png

现在,您已经知道如何在 Cloud Run 上运行 Slack 机器人了!

我们只是初步了解了这项技术,建议您通过自己的 Cloud Run 部署进一步探索。

所学内容

  • 在 Slack 中创建聊天机器人自定义集成
  • 使用 Secret Manager 保护 Slack 密文
  • 在 Cloud Run 上部署 Slack 机器人

后续步骤

了解详情

  • 查看 GitHub 上其他 Google Cloud Slack 集成示例
  • 试用其他 Google Cloud 功能。查阅我们的教程