このチュートリアルでは Cloud Run functions を使用して、Google Knowledge Graph API を検索する Slack スラッシュ コマンドの実装方法について説明します。
データの流れ
Slack のスラッシュ コマンドのチュートリアル アプリケーションでのデータの流れでは、次の手順が行われます。
- ユーザーが Slack チャネルで
/kg <search_query>
スラッシュ コマンドを実行します。 - Slack がコマンドのペイロードを関数のトリガー エンドポイントに送信します。
- 関数がユーザーの検索クエリとともにリクエストを Knowledge Graph API に送信します。
- Knowledge Graph API は、レスポンスで一致した結果を返します。
- 関数はフォーマット化したレスポンス内容を Slack メッセージに保存します。
- 関数はメッセージを Slack に送信します。
- ユーザーは Slack チャンネルでフォーマット化されたレスポンスを確認します。
次はこの手順を可視化した図です。
Knowledge Graph API キーの作成
Google Cloud コンソールの [認証情報] ページで、[認証情報の作成] ボタンをクリックして [API キー] を選択します。このキーは、次のセクションで Knowledge Graph API にアクセスするときに使用します。
関数の準備
ローカルマシンにサンプルアプリのリポジトリのクローンを作成します。
Node.js
git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git
または、zip 形式のサンプルをダウンロードし、ファイルを抽出してもかまいません。
Python
git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
または、zip 形式のサンプルをダウンロードし、ファイルを抽出してもかまいません。
Go
git clone https://github.com/GoogleCloudPlatform/golang-samples.git
または、zip 形式のサンプルをダウンロードし、ファイルを抽出してもかまいません。
Java
git clone https://github.com/GoogleCloudPlatform/java-docs-samples.git
または、zip 形式のサンプルをダウンロードし、ファイルを抽出してもかまいません。
Ruby
git clone https://github.com/GoogleCloudPlatform/ruby-docs-samples.git
または、zip 形式のサンプルをダウンロードしてファイルを抽出してもかまいません。
Cloud Run functions のサンプルコードが含まれているディレクトリに移動します。
Node.js
cd nodejs-docs-samples/functions/slack/
Python
cd python-docs-samples/functions/slack/
Go
cd golang-samples/functions/slack/
Java
cd java-docs-samples/functions/slack/
Ruby
cd ruby-docs-samples/functions/slack/
関数のデプロイ
ユーザー(または Slack)が関数のエンドポイントに HTTP POST リクエストを送信したときに実行される関数をデプロイするには、サンプルコード(または Java の pom.xml
ファイル)を含むディレクトリで次のコマンドを実行します。
YOUR_SLACK_SIGNING_SECRET
は、アプリの構成の [Basic information] ページで、Slack から提供された署名シークレットに置き換えます。YOUR_KG_API_KEY
は、前に作成した Knowledge Graph API Key で置き換えます。
Node.js
gcloud functions deploy kgSearch \ --runtime nodejs22 \
--trigger-http \
--set-env-vars "SLACK_SECRET=YOUR_SLACK_SIGNING_SECRET
,KG_API_KEY=YOUR_KG_API_KEY
" \
--allow-unauthenticated
サポートされている Node.js バージョンのランタイム ID を指定して関数を実行するには、--runtime
フラグを使用します。
Python
gcloud functions deploy kg_search \ --runtime python312 \
--trigger-http \
--set-env-vars "SLACK_SECRET=YOUR_SLACK_SIGNING_SECRET
,KG_API_KEY=YOUR_KG_API_KEY
" \
--allow-unauthenticated
サポートされている Python バージョンのランタイム ID を指定して関数を実行するには、--runtime
フラグを使用します。
Go
gcloud functions deploy KGSearch \ --runtime go121 \
--trigger-http \
--set-env-vars "SLACK_SECRET=YOUR_SLACK_SIGNING_SECRET
,KG_API_KEY=YOUR_KG_API_KEY
" \
--allow-unauthenticated
サポートされている Go バージョンのランタイム ID を指定して関数を実行するには、--runtime
フラグを使用します。
Java
gcloud functions deploy java-slack-function \ --entry-point functions.SlackSlashCommand \ --runtime java17 \ --memory 512MB \
--trigger-http \
--set-env-vars "SLACK_SECRET=YOUR_SLACK_SIGNING_SECRET
,KG_API_KEY=YOUR_KG_API_KEY
" \
--allow-unauthenticated
サポートされている Java バージョンのランタイム ID を指定して関数を実行するには、--runtime
フラグを使用します。
Ruby
gcloud functions deploy kg_search --runtime ruby33 \
--trigger-http \
--set-env-vars "SLACK_SECRET=YOUR_SLACK_SIGNING_SECRET
,KG_API_KEY=YOUR_KG_API_KEY
" \
--allow-unauthenticated
サポートされている Ruby バージョンのランタイム ID を指定して関数を実行するには、--runtime
フラグを使用します。
アプリケーションの構成
関数をデプロイした後、Slack スラッシュ コマンドを作成する必要があります。このコマンドがトリガーされるたびに関数にクエリが送信されます。
Slack のスラッシュ コマンドをホストする Slack アプリを作成します。統合のインストール権限が与えられている Slack チームにそれを関連付けます。
[Slash commands] に移動し、[Create new command] ボタンをクリックします。
コマンドの名前として「
/kg
」を入力します。コマンドの URL を入力します。
Node.js
https://YOUR_REGION-YOUR_PROJECT_ID.cloudfunctions.net/kgSearch
Python
https://YOUR_REGION-YOUR_PROJECT_ID.cloudfunctions.net/kg_search
Go
https://YOUR_REGION-YOUR_PROJECT_ID.cloudfunctions.net/KGSearch
Java
https://YOUR_REGION-YOUR_PROJECT_ID.cloudfunctions.net/java-slack-function
Ruby
https://YOUR_REGION-YOUR_PROJECT_ID.cloudfunctions.net/kg_search
ここで、
YOUR_REGION
は、関数がデプロイされているリージョンであり、YOUR_PROJECT_ID
は Cloud プロジェクト ID です。関数のデプロイが完了すると、両方の値がターミナルに表示されます。
[保存] をクリックします。
[Basic Information] に移動します。
[Install your app to your workspace] をクリックし、画面の指示に従って、ワークスペース用にアプリケーションを有効にします。
少し待つと、Slack Slash コマンドがオンラインになります。
コードについて
依存関係をインポートする
アプリケーションが Google Cloud Platform サービスとやり取りするには、いくつかの依存関係をインポートする必要があります。
Node.js
Python
Go
Java
Ruby
Webhook の受信
ユーザー(または Slack)が関数のエンドポイントに HTTP POST リクエストを送信すると、次の関数が実行されます。
Node.js
Python
Go
Java
Ruby
次の関数は、Slack から提供された X-Slack-Signature
ヘッダーを検証することで、受信リクエストを認証します。
Node.js
Python
Go
Java
Ruby
Knowledge Graph API のクエリ作成
次の関数はユーザーの検索クエリとともにリクエストを Knowledge Graph API に送信します。
Node.js
Python
Go
Java
Ruby
Slack メッセージのフォーマット化
最後に、次の関数は Knowledge Graph の結果をフォーマット化し、ユーザーに表示される適切な形式の Slack メッセージにします。
Node.js
Python
Go
Java
Ruby
Slack API のタイムアウト
Slack API では、関数が Webhook リクエストを受け取ってから 3 秒以内に応答することが想定されています。
通常、このチュートリアルのコマンドは 3 秒以内に応答します。実行時間が長いコマンドの場合、タスクキューとして機能する Pub/Sub トピックに(リクエストの response_url
を含む)リクエストを push する関数を構成することをおすすめします。
この構成によって、2 番目の関数を作成して Pub/Sub によってトリガーすることで、それらのタスクを処理し、Slack の response_url
に結果を送信できます。
Slash コマンドの使用
Slack チャンネルにコマンドを入力します。
/kg giraffe
実行した内容が完了していることをログで確認します。
gcloud functions logs read --limit 100