今度はSlackからLambdaに挨拶してみよう

tkmi
2025-03-11
2025-03-11
SlackのチャットウィンドウとLambdaのコードエディタが並んで表示されている画像

お疲れ様です。tkmiです。
Lambda&Slack連携の続きです。前回はLambdaからSlackに挨拶してもらいましたので、今回は
Slackから挨拶してLambdaに応えてもらいましょう。

Lambdaのコードを修正して挨拶応答機能を追加

まず、現在のLambdaコードを修正します。Slackからのメッセージを受け取り、以下のように対応して返答するようにします。
slack_sdkはダウンロードしてコードに含めるようにします。

  • おはよう
    →おはようございます!
  • こんにちは
    →こんにちは!
  • こんばんは
    →こんばんは!
  • それ以外
    →お疲れ様です!
import os
import json
import re
from slack_sdk import WebClient
from slack_sdk.errors import SlackApiError

# 環境変数からSlackボットのトークンを取得
SLACK_BOT_TOKEN = os.getenv("SLACK_BOT_TOKEN")

slack_client = WebClient(token=SLACK_BOT_TOKEN)

def lambda_handler(event, context):
    # body の取得とパース
    body = json.loads(event.get("body", "{}"))

    # Slackのチャレンジリクエスト対応
    if "challenge" in body:
        return {"statusCode": 200, "body": body["challenge"]}

    slack_event = body.get("event", {})
    message_text = slack_event.get("text")
    channel_id = slack_event.get("channel")

    if message_text and channel_id:
        try:
            slack_client.chat_postMessage(channel=channel_id, text=get_greeting(message_text))
        except SlackApiError as e:
            print(f"Error sending message: {e.response['error']}")

    return {"statusCode": 200, "body": json.dumps({"message": "OK"})}

def get_greeting(message_text):
    greetings = {
        "おはよう": "おはようございます!",
        "こんにちは": "こんにちは!",
        "こんばんは": "こんばんは!"
    }
    target = re.sub(r'<@\w+>', '', message_text).strip()
    return greetings.get(target, "お疲れ様です!")

ついでに余分なコードとか削除してリファクタリングしました。

Lambdaの関数URLを作成してSlackと連携

次に、Lambda関数のURLを作成します。これにより、SlackからのリクエストをLambda関数が受け取ることができるようになります。

AWSマネジメントコンソールでLambda関数の設定を開き、「関数URLを作成」をクリックします。

今回、認証タイプは「NONE」を選択しますが、URLがわかれば誰でもアクセスできてしまうので気を付けましょう。

URLをコピーしておきます。このURLは後ほどSlackアプリの設定で使用します。

Slackアプリの設定を更新

Slackアプリの「Event Subscriptions」設定を開きます。
ここではSlack内のメンションを検知して、先ほどのLambda関数のURLにリクエストを送る設定を行います。
これにより、Slackからのメッセージが自動的にLambda関数に送信されるようになります。

  1. Enable Eventsを「On」にします。
  2. Request URLに先ほどコピーしたLambda関数のURLをセットします。
    →接続の確認のため「Challenge認証」を行い、「Verified」が表示されたらOKです。

さらに「OAuth&Permissions」を開き、Scopes→Bot Token Scopesでメッセージの読み取りと書き込みが許可されていることを確認します。

SlackAppに設定を適用するために再インストールを求められるので、適用します。

最後にOAuth Tokensから「Bot User OAuth Token」をコピーし、Lambda関数の環境変数「SLACK_BOT_TOKEN」を作成してセットします。

Slackから挨拶してみよう!

すべての設定が完了したら、で挨拶メッセージを送信してみましょう。Slackのチャネルで「こんにちは」とメッセージを送信し、Lambdaからの自動応答が返ってくることを確認します。
もし応答が返ってこない場合は、CloudWatchのログを確かめて修正しましょう。