もっとシンプルに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
今度こそ以上です