Lambda\@Edge
Lambda@Edge 是 Amazon Web Services 提供的无服务器(serverless)平台。它允许你在 Amazon CloudFront 的边缘节点运行 Lambda 函数,从而可以自定义 HTTP 请求/响应的行为。
Hono 支持在 Node.js 18+ 环境下运行于 Lambda\@Edge。
1. 设置
在 Lambda\@Edge 上创建应用时,可以使用 CDK 来配置 CloudFront、IAM Role、API Gateway 等资源。
使用 cdk CLI 初始化项目。
npm
mkdir my-appcd my-appcdk init app -l typescriptnpm i honomkdir lambda
yarn
mkdir my-appcd my-appcdk init app -l typescriptyarn add honomkdir lambda
pnpm
mkdir my-appcd my-appcdk init app -l typescriptpnpm add honomkdir lambda
bun
mkdir my-appcd my-appcdk init app -l typescriptbun add honomkdir lambda
2. Hello World
编辑 lambda/index_edge.ts:
import { Hono } from 'hono'import { handle } from 'hono/lambda-edge'const app = new Hono()app.get('/', (c) => c.text('Hello Hono on Lambda@Edge!'))export const handler = handle(app)
3. 部署
编辑 bin/my-app.ts:
#!/usr/bin/env nodeimport 'source-map-support/register'import * as cdk from 'aws-cdk-lib'import { MyAppStack } from '../lib/my-app-stack'const app = new cdk.App()new MyAppStack(app, 'MyAppStack', {env: {account: process.env.CDK_DEFAULT_ACCOUNT,region: 'us-east-1',},})
编辑 lambda/cdk-stack.ts:
import { Construct } from 'constructs'import * as cdk from 'aws-cdk-lib'import * as cloudfront from 'aws-cdk-lib/aws-cloudfront'import * as origins from 'aws-cdk-lib/aws-cloudfront-origins'import * as lambda from 'aws-cdk-lib/aws-lambda'import { NodejsFunction } from 'aws-cdk-lib/aws-lambda-nodejs'import * as s3 from 'aws-cdk-lib/aws-s3'export class MyAppStack extends cdk.Stack {public readonly edgeFn: lambda.Functionconstructor(scope: Construct, id: string, props?: cdk.StackProps) {super(scope, id, props)const edgeFn = new NodejsFunction(this, 'edgeViewer', {entry: 'lambda/index_edge.ts',handler: 'handler',runtime: lambda.Runtime.NODEJS_20_X,})// 上传任意 HTML 文件const originBucket = new s3.Bucket(this, 'originBucket')new cloudfront.Distribution(this, 'Cdn', {defaultBehavior: {origin: new origins.S3Origin(originBucket),edgeLambdas: [{functionVersion: edgeFn.currentVersion,eventType: cloudfront.LambdaEdgeEventType.VIEWER_REQUEST,},],},})}}
最后运行以下命令进行部署:
cdk deploy
Callback
如果你想添加 Basic Auth,并在验证后继续处理请求,可以使用 c.env.callback()。
import { Hono } from 'hono'import { basicAuth } from 'hono/basic-auth'import type { Callback, CloudFrontRequest } from 'hono/lambda-edge'import { handle } from 'hono/lambda-edge'type Bindings = {callback: Callbackrequest: CloudFrontRequest}const app = new Hono<{ Bindings: Bindings }>()app.get('*',basicAuth({username: 'hono',password: 'acoolproject',}))app.get('/', async (c, next) => {await next()c.env.callback(null, c.env.request)})export const handler = handle(app)
