![[Twilio+Python+AWS Lambda] サーバー通知を SMS で自動配信する Web アプリケーションの作成](https://images.ctfassets.net/ct0aopd36mqt/wp-thumbnail-3f316c20ff5f4f46d1a005e2ad976882/c71162912c717bb0ca7c9b4196a40df5/twilio.png)
[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"}
おわりに
Twilio API を利用すれば、 Web アプリケーションに対し容易にエラー時 SMS 通知の実装を追加できることが分かりました。
前回、 SMS に自動返信する Web アプリについては こちら 。
次回、未定。