AI Skill Library

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