![[Twilio+Python+AWS Lambda] Twilio Video でビデオ通話サーバーを構築する](https://images.ctfassets.net/ct0aopd36mqt/wp-thumbnail-3f316c20ff5f4f46d1a005e2ad976882/c71162912c717bb0ca7c9b4196a40df5/twilio.png)
[Twilio+Python+AWS Lambda] Twilio Video でビデオ通話サーバーを構築する
本記事は、以下のような読者を対象としています。
- Twilio Video を活用したビデオ通話アプリを開発したいエンジニア
- AWS Lambda を活用したサーバーレスアーキテクチャに興味がある開発者
- Python を用いたバックエンド開発の経験がある方
- WebRTC やリアルタイム通信技術に関心がある方
また本記事では、以下を前提としています。
- Python の基本的な文法が分かる
- REST API の基本的な概念を理解している
- AWS Lambda や API Gateway の概要を理解している
- Twilio の基本的な使い方を知っている
参考記事
- https://www.twilio.com/docs/video/overview
- https://www.twilio.com/docs/video/tutorials/get-started-with-twilio-video-python-flask-server
検証環境
Python: 3.13.2
twilio-python: 9.5.1
Twilio Video とは
Twilio Video は、アプリケーションに高品質なビデオ通話機能を追加するためのサービスです。
- リアルタイム通信: WebRTC を活用した低遅延のビデオ・音声通信を提供
- 柔軟な構成: 一対一の通話から多人数参加のビデオ会議まで対応
- クロスプラットフォーム: iOS, Android, Web 向けの SDK を提供
このプラットフォームは、遠隔医療、オンライン教育、カスタマーサポート、リモートワークなど様々なユースケースに対応しています。Twilio のインフラストラクチャを利用することで、開発者は複雑なビデオ技術を自前で構築することなく、アプリケーションにビデオ機能を統合できます。
本記事では、Twilio Video を活用したビデオ通話アプリケーションのサーバーを AWS Lambda 上に構築する方法 について解説します。Python を使用し、Twilio API を活用してビデオ通話サーバーを構築します。
事前準備
AWS Lambda 上に Twilio Video のサーバーを構築するために、以下の準備を行います。
必要なアカウントの作成
本記事の手順を進めるには、以下のアカウントが必要です。
- Twilio アカウント(Twilio の公式サイト から作成可能)
- AWS アカウント(AWS の公式サイト から作成可能)
Twilio API キーの取得
Twilio Video の API を利用するために、Twilio の API キーを取得します。
- Twilio コンソール にログイン
- API Keys & Tokens のページに移動
- Create API Key をクリックし、新しい API キーを作成
- SID と Secret をメモしておく(後で使用)
必要な AWS サービス
AWS Lambda で Twilio Video のサーバーを動作させるために、以下の AWS サービスを利用します。
- AWS Lambda(サーバーレス環境で Python コードを実行)
- Amazon API Gateway(Lambda 関数を HTTP エンドポイントとして公開)
AWS Lambda 関数の作成
必要なライブラリのインストール
Twilio の API を利用するために、twilio
ライブラリをインストールします。
AWS Lambda では、外部ライブラリを含めた ZIP ファイルをアップロードする必要があります。
ローカル環境で以下のコマンドを実行し、必要なライブラリをインストールします。
なお今回のプロジェクトディレクトリ名を twilio_video
としていますが、適宜読み替えてください。
mkdir twilio_video && cd twilio_video
pip install twilio -t .
このコマンドにより、twilio
ライブラリが twilio_video
ディレクトリ内にインストールされます。
Lambda 関数の作成
次に、AWS Lambda で実行する Python スクリプトを作成します。
このスクリプトでは、Twilio Video の Access Token を発行し、クライアントがビデオ通話に参加できるようにします。
lambda_function.py
import json
import os
import uuid # for generating random user id values
import twilio.jwt.access_token
import twilio.jwt.access_token.grants
import twilio.rest
from twilio.base.exceptions import TwilioRestException
# 環境変数から Twilio の認証情報を取得
TWILIO_ACCOUNT_SID = os.environ["TWILIO_ACCOUNT_SID"]
TWILIO_API_KEY_SID = os.environ["TWILIO_API_KEY_SID"]
TWILIO_API_KEY_SECRET = os.environ["TWILIO_API_KEY_SECRET"]
# Twilio クライアントの作成
twilio_client = twilio.rest.Client(TWILIO_API_KEY_SID, TWILIO_API_KEY_SECRET, TWILIO_ACCOUNT_SID)
def find_or_create_room(room_name):
"""
指定されたルーム名のビデオルームを取得または作成する
"""
try:
# 既存のルームを取得
twilio_client.video.v1.rooms(room_name).fetch()
except TwilioRestException:
# ルームが存在しない場合、新規作成
twilio_client.video.v1.rooms.create(unique_name=room_name)
def get_access_token(room_name):
"""
指定されたルームの Access Token を生成する
"""
# ユーザー ID をランダムに生成
user_identity = str(uuid.uuid4())
# Access Token の作成
access_token = twilio.jwt.access_token.AccessToken(
TWILIO_ACCOUNT_SID, TWILIO_API_KEY_SID, TWILIO_API_KEY_SECRET, identity=user_identity
)
# Video Grant の作成
video_grant = twilio.jwt.access_token.grants.VideoGrant(room=room_name)
access_token.add_grant(video_grant)
return access_token
def lambda_handler(event, context):
"""
"/join-room" API のエントリーポイント
"""
try:
# リクエストボディをパース
body = json.loads(event.get("body", "{}"))
room_name = body.get("room_name", "default_room")
# ルームを取得または作成
find_or_create_room(room_name)
# Access Token を取得
access_token = get_access_token(room_name)
# レスポンスを返す
return {
"statusCode": 200,
"body": json.dumps({"token": access_token.to_jwt()}),
"headers": {
"Content-Type": "application/json"
}
}
except Exception as e:
return {
"statusCode": 500,
"body": json.dumps({"error": str(e)}),
"headers": {
"Content-Type": "application/json"
}
}
この関数の動作
- クライアントからのリクエストを受け取り、指定されたルーム名の Twilio Video ルームを取得または作成
- ルームに参加するための Access Token を生成
- 発行したトークンを JSON 形式でレスポンスとして返す
Lambda 関数のデプロイ
作成したスクリプトと twilio
ライブラリを ZIP 圧縮し、AWS Lambda にアップロードします。
zip -r function.zip .
次に、AWS Lambda のコンソールで新しい関数を作成し、以下の設定を行います。
- 関数名: join-room
- ランタイム: Python 3.x
- 環境変数:
TWILIO_ACCOUNT_SID
: Twilio のアカウント SIDTWILIO_API_KEY_SID
: Twilio API のキー SIDTWILIO_API_KEY_SECRET
: Twilio API のキーシークレット
ZIP ファイルをアップロードし、関数を保存します。
API Gateway の設定
Lambda 関数を HTTP エンドポイントとして公開するために、API Gateway を設定します。
API Gateway の作成
- AWS コンソールで API Gateway に移動
- 新しい API を作成(HTTP API を選択)
- エンドポイントを作成(Lambda 関数をターゲットに設定)
- CORS を有効化(フロントエンドからのリクエストを許可)
デプロイ
API Gateway をデプロイし、発行されたエンドポイント URL をメモしておきます。
この URL をクライアント側で使用し、Twilio Video のトークンを取得できます。
動作確認
API Gateway のエンドポイントを使用して、Lambda 関数が正しく動作するか確認します。
cURL を使用したテスト
以下のコマンドを実行し、トークンが取得できるか確認します。 URL には、先の手順で控えたエンドポイント URL を使用します。
curl -X POST "https://****.amazonaws.com/default/join-room" \
-H "Content-Type: application/json" \
-d '{"room_name": "test_room"}'
成功すると、以下のようなレスポンスが返ってきます。
{
"token": "****"
}
このトークンをクライアント側で使用することで、Twilio Video のルームに接続できます。
まとめ
本記事では、AWS Lambda 上に Twilio Video のサーバーを構築する手順を解説しました。
- Twilio API キーの取得
- AWS Lambda 関数の作成とデプロイ
- API Gateway を使用したエンドポイントの公開
- cURL を使用した動作確認
このサーバーを活用することで、クライアント側から Twilio Video のルームに接続するためのトークンを取得できます。
次回は、クライアント側の実装について解説します。