5
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AWS Lambda上で「LINE Messaging API SDK for Python」を使ったコードをデプロイしてLINE Botを作ることを楽しむ

Last updated at Posted at 2024-08-07

はじめに

LINEのMessaging APIを使ってオウム返しをするボットを作ります。

こちらの記事をとても参考にしています。ありがとうございます。

LINEボットはWebhookを受け取って反応するものを作ればよいので、Amazon API GatewayAWS Lambdaの組み合わせでサクッと作れます。

大部分はさきほど紹介した上記記事をなぞってもらえばできます。
この記事では、LINE Messaging API SDK for PythonAWS Lambdaで使えるようにレイヤーに指定するブツの作り方を説明します。

環境

私のマシンです。

  • MacBook Pro
  • Sonoma 14.5
  • HomebrewでなにかのついでにPython 3.12がインストールされています

コード例

LINE Messaging API SDK for Pythonを利用したAWS Lambdaで動くコードの例です。
オウム返しをするのみです。
ほとんどSDKのSynopsisをまんまです。

import json
import requests
import logging
import os
from linebot.v3 import (
    WebhookHandler
)
from linebot.v3.exceptions import (
    InvalidSignatureError
)
from linebot.v3.messaging import (
    Configuration,
    ApiClient,
    MessagingApi,
    ReplyMessageRequest,
    TextMessage
)
from linebot.v3.webhooks import (
    MessageEvent,
    TextMessageContent
)

logger = logging.getLogger()
logger.setLevel(logging.INFO)

YOUR_CHANNEL_ACCESS_TOKEN = os.environ['YOUR_CHANNEL_ACCESS_TOKEN']
YOUR_CHANNEL_SECRET = os.environ['YOUR_CHANNEL_SECRET']

configuration = Configuration(access_token=YOUR_CHANNEL_ACCESS_TOKEN)
handler = WebhookHandler(YOUR_CHANNEL_SECRET)

def lambda_handler(event, context):
    logger.info(event)
    signature = event['headers']['x-line-signature']
    body = event['body']
    try:
        handler.handle(body, signature)
    except InvalidSignatureError:
        app.logger.info("Invalid signature. Please check your channel access token/channel secret.")
        abort(400)

    return {'statusCode': 200}


@handler.add(MessageEvent, message=TextMessageContent)
def handle_message(event):
    with ApiClient(configuration) as api_client:
        line_bot_api = MessagingApi(api_client)
        line_bot_api.reply_message_with_http_info(
            ReplyMessageRequest(
                reply_token=event.reply_token,
                messages=[TextMessage(text=event.message.text)]
            )
        )

このコードをAWS Lambdaで動かそうとすると、「LINE Messaging API SDK for Pythonなんて知らねーよ」と怒られます。
それもそのはずです。Pythonの標準には入っていないライブラリですからAWS Lambdaで使えるようにどうにかライブラリを参照できるようにする必要があります。

そんなときに使うのがレイヤーです。

レイヤーに指定するブツの作り方

レイヤーに指定するブツをまずは作る必要があります。ここでいうブツとは、ヤバいものではなく、ライブラリを固めたものです。

公式ドキュメントがあります。

Python Lambda 関数にレイヤーを使用する」のドキュメントの通りにやればできます。
私にできたのだからあなたもきっとできます!

ここで記事を終えてもいいのですが、このへんを熱く語ってみます。

ドキュメントの通り、GitHubからサンプルコードgit cloneしてきて実行してもよいです。
ただし、余計なものもいっぱいついてきます。実は以下の3ファイルだけあればよいのです。

  • 1-install.sh
  • 2-package.sh
  • requirements.txt
1-install.sh
python3.12 -m venv create_layer
source create_layer/bin/activate
pip install -r requirements.txt
2-package.sh
mkdir python
cp -r create_layer/lib python/
zip -r layer_content.zip python
requirements.txt
line-bot-sdk==3.11.0

1-install.shの先頭で指定しているPythonのバージョンは、AWS Lambdaのランタイムに指定するバージョンとあわせておくのが吉です。この記事の例ではPython 3.12を指定しています。私の場合、Homebrewでなにかのついでにインストールされていました。
requirements.txtには必要なライブラリをご指定ください。

3ファイルの準備ができたらあとは実行あるのみです。
実行方法は以下の通りです。

chmod 744 1-install.sh && chmod 744 2-package.sh
./1-install.sh
./2-package.sh

そうすると、layer_content.zipというレイヤーに指定するブツができますのでこれをAWS Lambdaに設定すればよいわけです。
AWS Lambdaでの設定方法は以下のドキュメントをご参照ください。

話が前後しますが、1-install.sh2-package.shが一体何をしているのかをざっくり説明しておきます。

1-install.shでは、まず、create_layerという名前で仮想環境を作成し、それをアクティベートして、requirements.txtの内容に従ってライブラリをインストールします。
次に2-package.shでは、pythonという名前のディレクトリを作成し、その中にさきほどインストールしたライブラリをコピーして、layer_content.zipというファイルに圧縮しているわけです。

なにか大層ありがたい解説がはじまるかと思いきや、ただ単に.shの中身をただ単に言葉にしてみたに過ぎません。

さいごに

AWS Lambdaで外部のライブラリを使えるようにするレイヤーに指定するブツの作り方を説明しました。

あなたもLINEボットの制作をお楽しみください。

5
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
5
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?