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 需要:
- 租一台伺服器(EC2)→ 每月固定費用
- 安裝作業系統、執行環境 → 維護工作
- 設定 Load Balancer、Auto Scaling → 架構複雜
- 不管有沒有人用,伺服器都在跑 → 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 等生產環境必需的機制。