メインコンテンツへスキップ
バージョン: 11.x

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 を使用できます(詳細情報)。

サンプルアプリケーション

DescriptionLinks
API Gateway with NodeJS client.
API Gateway REST API with response streaming.

tRPC の追加方法

1. 依存関係のインストール

bash
yarn add @trpc/server
bash
yarn add @trpc/server

2. tRPCルーターの作成

tRPC ルーターを実装します。以下にサンプルルーターを示します:

server.ts
ts
import { initTRPC } from '@trpc/server';
import { z } from 'zod';
export const t = initTRPC.create();
const appRouter = t.router({
getUser: t.procedure.input(z.string()).query((opts) => {
opts.input; // string
return { id: opts.input, name: 'Bilbo' };
}),
});
// export type definition of API
export type AppRouter = typeof appRouter;
server.ts
ts
import { initTRPC } from '@trpc/server';
import { z } from 'zod';
export const t = initTRPC.create();
const appRouter = t.router({
getUser: t.procedure.input(z.string()).query((opts) => {
opts.input; // string
return { id: opts.input, name: 'Bilbo' };
}),
});
// export type definition of API
export type AppRouter = typeof appRouter;

3. Amazon API Gateway アダプターの使用

tRPC には標準で API Gateway 用アダプターが含まれています。このアダプターを使用すると、ルートを API Gateway ハンドラー経由で実行できます。

server.ts
ts
import { CreateAWSLambdaContextOptions, awsLambdaRequestHandler } from '@trpc/server/adapters/aws-lambda';
const appRouter = /* ... */;
// created for each request
const createContext = ({
event,
context,
}: CreateAWSLambdaContextOptions<APIGatewayProxyEventV2>) => ({}) // no context
type Context = Awaited<ReturnType<typeof createContext>>;
export const handler = awsLambdaRequestHandler({
router: appRouter,
createContext,
})
server.ts
ts
import { CreateAWSLambdaContextOptions, awsLambdaRequestHandler } from '@trpc/server/adapters/aws-lambda';
const appRouter = /* ... */;
// created for each request
const createContext = ({
event,
context,
}: CreateAWSLambdaContextOptions<APIGatewayProxyEventV2>) => ({}) // no context
type Context = Awaited<ReturnType<typeof createContext>>;
export const handler = awsLambdaRequestHandler({
router: appRouter,
createContext,
})

コードをビルド&デプロイ後、API Gateway の URL を使用して関数を呼び出せます。

EndpointHTTP URI
getUserGET 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

使用されているバージョンを判別するには、以下のようにコンテキストを指定します:

ts
function createContext({
event,
context,
}: CreateAWSLambdaContextOptions<APIGatewayProxyEvent>) {
...
}
// CreateAWSLambdaContextOptions<APIGatewayProxyEvent> or CreateAWSLambdaContextOptions<APIGatewayProxyEventV2>
ts
function createContext({
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 レスポンスストリーミング をお読みください。

サンプルアプリケーション

DescriptionLinks
Lambda Function URL with NodeJS client.
API Gateway REST API with response streaming.

レスポンスストリーミング

ストリーミングハンドラーのシグネチャはデフォルトのハンドラーとは異なります。ストリーミングハンドラーは、デフォルトのノードハンドラーパラメータである eventcontext に加えて、書き込み可能なストリームパラメータ responseStream も受け取ります。Lambda がレスポンスをストリーミングするようにするには、関数ハンドラーを awslambda.streamifyResponse() デコレーターでラップする必要があります。

awslambda 名前空間は Lambda 実行環境によって自動的に提供されます。@types/aws-lambda から型をインポートし、グローバル名前空間を awslambda 名前空間で拡張できます。

server.ts
ts
import { awsLambdaStreamingRequestHandler } from '@trpc/server/adapters/aws-lambda';
import type { StreamifyHandler } from 'aws-lambda';
const appRouter = router({
iterable: publicProcedure.query(async function* () {
for (let i = 0; i < 10; i++) {
await new Promise((resolve) => setTimeout(resolve, 500));
yield i;
}
}),
});
export const handler = awslambda.streamifyResponse(
awsLambdaStreamingRequestHandler({
router: appRouter,
/* ... */
}),
);
server.ts
ts
import { awsLambdaStreamingRequestHandler } from '@trpc/server/adapters/aws-lambda';
import type { StreamifyHandler } from 'aws-lambda';
const appRouter = router({
iterable: publicProcedure.query(async function* () {
for (let i = 0; i < 10; i++) {
await new Promise((resolve) => setTimeout(resolve, 500));
yield i;
}
}),
});
export const handler = awslambda.streamifyResponse(
awsLambdaStreamingRequestHandler({
router: appRouter,
/* ... */
}),
);