Cloud Run で Node.js を使用して Slack bot を構築する

1. 概要

5f529fb87abc11c9.png

この Codelab では、Botkit Toolkit を使用して Slack ボットを作成し、Google Cloud で実行する方法を学びます。Slack のライブ チャンネルで、ボットとやりとりできるようになります。

学習内容

  • Slack で bot のカスタム統合を作成する方法
  • Secret Manager で Slack シークレットを保護する方法
  • ステートレス コンテナを自動的にスケールするフルマネージド コンピューティング プラットフォームである Cloud Run に Slack bot をデプロイする方法

必要なもの

  • Google Cloud プロジェクト
  • ブラウザ(ChromeFirefox など)

このチュートリアルの利用方法をお選びください。

通読するのみ 通読し、演習を行う

Google Cloud の使用経験をどのように評価されますか。

<ph type="x-smartling-placeholder"></ph> 初心者 中級 上達 をご覧ください。

2. 設定と要件

セルフペース型の環境設定

  1. Google Cloud Console にログインして、プロジェクトを新規作成するか、既存のプロジェクトを再利用します。Gmail アカウントも Google Workspace アカウントもまだお持ちでない場合は、アカウントを作成してください。

98e4187c97cf2e0e.png

37d264871000675d.png

c20a9642aaa18d11.png

  • プロジェクト名は、このプロジェクトの参加者に表示される名称です。Google API では使用されない文字列です。いつでも更新できます。
  • プロジェクト ID は、すべての Google Cloud プロジェクトにおいて一意でなければならず、不変です(設定後は変更できません)。Cloud コンソールでは一意の文字列が自動生成されます。通常は、この内容を意識する必要はありません。ほとんどの Codelab では、プロジェクト ID(通常は PROJECT_ID と識別されます)を参照する必要があります。生成された ID が好みではない場合は、ランダムに別の ID を生成できます。または、ご自身で試して、利用可能かどうかを確認することもできます。このステップ以降は変更できず、プロジェクトを通して同じ ID になります。
  • なお、3 つ目の値として、一部の API が使用するプロジェクト番号があります。これら 3 つの値について詳しくは、こちらのドキュメントをご覧ください。
  1. 次に、Cloud のリソースや API を使用するために、Cloud コンソールで課金を有効にする必要があります。この Codelab の操作をすべて行って、費用が生じたとしても、少額です。このチュートリアルの終了後に請求が発生しないようにリソースをシャットダウンするには、作成したリソースを削除するか、プロジェクトを削除します。Google Cloud の新規ユーザーは、300 米ドル分の無料トライアル プログラムをご利用いただけます。

Cloud Shell の起動

Google Cloud はノートパソコンからリモートで操作できますが、このチュートリアルでは、クラウド上で動作するコマンドライン環境である Cloud Shell を使用します。

Cloud Shell をアクティブにする

  1. Cloud Console で、[Cloud Shell をアクティブにする] d1264ca30785e435.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、Cloud Build、Cloud Run、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 では、簡単な挨拶メッセージを投稿する bot を作成します。

新しい Slack アプリを作成する

  • Slack アプリの管理ページに移動します。
  • 右上にある [Create new app] ボタンをクリックします。
  • アプリに名前を付けます(「Kittenbot」など)。
  • アプリをインストールする Slack チームを選択します。

bot ユーザーを作成する

  • 左側のパネルで [機能] の下にある [App Home] に移動します。

414213b184fcc992.png

  • [Review Scopes to Add] をクリックして、bot トークンにスコープを割り当てます。
  • [Bot Token Scopes] まで下にスクロールし、[Add an OAuth Scope] をクリックします。chat:write を選択して「Kittenbot としてメッセージを送信」します

74a6fa87c64c2b23.png

  • 上にスクロールし、[Install App to your Workspace] ボタンをクリックします。
  • これにより、アプリがチームにインストールされ、先ほど作成した bot ユーザーが追加され、bot トークンが生成されます。
  • プロンプトが表示されたら、[許可] をクリックします。bot にワークスペースでのチャットを許可します。

メッセージとコマンドを有効にする

  • [タブを表示] まで下にスクロールして、両方のオプションが有効になっていることを確認します。

5ca52f7abbdc15c.png

