虎の穴開発室ブログ

虎の穴ラボ株式会社所属のエンジニアが書く技術ブログです

MENU

Lambda関数URLを使ってお手軽に作るSlackの自動返答アプリ

こんにちは! 虎の穴ラボのS.Sです。
2022年4月にLambdaに新しくLambda関数URLの機能がリリースされました。
早速試したいと思い、この新機能であるLambda関数URL を使ってSlackアプリを開発してみました。

目次

はじめに

まずはじめに今回作成するSlackアプリの内容ですが、特定のチャンネルにて「退勤します」と発言したら、それを検知して「お疲れ様でした」と自動で返答してくれるアプリを作成します。
特定のチャンネルにて発言があったらSlack APIにて、Lambda関数にアクセスして、発言内容の判別と自動返答の処理を行います。
今までですと、外部からLambdaの関数を呼び出すためには、API GatewayでREST APIを作成して、API GatewayでLambdaの関数を呼び出していました。


しかし、今回の新機能であるLambda関数URLのリリースにより、直接Lambda関数を実行できるURLが発行できるようになったため、わざわざAPI GatewayでREST APIを作成する必要がなくなりました。


では、Slack アプリの作成から実際に行っていきましょう。

Slack アプリの新規作成

https://api.slack.com/apps
上記URLからSlack アプリの作成ページに遷移して「Create New App」を押下します。


作成するアプリ名とアプリを動かす、Slackのワークスペースを選択し「Create App」を押下します。これでSlack アプリが作成されます。


Lambdaの関数を作成

次にLambdaの関数を作成します。
https://console.aws.amazon.com/console/home
上記URLにてAWSコンソールにログインして、Lambdaのページから「関数の作成」を押下します。


関数名など関数の初期設定を行います。今回、ランタイム(開発言語)は「Node.js 14.x」にて作成しました。


すると関数の開発が出来る状態になるので、早速テストコードで動かしてみたいと思います。
内容はシンプルに関数にアクセスされたら「Hello world」を返します。

exports.handler = async (event) => {
    const response = {
        statusCode: 200,
        body: 'Hello world',
    };
    return response;
};

Lambdaの関数URLの作成

次に作成したLambda関数を呼び出すための関数URLの作成を行います。
「設定」から「関数URL」>「関数URLを作成」を押下します。


作成する関数URLの設定を行います。
今回は、パブリックにアクセスを許可したいので認証タイプは「NONE」を選択します。


設定を保存すると関数にアクセスするためのURLが発行されます。


発行されたURLにブラウザ、もしくはcurlコマンドにてアクセスするとLambda関数が実行され、実行結果が返ってきます。


SlackアプリからLambda関数URLにアクセスする

次にSlackアプリからLambda関数URLにアクセスさせるために、Slackアプリ側でChallenge認証を行います。
アクセスしたいURLをSlackアプリに設定するとSlackは、認証に必要なchallengeパラメータを含むリクエストが送信されますので、そのリクエストをそのまま返します。
Lambda関数に以下のコードを組み込みます。

exports.handler = async (event) => {
    const response = {
        statusCode: 200,
        // リクエスト内容をそのまま返す
        body: JSON.stringify(event.body),
    };
    return response;
};

Slackアプリの画面に戻り、左メニューから「Event Subscriptions」を選択し「Enable Events」を有効にします。


発行したLambda関数URLを入力します。するとリクエストが送信され、Challenge認証が行われます。


Challenge認証が成功すると「Verified」が表示されます。これにより、 SlackアプリからLambda関数URLにアクセスが可能になりました。


Slackのチャンネルに書き込みがあった際のイベント設定

Slackのチャンネルに書き込みがあった際にイベントを発火させるための設定を行います。
左メニューから「Event Subscriptions」>「Subscribe to bot events」に遷移します。
今回は、特定のプライベートチャンネルに書き込みがあった際にイベントを発火させるために「Add Bot User Event」から「message.groups」を追加します


Webhook URLの取得

次に、Lambda関数からSlackに投稿するため必要なWebhook URLの取得を行います。
左メニューから「Incoming Webhooks」に遷移して「Activate Incoming Webhooks」を有効にします。


すると画面が展開され、Webhook URLが取得出来る状態になるので「Webhook URLs for Your Workspace」の「Add New Webhook to Workspace」からWebhook URLの取得を行います。


ワークスペースのアクセス権限の認証とアクセスを許可したいチャンネルを選択します。


すると、Webhook URLが発行されます。このURLを使ってLambda関数からSlackに投稿します。


Slackの発言内容に応じてLambdaで自動返答させる

これで、準備が整いましたので、Lambda関数でSlackでの発言内容を見て、自動応答するコードを組みます。

const https = require("https");
const url = require("url");
// Webhook URLを設定 
const slackWebhookUrl = "https://hooks.slack.com/services/*******/*********/******";  

exports.handler = function (event) {
  console.log("event:", event);
  // bodyパラメータの中にJSON形式で投稿内容が格納されているので、取り出す
  const jsonBodyObject = JSON.parse(event.body);
  const input_text = jsonBodyObject.event.text;

  let requestOptions = url.parse(slackWebhookUrl);
  // 返答する内容
  const bodyText = {
    text: "お疲れ様でした",
  };
  const body = JSON.stringify(bodyText);
  requestOptions.method = "POST";
  requestOptions.headers = {
    "Content-Type": "application/json",
    "Content-Length": Buffer.byteLength(body),
  };
  
  // パターン文字列
  const pattern = "退勤します";

  // 投稿内容に、パターン文字列が含まれていたら、Slackに返答を投稿する
  if (input_text.indexOf(pattern) !== -1) {
    let request = https.request(requestOptions, function (response) {
      if (response.statusCode === 200) {
        console.log("Posted to slack");
      }
      return response;
    });
    request.write(body);
    request.end();
  }
};

デプロイ後、Slackにてアクセス許可したチャンネルで「退勤します」と投稿すると「お疲れ様でした」と自動で返答が返ってきます。
これで完成です。

おわりに

今回は、リリースされましたLambda関数URLの動作確認がてら、Slackの自動返答アプリを作成してみました。
Lambda関数を呼び出すための関数URLが、画面上から簡単に取得出来るので、Lambdaを使ったアプリの開発がかなりやり易くなったと感じました。
皆様もぜひお試しください。

P.S.

虎の穴ラボでは、私たちと一緒に新しいオタク向けサービスを作る仲間を募集しています。
詳しい採用情報は以下をご覧ください。
yumenosora.co.jp