Lambda@Edge
Lambda@Edge는 아마존 웹 서비스(AWS)가 제공하는 서버리스 플랫폼이다. 이 플랫폼을 사용하면 아마존 클라우드프론트(CloudFront)의 엣지 로케이션에서 Lambda 함수를 실행할 수 있다. 이를 통해 HTTP 요청 및 응답에 대한 동작을 커스텀할 수 있다.
Hono는 Node.js 18 이상 환경에서 Lambda@Edge를 지원한다.
1. 설정
Lambda@Edge에서 애플리케이션을 생성할 때, CDK를 사용하면 CloudFront, IAM Role, API Gateway 등의 함수를 설정하는 데 유용하다.
cdk CLI를 사용해 프로젝트를 초기화한다.
sh
mkdir my-app
cd my-app
cdk init app -l typescript
npm i hono
mkdir lambdash
mkdir my-app
cd my-app
cdk init app -l typescript
yarn add hono
mkdir lambdash
mkdir my-app
cd my-app
cdk init app -l typescript
pnpm add hono
mkdir lambdash
mkdir my-app
cd my-app
cdk init app -l typescript
bun add hono
mkdir lambda2. Hello World
lambda/index_edge.ts 파일을 편집한다.
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 파일을 수정한다.
ts
#!/usr/bin/env node
import '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 파일을 수정한다.
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.Function
constructor(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,
},
],
},
})
}
}마지막으로 배포를 실행한다.
sh
cdk deploy콜백 함수
Basic Auth를 추가하고 검증 후 요청 처리를 계속하려면 c.env.callback()을 사용한다.
ts
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: Callback
request: 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)