AWS Lambda + API Gateway アダプター
このページは PageTurner AI で翻訳されました(ベータ版)。プロジェクト公式の承認はありません。 エラーを見つけましたか? 問題を報告 →
AWS Lambda アダプター
AWS Lambda アダプターは、API Gateway REST API(v1)、HTTP API(v2)、および Lambda Function URL のユースケースをサポートしています。
httpBatchLinkを使用する場合、ルーターは単一の API Gateway リソースで動作する必要があります(サンプルを参照)。 プロシージャごとにリソースを設定したい場合は、代わりにhttpLinkを使用できます(詳細情報)。
サンプルアプリケーション
| Description | Links |
|---|---|
| API Gateway with NodeJS client. | |
| API Gateway REST API with response streaming. |
tRPC の追加方法
1. 依存関係のインストール
bashyarn add @trpc/server
bashyarn add @trpc/server
AIコーディングエージェントを使用している場合は、コード生成の品質向上のためにtRPCスキルをインストールしてください:
bashnpx @tanstack/intent@latest install
bashnpx @tanstack/intent@latest install
2. tRPCルーターの作成
tRPC ルーターを実装します。以下にサンプルルーターを示します:
server.tstsimport {initTRPC } from '@trpc/server';import {z } from 'zod';export constt =initTRPC .create ();constappRouter =t .router ({getUser :t .procedure .input (z .string ()).query ((opts ) => {opts .input ; // stringreturn {id :opts .input ,name : 'Bilbo' };}),});// export type definition of APIexport typeAppRouter = typeofappRouter ;
server.tstsimport {initTRPC } from '@trpc/server';import {z } from 'zod';export constt =initTRPC .create ();constappRouter =t .router ({getUser :t .procedure .input (z .string ()).query ((opts ) => {opts .input ; // stringreturn {id :opts .input ,name : 'Bilbo' };}),});// export type definition of APIexport typeAppRouter = typeofappRouter ;
3. Amazon API Gateway アダプターの使用
tRPC には標準で API Gateway 用アダプターが含まれています。このアダプターを使用すると、ルートを API Gateway ハンドラー経由で実行できます。
server.tstsimport type {APIGatewayProxyEventV2 } from 'aws-lambda';import type {CreateAWSLambdaContextOptions } from '@trpc/server/adapters/aws-lambda';import {awsLambdaRequestHandler } from '@trpc/server/adapters/aws-lambda';import {appRouter } from './router';// created for each requestconstcreateContext = ({event ,context ,}:CreateAWSLambdaContextOptions <APIGatewayProxyEventV2 >) => ({}); // no contexttypeContext =Awaited <ReturnType <typeofcreateContext >>;export consthandler =awsLambdaRequestHandler ({router :appRouter ,createContext ,})
server.tstsimport type {APIGatewayProxyEventV2 } from 'aws-lambda';import type {CreateAWSLambdaContextOptions } from '@trpc/server/adapters/aws-lambda';import {awsLambdaRequestHandler } from '@trpc/server/adapters/aws-lambda';import {appRouter } from './router';// created for each requestconstcreateContext = ({event ,context ,}:CreateAWSLambdaContextOptions <APIGatewayProxyEventV2 >) => ({}); // no contexttypeContext =Awaited <ReturnType <typeofcreateContext >>;export consthandler =awsLambdaRequestHandler ({router :appRouter ,createContext ,})
コードをビルド&デプロイ後、API Gateway の URL を使用して関数を呼び出せます。
| Endpoint | HTTP URI |
|---|---|
getUser | GET https://<execution-api-link>/getUser?input=INPUT where INPUT is a URI-encoded JSON string. |
ペイロードフォーマットバージョンについて
API Gateway が Lambda を呼び出す際には、2種類のイベントデータフォーマットが存在します。REST API では "1.0" バージョン(APIGatewayProxyEvent)を使用する必要がありますが、HTTP API では "1.0" または "2.0" バージョンを選択できます。
-
バージョン 1.0:
APIGatewayProxyEvent -
バージョン 2.0:
APIGatewayProxyEventV2
使用されているバージョンを判別するには、以下のようにコンテキストを指定します:
tsfunctioncreateContext ({event ,context ,}:CreateAWSLambdaContextOptions <APIGatewayProxyEvent >) {// ...}// CreateAWSLambdaContextOptions<APIGatewayProxyEvent> or CreateAWSLambdaContextOptions<APIGatewayProxyEventV2>
tsfunctioncreateContext ({event ,context ,}:CreateAWSLambdaContextOptions <APIGatewayProxyEvent >) {// ...}// CreateAWSLambdaContextOptions<APIGatewayProxyEvent> or CreateAWSLambdaContextOptions<APIGatewayProxyEventV2>
AWS Lambda レスポンスストリーミングアダプター
AWS Lambda は、Lambda Function URL と API Gateway REST API の両方でクライアントへのストリーミングレスポンスをサポートしています。
レスポンスストリーミングは、Lambda Function URL と API Gateway REST API でサポートされています。API Gateway REST API の場合、
responseTransferMode: STREAMで統合を設定する必要があります。Lambda レスポンスストリーミングの詳細 および API Gateway レスポンスストリーミング をお読みください。
レスポンスストリーミング
ストリーミングハンドラーのシグネチャはデフォルトのハンドラーとは異なります。ストリーミングハンドラーは、デフォルトのノードハンドラーパラメータである event と context に加えて、書き込み可能なストリームパラメータ responseStream も受け取ります。Lambda がレスポンスをストリーミングするようにするには、関数ハンドラーを awslambda.streamifyResponse() デコレーターでラップする必要があります。
awslambda名前空間は Lambda 実行環境によって自動的に提供されます。@types/aws-lambdaから型をインポートし、グローバル名前空間をawslambda名前空間で拡張できます。
server.tsts/// <reference types="aws-lambda" />import type {APIGatewayProxyEventV2 } from 'aws-lambda';import type {CreateAWSLambdaContextOptions } from '@trpc/server/adapters/aws-lambda';import {awsLambdaStreamingRequestHandler } from '@trpc/server/adapters/aws-lambda';import {appRouter } from './router';// created for each requestconstcreateContext = ({event ,context ,}:CreateAWSLambdaContextOptions <APIGatewayProxyEventV2 >) => ({// your context});typeContext =Awaited <ReturnType <typeofcreateContext >>;export consthandler =awslambda .streamifyResponse (awsLambdaStreamingRequestHandler ({router :appRouter ,createContext ,}),);
server.tsts/// <reference types="aws-lambda" />import type {APIGatewayProxyEventV2 } from 'aws-lambda';import type {CreateAWSLambdaContextOptions } from '@trpc/server/adapters/aws-lambda';import {awsLambdaStreamingRequestHandler } from '@trpc/server/adapters/aws-lambda';import {appRouter } from './router';// created for each requestconstcreateContext = ({event ,context ,}:CreateAWSLambdaContextOptions <APIGatewayProxyEventV2 >) => ({// your context});typeContext =Awaited <ReturnType <typeofcreateContext >>;export consthandler =awslambda .streamifyResponse (awsLambdaStreamingRequestHandler ({router :appRouter ,createContext ,}),);