LoginSignup
0
1

More than 1 year has passed since last update.

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

Last updated at Posted at 2021-07-24

この記事はなに?

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,process_before_response=True)

@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)

 最後に

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

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

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

ではでは〜

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1