メインコンテンツへスキップ
バージョン: 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
AIエージェント

AIコーディングエージェントを使用している場合は、コード生成の品質向上のためにtRPCスキルをインストールしてください:

bash
npx @tanstack/intent@latest install
bash
npx @tanstack/intent@latest install

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 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 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 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 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 レスポンスストリーミング をお読みください。

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

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

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

server.ts
ts
/// <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 request
const createContext = ({
event,
context,
}: CreateAWSLambdaContextOptions<APIGatewayProxyEventV2>) => ({
// your context
});
type Context = Awaited<ReturnType<typeof createContext>>;
 
export const handler = awslambda.streamifyResponse(
awsLambdaStreamingRequestHandler({
router: appRouter,
createContext,
}),
);
server.ts
ts
/// <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 request
const createContext = ({
event,
context,
}: CreateAWSLambdaContextOptions<APIGatewayProxyEventV2>) => ({
// your context
});
type Context = Awaited<ReturnType<typeof createContext>>;
 
export const handler = awslambda.streamifyResponse(
awsLambdaStreamingRequestHandler({
router: appRouter,
createContext,
}),
);