クライアントの署名シークレットを取得する

  • [設定] の [基本情報] に移動します。
  • [署名シークレット] までスクロールし、[表示] をクリックして、シークレットをクリップボードにコピーします。

74cfd6616fa71dc4.png

  • シークレットを環境変数に保存します。
CLIENT_SIGNING_SECRET=PASTE_THE_SIGNING_SECRET

bot トークンを取得する

  • [OAuth と権限をご覧ください。
  • [Copy] ボタンをクリックして、[Bot User OAuth Access Token] のテキストをクリップボードにコピーします。

6f5a18069471101.png

  • bot トークンを環境変数に保存します。
BOT_TOKEN=PASTE_THE_BOT_TOKEN

ご安心ください。トークンを再度取得する必要がある場合は、 [アプリ管理] ページ からこの構成ページに戻ることができます。

6. Secret を保護する

Google では、bot トークンとクライアント署名シークレットを安全に保管したいと考えています。シークレットをソースコードにハードコードすると、シークレットをバージョン管理に公開したり、Docker イメージに埋め込んだりして、誤って公開してしまう可能性が高くなります。

Secret Manager は、API キー、パスワード、証明書、その他の機密データを保存するための安全で便利な手段を提供します。Secret Manager は、Google Cloud 全体のシークレットを一元的に管理、アクセス、監査するための信頼できる唯一の情報源を提供します。

シークレットを作成する

次のコマンドを使用して、クライアントの署名シークレットと bot トークンを保存します。

  • クライアント署名シークレット
echo -n $CLIENT_SIGNING_SECRET | gcloud secrets create client-signing-secret \
  --replication-policy automatic \
  --data-file -
  • bot トークン
echo -n $BOT_TOKEN | gcloud secrets create bot-token \
  --replication-policy automatic \
  --data-file -

Secret にアクセスする

シークレットが適切に作成され、権限が機能していることを確認します。次のコマンドを使用して、シークレットにアクセスします。

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

Google Cloud コンソールでシークレットを表示して管理することもできます。

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 など)を使用するか、次のコマンドを使用して現在のフォルダを Cloud Shell エディタで直接開きます。kittenbot.js ファイル

cloudshell workspace .

kittenbot コードには主に 2 つの機能があります。1 つはシークレットの取得で、もう 1 つは bot の実行です。

まず、依存関係をインポートします。

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 との間でメッセージを簡単に翻訳できます。Secret Manager クライアントを使用すると、前の手順で保存したシークレットにアクセスできます。

次に、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;
}

この関数は、bot の認証に必要なシークレットの文字列値を返します。

次の関数は bot を初期化します。

