AWS Lambda
AWS Lambda est une plateforme serverless d'Amazon Web Services. Elle vous permet d'exécuter du code en réponse à des événements et gère automatiquement les ressources de calcul sous-jacentes.
Hono fonctionne sur AWS Lambda avec un environnement Node.js 18 ou ultérieur.
1. Configuration
Pour créer une application sur AWS Lambda, CDK est utile pour configurer les ressources telles que les rôles IAM, API Gateway et autres.
Initialisez votre projet avec la CLI cdk.
mkdir my-app
cd my-app
cdk init app -l typescript
npm i hono @hono/aws-lambda
npm i -D esbuild
mkdir lambda
touch lambda/index.tsmkdir my-app
cd my-app
cdk init app -l typescript
yarn add hono @hono/aws-lambda
yarn add -D esbuild
mkdir lambda
touch lambda/index.tsmkdir my-app
cd my-app
cdk init app -l typescript
pnpm add hono @hono/aws-lambda
pnpm add -D esbuild
mkdir lambda
touch lambda/index.tsmkdir my-app
cd my-app
cdk init app -l typescript
bun add hono @hono/aws-lambda
bun add -D esbuild
mkdir lambda
touch lambda/index.ts2. Bonjour le monde
Modifiez lambda/index.ts.
import { Hono } from 'hono'
import { handle } from '@hono/aws-lambda'
const app = new Hono()
app.get('/', (c) => c.text('Hello Hono!'))
export const handler = handle(app)3. Déploiement
Modifiez lib/my-app-stack.ts.
import * as cdk from 'aws-cdk-lib'
import { Construct } from 'constructs'
import * as lambda from 'aws-cdk-lib/aws-lambda'
import { NodejsFunction } from 'aws-cdk-lib/aws-lambda-nodejs'
export class MyAppStack extends cdk.Stack {
constructor(scope: Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props)
const fn = new NodejsFunction(this, 'lambda', {
entry: 'lambda/index.ts',
handler: 'handler',
runtime: lambda.Runtime.NODEJS_22_X,
})
const fnUrl = fn.addFunctionUrl({
authType: lambda.FunctionUrlAuthType.NONE,
})
new cdk.CfnOutput(this, 'lambdaUrl', {
value: fnUrl.url!,
})
}
}Enfin, exécutez la commande de déploiement :
cdk deployServir des données binaires
Hono prend en charge les données binaires dans les réponses. Dans Lambda, les données binaires doivent être encodées en base64 pour être renvoyées. Lorsque l'en-tête Content-Type indique un type binaire, Hono encode automatiquement les données en base64.
app.get('/binary', async (c) => {
// ...
c.status(200)
c.header('Content-Type', 'image/png') // means binary data
return c.body(buffer) // supports `ArrayBufferLike` type, encoded to base64.
})Accéder à l'objet AWS Lambda
Dans Hono, vous pouvez accéder aux événements et au contexte AWS Lambda en associant les types LambdaEvent, LambdaContext et en utilisant c.env.
import { Hono } from 'hono'
import type { LambdaEvent, LambdaContext } from '@hono/aws-lambda'
import { handle } from '@hono/aws-lambda'
type Bindings = {
event: LambdaEvent
lambdaContext: LambdaContext
}
const app = new Hono<{ Bindings: Bindings }>()
app.get('/aws-lambda-info/', (c) => {
return c.json({
isBase64Encoded: c.env.event.isBase64Encoded,
awsRequestId: c.env.lambdaContext.awsRequestId,
})
})
export const handler = handle(app)Accéder à RequestContext
Dans Hono, vous pouvez accéder au contexte de requête AWS Lambda en associant le type LambdaEvent et en utilisant c.env.event.requestContext.
import { Hono } from 'hono'
import type { LambdaEvent } from '@hono/aws-lambda'
import { handle } from '@hono/aws-lambda'
type Bindings = {
event: LambdaEvent
}
const app = new Hono<{ Bindings: Bindings }>()
app.get('/custom-context/', (c) => {
const lambdaContext = c.env.event.requestContext
return c.json(lambdaContext)
})
export const handler = handle(app)Avant la version 3.10.0 (obsolète)
Vous pouvez accéder au contexte de requête AWS Lambda en associant le type ApiGatewayRequestContext et en utilisant c.env..
import { Hono } from 'hono'
import type { ApiGatewayRequestContext } from '@hono/aws-lambda'
import { handle } from '@hono/aws-lambda'
type Bindings = {
requestContext: ApiGatewayRequestContext
}
const app = new Hono<{ Bindings: Bindings }>()
app.get('/custom-context/', (c) => {
const lambdaContext = c.env.requestContext
return c.json(lambdaContext)
})
export const handler = handle(app)Réponses en streaming de Lambda
En modifiant le mode d'invocation d'AWS Lambda, vous pouvez obtenir des réponses en streaming.
fn.addFunctionUrl({
authType: lambda.FunctionUrlAuthType.NONE,
+ invokeMode: lambda.InvokeMode.RESPONSE_STREAM,
})L'implémentation nécessite généralement d'écrire des fragments dans NodeJS.WritableStream avec awslambda.streamifyResponse. Avec l'adaptateur AWS Lambda, vous pouvez toutefois utiliser les réponses en streaming habituelles de Hono en remplaçant handle par streamHandle.
import { Hono } from 'hono'
import { streamHandle } from '@hono/aws-lambda'
import { streamText } from 'hono/streaming'
const app = new Hono()
app.get('/stream', async (c) => {
return streamText(c, async (stream) => {
for (let i = 0; i < 3; i++) {
await stream.writeln(`${i}`)
await stream.sleep(1)
}
})
})
export const handler = streamHandle(app)