📌 はじめに
AWSのAPI Gateway (v2)とLambdaオーソライザーを組み合わせることで、WebSocketの接続時に認証を実装できます。
API Gateway v2: WebSocket APIを提供
Lambdaオーソライザー: リクエストを処理前に認証判断
CloudFormation: AWSリソースを宣言的に定義
✏️ 今回はクエリパラメータでトークンを渡し、$connect時に認証を行う方法を紹介します!
🔄 認証フロー
クライアントからの接続要求
wss://{api-url}?token=XYZ
API Gatewayがオーソライザーを呼び出し
$connectルートに対するリクエストを検証
Lambdaオーソライザーでトークン検証
IAMポリシーを返却(許可/拒否)
API Gatewayがポリシーを評価
許可なら接続続行、拒否ならエラー応答
$connectルートのLambda処理
接続確立後の初期処理を実行
🔑 Lambdaオーソライザー関数
Node.jsで実装したシンプルなオーソライザー例:
💡 実際の運用では、JWT検証やデータベース参照などでより厳密に検証します
🏗️ CloudFormationリソース構成
🌐 AWS::ApiGatewayV2::Api
WebSocket API本体を定義
・ProtocolType: WEBSOCKET
・RouteSelectionExpression: $request.body.action
🔐 AWS::ApiGatewayV2::Authorizer
Lambdaオーソライザー設定
・AuthorizerType: REQUEST
・IdentitySource: querystring.token
🛣️ AWS::ApiGatewayV2::Route
$connectルートの定義
・RouteKey: $connect
・AuthorizationType: CUSTOM
🔌 AWS::ApiGatewayV2::Integration
Lambdaとの統合設定
・IntegrationType: AWS_PROXY
🚀 AWS::ApiGatewayV2::Stage
デプロイ用ステージ設定
・例: Prodステージ
⚡ AWS::Lambda::Function
2つのLambda関数を定義
・オーソライザー用: トークン検証
・接続ハンドラ用: $connect処理
🔒 AWS::Lambda::Permission
Lambda呼び出し権限設定
・Principal: apigateway.amazonaws.com
📝 実装のポイント
✅ AuthorizerTypeには"REQUEST"を指定
✅ IdentitySourceにクエリパラメータを指定
✅ $connectルートにのみオーソライザーを設定可能
✅ Lambda関数はIAMポリシーを返却すること
✅ Lambda::PermissionでAPI Gatewayからの呼び出し権限を付与
$connectルートのみ
📋 CloudFormationテンプレート例
全体を構成するYAMLテンプレートの一部:
💡 CloudFormationテンプレート全体はもっと長いですが、ここでは主要な部分のみ抜粋しています。
📚 用語解説
WebSocket API (API Gateway v2)
双方向通信を可能にするAPI
特殊ルート:$connect $disconnect
Lambdaオーソライザー
リクエストを検証するカスタムLambda関数
種類:REQUEST TOKEN
IAMポリシー
AWSリソースへのアクセス権限を定義
効果:Allow Deny
IdentitySource
認証情報の取得元を指定
例:querystring header
🎯 実装のメリット
✨ 接続時点で認証が行える
✨ カスタムロジックで柔軟な認証が可能
✨ 不正アクセスによるリソース消費を防止
✨ CloudFormationでインフラをコード化
✨ 統一的な権限管理が実現可能
基盤として活用しましょう!