Aller au contenu principal
Version : 11.x

Adaptateur AWS Lambda + API Gateway

Traduction Bêta Non Officielle

Cette page a été traduite par PageTurner AI (bêta). Non approuvée officiellement par le projet. Vous avez trouvé une erreur ? Signaler un problème →

Adaptateur AWS Lambda

L'adaptateur AWS Lambda est pris en charge pour les cas d'usage API Gateway REST API(v1), HTTP API(v2) et URL de fonction Lambda.

httpBatchLink nécessite que le routeur fonctionne sur une seule ressource API Gateway (comme dans l'exemple). Si vous souhaitez avoir une ressource par procédure, utilisez plutôt httpLink (plus d'infos).

Exemples d'applications

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

Comment ajouter tRPC

1. Installer les dépendances

bash
yarn add @trpc/server
bash
yarn add @trpc/server
Agents IA

Si vous utilisez un agent de codage IA, installez les compétences tRPC pour une meilleure génération de code :

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

2. Créer un routeur tRPC

Implémentez votre routeur tRPC. Un exemple de routeur est fourni ci-dessous :

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. Utiliser l'adaptateur Amazon API Gateway

tRPC inclut un adaptateur prêt à l'emploi pour API Gateway. Cet adaptateur permet d'exécuter vos routes via le handler 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,
})

Construisez et déployez votre code, puis utilisez l'URL de votre API Gateway pour appeler votre fonction.

EndpointHTTP URI
getUserGET https://<execution-api-link>/getUser?input=INPUT

where INPUT is a URI-encoded JSON string.

Note sur les versions de format de payload

API Gateway utilise deux formats différents pour les événements lors de l'invocation d'une Lambda. Pour les API REST, le format doit être la version "1.0" (APIGatewayProxyEvent), tandis que pour les API HTTP vous pouvez choisir entre les versions "1.0" ou "2.0".

  • Version 1.0 : APIGatewayProxyEvent

  • Version 2.0 : APIGatewayProxyEventV2

Pour déterminer la version utilisée, fournissez le contexte comme suit :

ts
function createContext({
event,
context,
}: CreateAWSLambdaContextOptions<APIGatewayProxyEvent>) {
// ...
}
 
// CreateAWSLambdaContextOptions<APIGatewayProxyEvent> or CreateAWSLambdaContextOptions<APIGatewayProxyEventV2>
ts
function createContext({
event,
context,
}: CreateAWSLambdaContextOptions<APIGatewayProxyEvent>) {
// ...
}
 
// CreateAWSLambdaContextOptions<APIGatewayProxyEvent> or CreateAWSLambdaContextOptions<APIGatewayProxyEventV2>

En savoir plus sur les versions de format de payload

Adaptateur de streaming de réponse AWS Lambda

AWS Lambda prend en charge le streaming des réponses vers les clients via les URL de fonction Lambda et les API REST API Gateway.

Le streaming de réponse est pris en charge pour les URL de fonction Lambda et les API REST API Gateway. Pour les API REST API Gateway, vous devez configurer l'intégration avec responseTransferMode: STREAM. En savoir plus sur le streaming de réponse Lambda et le streaming de réponse API Gateway.

Streaming de réponse

La signature d'un gestionnaire de streaming diffère du gestionnaire standard. Le gestionnaire de streaming reçoit en supplément un paramètre de flux accessible en écriture, responseStream, en plus des paramètres classiques du gestionnaire Node, event et context. Pour indiquer à Lambda de streamer vos réponses, vous devez encapsuler votre gestionnaire de fonction avec le décorateur awslambda.streamifyResponse().

Notez que l'espace de noms awslambda est automatiquement fourni par l'environnement d'exécution Lambda. Vous pouvez importer les types de @types/aws-lambda pour étendre l'espace de noms global avec 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,
}),
);