[Twilio+Python+AWS Lambda] サーバー通知を SMS で自動配信する Web アプリケーションの作成

[Twilio+Python+AWS Lambda] サーバー通知を SMS で自動配信する Web アプリケーションの作成

AWS Lambda で動作するアプリケーションに対し、 Twilio API を使用した SMS 通知の自動配信機能を追加する方法について紹介します。
参考ページ: https://www.twilio.com/en-us/blog/server-notifications-python-django

作業環境

バージョン

Python: 3.11.9
twilio-python: 9.4.5

TwilioNotificationsMiddleware クラスとは

TwilioNotificationsMiddleware は、AWS Lambda のリクエスト処理の前後で Twilio を使った通知を送信するミドルウェアクラスです。このミドルウェアを lambda_function に追加することで、エラー発生時に管理者へ SMS で通知を送ることが可能となります。

TwilioNotificationsMiddleware の実装

以下の、 twilio_middleware.py を作成します。

twilio_middleware.py

import os
import json
import traceback
from twilio.rest import Client

class TwilioNotificationsMiddleware:
    """Twilio を使った通知を送信するミドルウェア"""
    def __init__(self, next_handler):
        self.next_handler = next_handler

        # 各環境変数については本記事にて後述
        self.twilio_client = Client(
            os.environ['TWILIO_ACCOUNT_SID'],
            os.environ['TWILIO_AUTH_TOKEN']
        )
        self.twilio_phone_number = os.environ['TWILIO_PHONE_NUMBER']
        self.admin_phone_number = os.environ['ADMIN_PHONE_NUMBER']  

    def send_sms(self, message):
        """Twilio を使って SMS 送信する"""
        try:
            self.twilio_client.messages.create(
                body=message,
                from_=self.twilio_phone_number,
                to=self.admin_phone_number
            )
        except Exception as e:
            print(f"Failed to send SMS: {e}")

    def __call__(self, event, context):
        """Lambda のリクエストを処理し、エラー時に通知を送信"""
        try:
            response = self.next_handler(event, context)
            return response
        except Exception as e:
            error_message = f"Lambda Error: {str(e)}\n{traceback.format_exc()}"
            self.send_sms(error_message)
            return {
                "statusCode": 500,
                "body": json.dumps({"error": "Internal Server Error"})
            }

環境変数の設定

AWS Lambda の環境変数に Twilio の認証情報などを設定します。

環境変数 説明
TWILIO_ACCOUNT_SID Twilio のアカウント SID
TWILIO_AUTH_TOKEN Twilio の認証トークン
TWILIO_PHONE_NUMBER Twilio の送信元電話番号
ADMIN_PHONE_NUMBER 通知を受け取る管理者の電話番号

TwilioNotificationsMiddleware 使用例

このミドルウェアを Lambda 関数に適用するには次のようにします。今回は例外の通知をテストしたいので、わざと失敗するコードを書きます。

lambda_function.py

import json
from twilio_middleware import TwilioNotificationsMiddleware

def lambda_handler(event, context):
    """メインの Lambda 関数"""
    body = json.loads(event['body']) if isinstance(event['body'], str) else event['body']
    message = body.get('message', 'Hello from AWS Lambda!')

    # "error" というメッセージが送られた場合、意図的に例外を発生させる
    if message.lower() == "error":
        raise ValueError("Intentional error for testing Twilio SMS notifications")

    return {
        "statusCode": 200,
        "body": json.dumps({"message": message})
    }

# ミドルウェアを適用
lambda_handler = TwilioNotificationsMiddleware(lambda_handler)

テスト用 JSON は以下の通りです。

{
  "body": "{\"message\": \"error\"}"
}

動作検証

API を通じた Lambda 関数の呼び出し後、次のメッセージが送信されるのを確認しました。

$ curl https://****.amazonaws.com/test-twilio-notification -H "Content-Type: application/json" -d '{"message": "error"}'
{"error": "Internal Server Error"}

test-twilio-nortification

おわりに

Twilio API を利用すれば、 Web アプリケーションに対し容易にエラー時 SMS 通知の実装を追加できることが分かりました。

前回、 SMS に自動返信する Web アプリについては こちら
次回、未定。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.