/**
 * 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 を構成し、メッセージを受信するためのエンドポイントを指定します。コントローラがオンになると、bot は「hello」、「hi」、「hey」を含むすべてのメッセージに返信します。「ニャー。❯」です。

アプリ マニフェストの次の部分を確認してください。

package.json

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

Cloud Run を使用すると、Node.js アプリをソースから直接デプロイできます。内部的には、次の処理が行われます。

  • Cloud Run は Cloud Build を呼び出してコンテナ イメージをビルドします(ソースコードからのデプロイをご覧ください)。
  • Dockerfile がソースコード ディレクトリに存在する場合、Cloud Build はそれを使用してコンテナ イメージをビルドします。
  • そうでなければ、Cloud Build は Buildpack を呼び出してソースを分析し、本番環境に対応したイメージを自動生成します。
  • Buildpacks は package.json マニフェストを検出し、Node.js イメージをビルドします。
  • scripts.start フィールドでは、アプリの起動方法を指定します。
  • engines.node フィールドでは、コンテナ ベースイメージの Node.js バージョンを決定します。
  • デプロイ時に、既知のセキュリティ修正が自動的に適用されます。

アプリをデプロイする準備が整いました。

8. アプリをデプロイする

Slack Events API は、Webhook を使用してイベントに関する送信メッセージを送信します。Slack アプリを構成するときに、Slack API が ping できるように、一般公開されている URL を指定する必要があります。

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 からシークレットにアクセスするには、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 コマンドを使用してデフォルトのリージョンを定義することもできます。
  • また、gcloud config set run/platform managed コマンドを使用して、デフォルトで Cloud Run を管理することもできます。
  • --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 ...

ビルドとデプロイが完了するまで待ちます。成功すると、コマンドラインにサービス URL が表示されます。

...
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

サービス URL は、次のコマンドで取得できます。

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

URL の形式は次のとおりです。

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

この URL は、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,
  });

つまり、完全な URL が Cloud Run サービスのベース部分に /api/messages を加えたものになります。

イベントを有効にする

アプリ管理ページで、サイドバーの [Events Subscriptions] セクションに移動し、[Enable Events] をオンにします。サービス URL を入力します。

PASTE_THE_SERVICE_URL/api/messages

5179a99339839999.png

URL の入力速度によっては、完了前に確認が行われることがあります。失敗した場合は、[再試行] をクリックします。

チャンネル登録

すべての Message bot イベントに登録します。

1e8f200390908a9b.png

ページの下部にある [変更を保存] をクリックします。[Reinstall Your App] というメッセージが表示されます。メッセージに沿って [許可] をクリックします。

この時点で、bot は完全に統合されています。ワークスペース内のメッセージによって、Slack は Cloud Run サービスにメッセージを送信します。このサービスは、シンプルな挨拶で応答します。

10. bot をテストする

Kittenbot にダイレクト メッセージを送信します。

1f442dd7fd7b5773.png

チャンネルに kittenbot を追加するには、「@kittenbot」と入力します[招待] をクリックします。

9788d2167ce47167.png

これで、チャンネル内のすべてのユーザーが Kittenbot とやり取りできるようになりました。

9c0d1d7907a51767.png

Slack の各メッセージはイベントをトリガーし、HTTP POST メッセージを Cloud Run サービスに送信します。Cloud Run サービスのログを確認すると、各メッセージがログ内の POST エントリに対応していることがわかります。

1ff0c2347bf464e8.png

kittenbot はメッセージごとに「ニャー。❯」です。

11. 参考 - bot をアップデートする

このオプションの所要時間は数分です。スキップして直接クリーンアップにスキップしていただいてもかまいません。

会話スレッド

このボットには、「ニャー」以外のことをさせたいと思っています。では、Cloud Run で実行されるサービスの新しいバージョンをデプロイするにはどうすればよいでしょうか。

ディレクトリを cloud-slack-bot/extra-credit に変更します。

cd ../extra-credit/

Cloud Shell エディタで現在のフォルダを開きます。

cloudshell workspace .

Botkit は、会話を処理する機能を提供します。これにより、ボットはより多くの情報をリクエストし、1 語よりも長い返信でメッセージに対応します。

ダイアログを定義する

まず、ファイルの最後に会話関数がどのように定義されているかを確認します。

// ...
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(() => {
    // ...
  });
}

ダイアログをトリガーする

コントローラがダイアログを使用できるようになったので、chatbot が「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 ボットを新しいバージョンに更新しました。

スラッシュ コマンド

ユーザーとの会話を望まない場合はどうすればよいでしょうか。1 つのシンプルなコマンドでアクションをトリガーしたい場合はどうすればよいでしょうか。

Slack では、スラッシュ コマンドを使用してこの機能を提供している。ユーザーはメッセージ ボックスにコマンドを入力してアプリケーションを呼び出すことができる。

Slack スラッシュ コマンドを有効にする

  • アプリ管理ページの [機能] の下にある [スラッシュ コマンド] セクションに移動します。
  • [新しいコマンドを作成] をクリックします。
  • kittenbot のサービス URL を使用して /cats コマンドを構成します。Events API を有効にしたときと同じエンドポイントを使用してください。URL に '/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

bot は、あなたにだけ表示される 8 匹の猫で応答します。

9c1b256987fd379a.png

12. クリーンアップ

これで、Cloud Run で Slack ボットが動作しました。使用したリソースをクリーンアップします(費用とリソースの節約のため)。

プロジェクトを削除する

プロジェクト全体を Cloud Shell から直接削除できます。

gcloud projects delete $PROJECT_ID

または、異なるリソースを 1 つずつ削除する場合は、次のセクションに進みます。

デプロイメントを削除する

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].

bot トークンのシークレットを削除する

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 で bot のカスタム統合を作成する
  • Secret Manager で Slack シークレットを保護する
  • Cloud Run に Slack ボットをデプロイする

次のステップ

詳細