Serverless & Edge Deployment
AWS Lambda, Cloudflare Workers, Vercel Edge, cold starts, execution limits.
serverlessedgecloudflareawsdeployment
# Serverless & Edge Deployment
## Comparison
| Platform | Runtime | Limit | Cold Start | Region |
|----------|---------|-------|------------|--------|
| AWS Lambda | Node/Python/Go | 15min, 10GB | ~100-500ms | Single region |
| Cloudflare Workers | V8 isolate | 30s CPU, 128MB | ~0ms | Global edge |
| Vercel Edge Functions | V8 isolate | 30s, 128MB | ~0ms | Global edge |
| Netlify Functions | Node.js | 10s, 1GB | ~100ms | Single region |
## AWS Lambda (Node.js)
```ts
import { APIGatewayProxyHandlerV2 } from 'aws-lambda'
export const handler: APIGatewayProxyHandlerV2 = async (event) => {
const { pathParameters, queryStringParameters, body } = event
const data = body ? JSON.parse(body) : null
return {
statusCode: 200,
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ ok: true, data }),
}
}
```
## Serverless Framework
```yaml
# serverless.yml
service: my-api
provider:
name: aws
runtime: nodejs20.x
region: ap-east-1
environment:
DATABASE_URL: ${env:DATABASE_URL}
iam:
role:
statements:
- Effect: Allow
Action: [s3:GetObject, s3:PutObject]
Resource: arn:aws:s3:::my-bucket/*
functions:
api:
handler: dist/handler.handler
events:
- httpApi: { path: '/api/{proxy+}', method: ANY }
timeout: 30
memorySize: 512
cron:
handler: dist/jobs.dailyReport
events:
- schedule: cron(0 8 * * ? *) # 8am UTC daily
```
```bash
npm install -g serverless
sls deploy
sls deploy function -f api # deploy single function
sls logs -f api -t # stream logs
sls remove # teardown
```
## Cloudflare Workers
```bash
npm create cloudflare@latest my-worker
```
```ts
// src/index.ts
export default {
async fetch(request: Request, env: Env, ctx: ExecutionContext) {
const url = new URL(request.url)
if (url.pathname === '/api/data') {
// Access KV, D1, R2, Durable Objects
const value = await env.KV.get('key')
return Response.json({ value })
}
return new Response('Not found', { status: 404 })
},
}
```
```toml
# wrangler.toml
name = "my-worker"
main = "src/index.ts"
compatibility_date = "2024-01-01"
[[kv_namespaces]]
binding = "KV"
id = "xxx"
[[d1_databases]]
binding = "DB"
database_name = "mydb"
```
```bash
npx wrangler dev # local dev
npx wrangler deploy # deploy to edge
```
## Cold start mitigation (Lambda)
- Use `provisioned concurrency` for latency-sensitive functions.
- Keep Lambda warm with EventBridge ping every 5 min.
- Reduce bundle size: tree-shake, use `esbuild` instead of webpack.
- Use Lambda Snap Start (Java) or Cloudflare Workers (no cold start).
## Lambda layers (shared dependencies)
```bash
# Create layer
mkdir -p layer/nodejs && cd layer/nodejs
npm install sharp # heavy dependency
zip -r ../layer.zip .
aws lambda publish-layer-version --layer-name sharp --zip-file fileb://layer.zip
```API: /api/skills/serverless-edge