/ #cdk #python 

もっとシンプルにBolt+CDK+PythonでSlackBotを作る

もくじ

シルバーウィークにBoltのコードを読んでいたら 以前の記事よりずっとシンプルに作れることに気が付きました(汗)

なので、Slack側の作業は以前の記事と同じですが、Stack側を更新する記事です。

では 作っていきましょう👻

ますStackからです

import os

from aws_cdk import core
from aws_cdk.aws_apigateway import LambdaIntegration, RestApi
from aws_cdk.aws_lambda import Runtime
from aws_cdk.aws_lambda_python import PythonFunction
from aws_cdk.aws_ssm import StringListParameter

APP_NAME = "CdkBoltHelloWorld"
SSM_PARAMETER_NAMES = ["/cdk_bolt_hello_world/slack_bot_token", "/cdk_bolt_hello_world/slack_signing_secret"]


class CdkBoltHelloWorldStack(core.Stack):
    def __init__(self, scope: core.Construct, id: str, **kwargs) -> None:
        super().__init__(scope, id, **kwargs)

        lambda_ = PythonFunction(
            self, f"{APP_NAME}Lambda", entry="cdk_bolt_hello_world", handler="handler", runtime=Runtime.PYTHON_3_8,
        )

        api = RestApi(self, f"{APP_NAME}Api")
        api.root.add_method("POST", LambdaIntegration(lambda_))

        for param_name in SSM_PARAMETER_NAMES:
            StringListParameter.from_string_list_parameter_name(
                self, f"{APP_NAME}-{param_name}", param_name
            ).grant_read(lambda_)


app = core.App()
env = core.Environment(account=os.getenv("CDK_DEFAULT_ACCOUNT"), region=os.getenv("CDK_DEFAULT_REGION"))
CdkBoltHelloWorldStack(app, APP_NAME, env=env)
app.synth()

Slackの認証情報をSSMに積んでいるので、Lambdaにそこへの権限を付与します。

そしてRestAPIのルートにPOSTでLambdaを紐付けて完了!!

で、、Lambda側はこんな感じ

import boto3
from slack_bolt import App
from slack_bolt.adapter.aws_lambda import SlackRequestHandler


def make_app():
    ssm = boto3.client("ssm")
    slack_bot_token, slack_signing_secret = (
        ssm.get_parameter(Name=f"/cdk_bolt_hello_world/{name}", WithDecryption=True)["Parameter"]["Value"]
        for name in ["slack_bot_token", "slack_signing_secret"]
    )
    return App(
        signing_secret=slack_signing_secret,
        token=slack_bot_token,
        process_before_response=True,  # 同期処理にする(デフォルトは非同期)
    )


app = make_app()


@app.message("hello")
def message_hello(message, say):
    say(f"Hey there <@{message['user']}>!")


def handler(event, context):
    return SlackRequestHandler(app).handle(event, context)

依存パッケージはBoltのみ!!

slack-bolt==1.7.0

お手軽ですね!

以前との差分はここです。

from slack_bolt.adapter.aws_lambda import SlackRequestHandler

実はslack_bolt.adapterの中にLambda用のhandlerが用意されていたのですが、それに気が付かず、、、Flaskのhandlerで頑張ってつなげてしまったという感じです。

from slack_bolt.adapter.flask import SlackRequestHandler

以上です!

後はdeployするとURLが発行されるので、それをSlackに設定してあげればOKです!

このへん(↓)

以前は/slack/eventsにeventを投げてましたが、今回はルート直下なので、

こんな(↓)感じのエンドポイントを設定する感じです!

https://xxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/prod

今度こそ以上です

今回のリポジトリはこちら

https://github.com/sisi100/cdk_bolt_hello_world_2

Author

Sisii

インフラが好きなエンジニアぶってるなにか