עיבוד קבצים ללא שרת: Lambda & S3 Trigger Turnkey
בעת העלאת תמונות ל-S3 יש צורך ביצירת תמונות ממוזערות אוטומטית, אך Lambda מתקשה עם קבצים גדולים. יש צורך בארכיטקטורה עמידה לתקלות עם תורים וניטור. לצוות שלנו יש ניסיון של למעלה מ-10 שנים בענן והוא סיפק למעלה מ-200 פרויקטים ללא שרת, מה שמבטיח ארכיטקטורה חזקה. במאמר זה אנו מפרקים ארכיטקטורה טיפוסית, טיפול בשגיאות ומלכודות נפוצות.
Lambda + S3 trigger הוא דפוס קלאסי ללא שרת לעיבוד קבצים. קובץ מועלה ל-S3, האירוע מפעיל אוטומטית את Lambda, שמעבד את הקובץ ושומר את התוצאה. אין צורך בשרת קבוע, והסקיילינג אוטומטי. ללא תכנית תורים מתאימה, עם זאת, אתה מסתכן באובדן אירועים. החיסכון בעלויות משמעותי: לדוגמה, עיבוד מיליון תמונות בחודש עולה כ-$50 עם Lambda, לעומת $200 עם שרת קבוע. בואו נחקור כיצד לבנות עיבוד ברמת ייצור עם תורים, DLQ וניטור.
משימות נפוצות וארכיטקטורה בסיסית
משימות טיפוסיות: יצירת תמונות ממוזערות בעת העלאת תמונה, המרת וידאו לפורמטים ורזולוציות שונות, עיבוד קבצי CSV/Excel עם ייבוא נתונים למסד נתונים, יצירת PDF מתבניות, סריקת אנטי-וירוס לקבצים שהועלו, OCR וחילוץ טקסט ממסמכים, טרנספורמציה של נתונים (XML → JSON, נורמליזציה).
| סוג קובץ | דוגמאות | גישה מומלצת |
|---|---|---|
| תמונות | JPG, PNG, WebP | Lambda + Pillow |
| מסמכים | PDF, DOCX | Lambda + pdfminer, python-docx |
| וידאו | MP4, AVI | AWS MediaConvert |
| גיליונות אלקטרוניים | CSV, XLSX | Lambda + pandas (סטרימינג) |
| ארכיונים | ZIP, RAR | Lambda + zipfile (סטרימינג) |
ארכיטקטורה בסיסית:
[Пользователь] → S3 upload → [S3 Event Notification]
↓
[Lambda Function]
↓
[Обработанный файл → S3 Output]
[Метаданные → DynamoDB]
[Нотификация → SQS/SNS] # S3 bucket для входящих файлов
resource "aws_s3_bucket" "uploads" {
bucket = "myapp-uploads"
}
# S3 bucket для обработанных файлов
resource "aws_s3_bucket" "processed" {
bucket = "myapp-processed"
}
# Объединённая конфигурация: S3 → SNS → SQS
resource "aws_s3_bucket_notification" "upload_trigger" {
bucket = aws_s3_bucket.uploads.id
topic {
topic_arn = aws_sns_topic.file_events.arn
events = ["s3:ObjectCreated:*"]
}
}
resource "aws_sns_topic_subscription" "to_sqs" {
topic_arn = aws_sns_topic.file_events.arn
protocol = "sqs"
endpoint = aws_sqs_queue.file_processing.arn
} סקיילינג עיבוד בעומס שיא
Lambda מתקדם אוטומטית, אך עלייה פתאומית בהעלאות עלולה לגרום להגבלת קצב. אנו משתמשים בתור SQS לחציצה: S3 → SNS → SQS → Lambda. זה מבטיח שאף אירוע לא יאבד. כאשר חריגה ממגבלת הביצוע המקבילי, התור צובר הודעות, ו-Lambda מעבד אותן כשהקיבולת מתפנה. למשימות קריטיות אנו מגדירים Reserved Concurrency. בהשוואה לאשכול שרתים קבוע, Lambda מהיר פי 5 בפריסה ומתקדם באופן מיידי.
Lambda Handler וקבצים גדולים
import boto3
import json
import os
from urllib.parse import unquote_plus
from PIL import Image
import io
s3 = boto3.client('s3')
def handler(event, context):
results = []
for record in event['Records']:
bucket = record['s3']['bucket']['name']
key = unquote_plus(record['s3']['object']['key'])
try:
result = process_image(bucket, key)
results.append({'key': key, 'status': 'success', **result})
except Exception as e:
print(f"Error processing {key}: {e}")
results.append({'key': key, 'status': 'error', 'error': str(e)})
return results
def process_image(bucket: str, key: str) -> dict:
# Скачать оригинал
obj = s3.get_object(Bucket=bucket, Key=key)
image_data = obj['Body'].read()
image = Image.open(io.BytesIO(image_data))
thumbnails = {}
for size_name, (width, height) in [('sm', (150, 150)), ('md', (400, 400)), ('lg', (800, 800))]:
thumb = image.copy()
thumb.thumbnail((width, height), Image.LANCZOS)
buffer = io.BytesIO()
thumb.save(buffer, format=image.format or 'JPEG', quality=85)
buffer.seek(0)
output_key = key.replace('images/', f'thumbnails/{size_name}/')
s3.put_object(
Bucket=os.environ['OUTPUT_BUCKET'],
Key=output_key,
Body=buffer,
ContentType=f'image/{(image.format or "JPEG").lower()}'
)
thumbnails[size_name] = output_key
return {'thumbnails': thumbnails, 'original_size': image.size}ל-Lambda יש מגבלות: [Пользователь] → S3 upload → [S3 Event Notification] ↓ [Lambda Function] ↓ [Обработанный файл → S3 Output] [Метаданные → DynamoDB] [Нотификация → SQS/SNS] עד 10 GB, פסק זמן עד 15 דקות, זיכרון עד 10 GB. עבור קבצים >100 MB אנו משתמשים בסטרימינג, מעבדים נתונים בנתחים מבלי לטעון הכל לזיכרון.
למה SNS+SQS אמין יותר מהפעלה ישירה של Lambda?
הודעות אירוע של S3 אינן תומכות ב-DLQ ישירות. אם Lambda נכשל, האירוע אובד. תכנית SNS+SQS מבטיחה מסירה: קריאות שנכשלו עוברות ל-DLQ לאחר N ניסיונות חוזרים. ניתן לנתח ולעבד אותן מחדש. זה עוקב אחר שיטות העבודה המומלצות של AWS לייצור. לפי תיעוד AWS, דפוס זה מבטיח אמינות מסירה של 99.9%.
מידע נוסף על הגדרת DLQ
עבור תור SQS, מוגדרת מדיניות redrive: לאחר, לדוגמה, 5 ניסיונות כושלים ההודעה עוברת ל-DLQ. זה מבטיח שאירועים לא יאבדו וניתן לנתח שגיאות.
Lambda לעומת ECS: מה לבחור?
| קריטריון | Lambda | ECS Fargate |
|---|---|---|
| זמן ביצוע מקסימלי | 15 דקות | ללא הגבלה |
| זיכרון מקסימלי | 10 GB | 30 GB |
| עלות | לכל מילישנייה | לכל vCPU/שעה |
| סקיילינג | מיידי | 30–60 שניות |
| אופטימלי עבור | משימות קצרות (<15 דקות) | משימות ארוכות, זיכרון גבוה |
לעיבוד תמונות ומסמכים, Lambda פשוט וזול יותר. להמרת וידאו אנו משתמשים ב-AWS MediaConvert.
הגדרת פונקציית Lambda לעיבוד קבצים
resource "aws_lambda_function" "processor" {
filename = "processor.zip"
function_name = "file-processor"
role = aws_iam_role.processor.arn
handler = "handler.handler"
runtime = "python3.12"
timeout = 300
memory_size = 1024
ephemeral_storage {
size = 2048
}
environment {
variables = {
OUTPUT_BUCKET = aws_s3_bucket.processed.bucket
}
}
} ניטור ומדדים
- מספר קבצים שעובדו בשעה (תפוקה טיפוסית: 1000 קבצים/דקה)
- זמן עיבוד ממוצע לפי סוג קובץ (לדוגמה, שינוי גודל תמונה בממוצע 0.3 שניות)
- שיעור שגיאות + תוכן DLQ (יעד: <0.1% שיעור שגיאות)
- התפלגות משך זמן Lambda
לוח מחוונים של CloudWatch עם מדדים אלה בתוספת התראה על גידול ב-DLQ.
מה כלול וזמנים משוערים
- פיתוח פונקציית Lambda ב-Python (או Node.js/Go) עבור סוג הקובץ שלך
- תשתית ב-Terraform / Pulumi עם S3, SNS, SQS, DLQ
- הגדרת ניטור CloudWatch + התראות
- סקירת קוד ובדיקת עומס עד 1000 קבצים/דקה
- תיעוד ארכיטקטורה והוראות פריסה
- הדרכה לצוות הלקוח (1-2 שעות)
- תמיכה למשך שבועיים לאחר המסירה
זמנים משוערים:
- ניתוח דרישות ואב-טיפוס — 2-3 ימים
- צינור מלא עם DLQ, ניטור — 4-6 ימים
- אינטגרציה עם היישום שלך (API Gateway, Cognito — אופציונלי) — 2-5 ימים
הזמנים בפועל תלויים במורכבות העיבוד. צור קשר להערכת פרויקט בת יום אחד. בקש ייעוץ וקבל הערכה מוקדמת.







