AWS Lambda

🔥 Vibe Prompt

"Create a Lambda for image resizing triggered by S3 upload. Deploy with Terraform."

# lambda_function.py
import boto3, os
from PIL import Image
import io

s3 = boto3.client('s3')

def lambda_handler(event, context):
    bucket = event['Records'][0]['s3']['bucket']['name']
    key = event['Records'][0]['s3']['object']['key']
    
    # Get image
    response = s3.get_object(Bucket=bucket, Key=key)
    image = Image.open(io.BytesIO(response['Body'].read()))
    
    # Resize
    image.thumbnail((200, 200))
    
    # Save to thumbnails/
    buffer = io.BytesIO()
    image.save(buffer, 'JPEG')
    s3.put_object(
        Bucket=bucket,
        Key=f"thumbnails/{key.split('/')[-1]}",
        Body=buffer.getvalue()
    )
    
    return {"statusCode": 200, "body": "Resized!"}

Terraform

resource "aws_lambda_function" "resizer" {
  filename         = "lambda.zip"
  function_name    = "image-resizer"
  role             = aws_iam_role.lambda.arn
  handler          = "lambda_function.lambda_handler"
  runtime          = "python3.12"
  timeout          = 30
  memory_size      = 256
  source_code_hash = filebase64sha256("lambda.zip")
}

resource "aws_s3_bucket_notification" "uploads" {
  bucket = aws_s3_bucket.uploads.id
  lambda_function {
    lambda_function_arn = aws_lambda_function.resizer.arn
    events = ["s3:ObjectCreated:*"]
  }
}

Lambda Best Practices

| Practice | Why | |----------|-----| | Set timeout & memory | Cost control | | Use environment vars | Config injection | | Keep cold start low | <1s for user-facing | | Use Powertools | Observability | | Package with Docker | Consistent env |

Limits

| Resource | Limit | |----------|-------| | Memory | 128 MB - 10 GB | | Timeout | 900s (15 min) | | Payload | 6 MB (sync), 256 KB (async) | | /tmp storage | 512 MB - 10 GB | | Concurrent exec | 1000 (soft) |

Key Points

  • Understand the core concepts thoroughly
  • Practice with hands-on code examples
  • Apply knowledge to real-world problems
  • Review and reinforce through exercises

Further Learning

  • Official documentation
  • Open source projects on GitHub
  • Community forums and discussions
  • Related courses and tutorials


為什麼 Lambda 改變了部署的遊戲規則?

在 Lambda 出現之前,部署一個 API 需要:

  1. 租一台伺服器(EC2)→ 每月固定費用
  2. 安裝作業系統、執行環境 → 維護工作
  3. 設定 Load Balancer、Auto Scaling → 架構複雜
  4. 不管有沒有人用,伺服器都在跑 → 24 小時付費

Lambda 把這一切都簡化了:

| 傳統 EC2 | Lambda | |:--------:|:------:| | 24 小時收費 | 按執行次數 × 執行時間計費 | | 需要管理作業系統 | 只需上傳程式碼 | | 需設定 Auto Scaling | 自動從 0 擴展到數千並發 | | 冷機時也在燒錢 | 沒有請求時 = 零成本 |

實際成本比較

場景:一個小型 API,每天 10 萬次請求,每次執行 200ms

EC2 (t3.micro): ~$10/月(24 小時跑)
Lambda: ~$2.50/月(按使用量計費)

場景:一個業餘專案,每天 10 次請求

EC2: ~$10/月(你還是要付一樣的錢)
Lambda: ~$0.0001/月(接近免費!)

但 Lambda 也有陷阱

| 陷阱 | 影響 | 解決方案 | |:----:|:----:|:---------| | 冷啟動 | 閒置一段時間後,首次調用需 100-1000ms | 使用 Provisioned Concurrency 或定期發送心跳請求 | | 15 分鐘超時 | 無法執行長時間任務 | 使用 Step Functions 拆分成多個 Lambda | | 部署包大小限制 | 250MB(含 Layers) | 使用 Lambda Layers 分離依賴 | | 無狀態 | 不能依賴本地檔案系統 | 使用 S3 或 ElastiCache 儲存狀態 |

下一章預告:從函式到 API

Lambda 是一個函式,但使用者是透過 HTTP 請求來呼叫它的。下一章的 API Gateway + Lambda 教你如何在 Lambda 前面加上 API Gateway,讓你的函式變成一個完整的 REST API——包含路由、驗證、速率限制、CORS 等生產環境必需的機制。

會員專屬免費教學

本章節為註冊會員專屬的免費開放內容!請先登入或註冊會員,即可立即解鎖閱讀。

立即登入 / 註冊