AWS CDKを使ってBoltをLambdaにデプロイする


この記事はなに?

SlackBotにハロワをさせるだけです😅
「既存の記事と多少違う!」という点はPython + CDK + Boltで実装する!という点です。

BoltはSlackの公式ライブラリーで、Slackを使ったアプリが簡単に作れるやつです!
これを使うにはバックエンドのサーバーが必要です。
ここを今回はAPIGateway + Lambdaでやっていきます。
またこのインフラ&アプリはPython + CDKで実装します!

という内容の記事😅

2021/09/27

もっとシンプルにする方法がありました🙇

使ったライブラリー

Lambdaで直接Boltは使えないのでFlaskを利用し、
さらにLambdaで直接Flaskは使えないので、awsgiを利用する感じです!

実際のコードはこんな感じ

CDKのスタック

LambdaをRestApiでデプロイします👍

app.py
import os

from aws_cdk import core
from aws_cdk.aws_apigateway import LambdaRestApi
from aws_cdk.aws_lambda import Runtime
from aws_cdk.aws_lambda_python import PythonFunction

APP_NAME = "CdkBoltHelloWorld"

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="app", handler="handler", runtime=Runtime.PYTHON_3_8,
        )

        LambdaRestApi(self, f"{APP_NAME}Gateway", handler=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()

アプリ側

Lambdaのrequirements.txtはこんな感じ

app/requirements.txt
slack-bolt==1.7.0
aws-wsgi==0.2.6
Flask==1.1.1

アプリ本体はこんな感じ

app/index.py
# ---- Boltアプリ ------------------------------
from slack_bolt import App

SLACK_SIGNING_SECRET = "SlackアプリのSIGNING_SECRETを貼り付ける"
SLACK_BOT_TOKEN = "SlackアプリのBotトークンを貼り付ける"
app = App(signing_secret=SLACK_SIGNING_SECRET, token=SLACK_BOT_TOKEN)

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

# ---- flaskアプリ -----------------------------
from flask import Flask, request
from slack_bolt.adapter.flask import SlackRequestHandler

flask_app = Flask(__name__)
slack_handler = SlackRequestHandler(app)

@flask_app.route("/slack/events", methods=["POST"])
def slack_events():
    return slack_handler.handle(request)

# ---- Lambda向けハンドラー -----------------------
import awsgi

def handler(event, context):
    return awsgi.response(flask_app, event, context)

 最後に

今回初投稿でした!
これからは定期的に投稿できるようにがんばりますー😆

ブログもやってます!
今回の記事でもうちょっと細かい説明を!という方がいましたらブログの方をみてみてください😆もうちょい詳しいです

また今回とはちょっと違いますがソースコードはこのへんにありますー

ではでは〜