עיבוד טופס יצירת קשר עם AWS Lambda
טופס יצירת קשר באתר React עם יותר מ-2000 הגשות ביום החל להיכשל: התגובה הגיעה לאחר 30 שניות, ומיילים אבדו. מופע ה-EC2 המונוליטי הישן לא יכול היה להתמודד עם העומסים. החלפנו אותו ב-AWS Lambda — זמן התגובה ירד ל-300 אלפיות השנייה, והעלות לכל הגשת טופס — שברירי סנט. ארכיטקטורת Serverless מבטלת את ניהול השרת: אתה מתמקד בקוד, ו-AWS מבצע סקלת עומסים. עם זאת, התחלה קרה (Cold Start) ופעולות מסד נתונים דורשות תכנון קפדני. נסקור תרחישים טיפוסיים, נציג קוד, ונספק פתרונות מוכנים. כדי להעריך את הפרויקט שלך, צור קשר עם מהנדסי AWS המוסמכים שלנו עם ניסיון של 12+ שנים ו-80+ פרויקטי Serverless שהושלמו.
Lambda לעומת EC2: מתי להשתמש במה
Lambda יעילה למשימות אסינכרוניות ואפיזודיות. הנה השוואה מול שרת EC2 קלאסי:
| קריטריון | AWS Lambda | AWS EC2 |
|---|---|---|
| ניהול שרת | לא נדרש | ניהול מלא |
| סקלת עומסים | אוטומטית | ידני / סקלה אוטומטית |
| התחלה קרה | 100–500 אלפיות השנייה | אין |
| מחיר | לפי ביצוע | לפי זמן פעילות |
| מגבלת זמן | 15 דקות | ללא הגבלה |
מתאים ל: עיבוד טפסי יצירת קשר, יצירת PDF/תמונות לפי דרישה, Webhooks ממערכות תשלום ו-CRM, שינוי גודל תמונות בעת העלאה, מתזמני משימות (cron דרך EventBridge), פרוקסי API לשירותי צד שלישי.
לא מתאים ל: חיבורים ארוכי טווח (WebSocket דורש שירות נפרד), משימות העולות על 15 דקות, פעולות מסד נתונים בתדירות גבוהה ללא Connection Pooling. במקרים כאלה, Lambda הופכת לא רק ליקרה יותר אלא גם לאיטית יותר: ב-5000 בקשות בשנייה, EC2 עם סקלה אוטומטית עולה פחות מ-Provisioned Concurrency.
מדוע Lambda משתלמת יותר כלכלית
מנקודת מבט כלכלית, Lambda מנצחת בעומס לא אחיד. ב-EC2, אתה משלם עבור שרת פעיל 24/7, גם אם הוא מעבד בקשות פעם בשעה. Lambda גובה תשלום לפי קריאה — החיסכון בזמן סרק יכול להגיע ל-90%. התיעוד הרשמי של AWS נותן דוגמה: אתר עם 10,000 בקשות ביום על EC2 t3.micro עולה כ-8$ לחודש, בעוד Lambda עולה 0.05$ עבור אותו עומס — הפחתה של 99%. בנוסף, אתה נמנע מהגדרת סקלה אוטומטית, תיקוני מערכת הפעלה וניטור. הלקוחות שלנו חוסכים עד 70% על תשתית במעבר ל-Lambda.
כיצד Lambda מעבדת טופס: דוגמת קוד
טופס יצירת קשר באתר React שולח בקשת POST ל-API Gateway, שמפעיל פונקציית Lambda. הפונקציה מאמתת נתונים עם Zod ושולחת דוא"ל דרך SES. קוד:
import { APIGatewayProxyHandler } from "aws-lambda";
import { SESClient, SendEmailCommand } from "@aws-sdk/client-ses";
import { z } from "zod";
const ses = new SESClient({ region: "eu-west-1" });
const ContactSchema = z.object({
name: z.string().min(2).max(100),
email: z.string().email(),
message: z.string().min(10).max(2000),
});
export const handler: APIGatewayProxyHandler = async (event) => {
const headers = {
"Access-Control-Allow-Origin": "https://your-site.com",
"Content-Type": "application/json",
};
try {
const body = JSON.parse(event.body || "{}");
const data = ContactSchema.parse(body);
await ses.send(new SendEmailCommand({
Source: "[email protected]",
Destination: {
ToAddresses: ["[email protected]"],
},
Message: {
Subject: {
Data: `Новое сообщение от ${data.name}`,
},
Body: {
Text: {
Data: `От: ${data.name} <${data.email}>\n\n${data.message}`,
},
},
},
}));
return {
statusCode: 200,
headers,
body: JSON.stringify({ ok: true }),
};
} catch (error) {
if (error instanceof z.ZodError) {
return {
statusCode: 400,
headers,
body: JSON.stringify({ errors: error.errors }),
};
}
console.error(error);
return {
statusCode: 500,
headers,
body: JSON.stringify({ error: "Internal error" }),
};
}
}; אופטימיזציה של ביצועי Lambda
כיצד להפחית התחלה קרה?
התחלה קרה היא זמן האתחול לאחר תקופת חוסר פעילות ממושכת. ב-Node.js 20 זה 200–500 אלפיות השנייה, ב-Python 100–300 אלפיות השנייה. אם זמן תגובה מתחת לשנייה הוא קריטי, השתמש באחת מהשיטות הבאות:
| שיטה | תיאור | עלות נוספת |
|---|---|---|
| Provisioned Concurrency | N מופעים שחוממו מראש | $0.015 למופע/שעה |
| esbuild + tree-shaking | הקטנת גודל החבילה | חינם |
| SnapStart (Java) | Snapshot לאחר אתחול | חינם |
| בקשות Ping | EventBridge כל 5 דקות | זניח |
דוגמה לאתחול לקוחות מחוץ ל-handler (מבוצע פעם אחת):
const dbClient = new DynamoDBClient({ region: "eu-west-1" });
const sesClient = new SESClient({ region: "eu-west-1" });
export const handler = async (event) => {
// handler использует уже инициализированные клиенты
}; טעויות נפוצות של מפתחים
- חבילה גדולה מדי: הכללת כל התלויות ללא tree-shaking מגדילה את ההתחלה הקרה ב-200–500 אלפיות השנייה.
- יצירת לקוחות בתוך ה-handler: כל קריאה יוצרת חיבור מסד נתונים חדש — מוביל לבעיית N+1.
- התעלמות ממגבלות זמן: אם הפונקציה רצה יותר מזמן ה-timeout (מקסימום 15 דקות), היא נכשלת.
- חוסר בטיפול בשגיאות: חריגות שלא נתפסו מובילות לניסיונות חוזרים ולעלויות נוספות.
כיצד לחבר את Lambda למסד נתונים?
חיבור TCP סטנדרטי ל-PostgreSQL/MySQL ב-Lambda יוצר חיבור חדש לכל קריאה — ב-1000 בקשות בשנייה, מסד הנתונים נחנק. פתרונות:
| פתרון | מאפיינים | מחיר |
|---|---|---|
| RDS Proxy | בריכת חיבורים מול RDS | +$0.015 לכל vCPU/שעה |
| DynamoDB | Serverless טבעי, ללא חיבורים | לפי בקשה |
| PlanetScale / Neon | מסד נתונים Serverless עם HTTP API | תשלום לפי שימוש |
למספר גבוה של קריאות במקביל, RDS Proxy יכול להפוך לצוואר בקבוק — במקרים כאלה, עברו ל-DynamoDB או בצעו Sharding למסד הנתונים.
פריסה וניטור
תהליך פיתוח ופריסה
- תכנון: הגדרת טריגרים, תפקידי IAM, timeouts וזיכרון.
- פיתוח: כתיבת הפונקציה ב-TypeScript עם אימות וטיפול בשגיאות.
- בדיקות מקומיות: הרצה עם SAM CLI או Docker עם אמולציית API Gateway.
- בנייה: שימוש ב-esbuild לאריזה (tree-shaking, minification).
- פריסה: דרך AWS SAM (template.yaml) — ראשית
import { APIGatewayProxyHandler } from "aws-lambda"; import { SESClient, SendEmailCommand } from "@aws-sdk/client-ses"; import { z } from "zod"; const ses = new SESClient({ region: "eu-west-1" }); const ContactSchema = z.object({ name: z.string().min(2).max(100), email: z.string().email(), message: z.string().min(10).max(2000), }); export const handler: APIGatewayProxyHandler = async (event) => { const headers = { "Access-Control-Allow-Origin": "https://your-site.com", "Content-Type": "application/json", }; try { const body = JSON.parse(event.body || "{}"); const data = ContactSchema.parse(body); await ses.send(new SendEmailCommand({ Source: "[email protected]", Destination: { ToAddresses: ["[email protected]"] }, Message: { Subject: { Data: `Новое сообщение от ${data.name}` }, Body: { Text: { Data: `От: ${data.name} <${data.email}>\n\n${data.message}` } } } })); return { statusCode: 200, headers, body: JSON.stringify({ ok: true }) }; } catch (error) { if (error instanceof z.ZodError) { return { statusCode: 400, headers, body: JSON.stringify({ errors: error.errors }) }; } console.error(error); return { statusCode: 500, headers, body: JSON.stringify({ error: "Internal error" }) }; } };, לאחר מכןconst dbClient = new DynamoDBClient({ region: "eu-west-1" }); const sesClient = new SESClient({ region: "eu-west-1" }); export const handler = async (event) => { // handler использует уже инициализированные клиенты };. - ניטור: הגדרת לוחות מחוונים ב-CloudWatch, התראות על שגיאות וזמן ביצוע.
אנו משתמשים ב-תיעוד AWS Serverless Application Model (SAM) לתשתית כקוד. דוגמת template.yaml:
---
AWSTemplateFormatVersion: "2010-10-09"
Transform: AWS::Serverless-2016-10-31
Globals:
Function:
Runtime: nodejs20.x
Timeout: 10
MemorySize: 256
Environment:
Variables:
NODE_ENV: production
Resources:
ContactFormFunction:
Type: AWS::Serverless::Function
Properties:
Handler: dist/handlers/contact-form.handler
Events:
Api:
Type: HttpApi
Properties:
Path: /contact
Method: POST
Policies:
- SESCrudPolicy:
IdentityName: your-site.com
פקודות:
npm run build sam build sam deploy --guided sam deploy רישום ו-Tracing
AWS Lambda Powertools היא הספרייה הרשמית לרישום מובנה, Tracing דרך X-Ray, ומדדים דרך CloudWatch EMF.
import { Logger } from "@aws-lambda-powertools/logger";
import { Tracer } from "@aws-lambda-powertools/tracer";
const logger = new Logger({ serviceName: "contact-form" });
const tracer = new Tracer({ serviceName: "contact-form" });
export const handler = tracer.captureLambdaHandler(async (event) => {
logger.addContext(context);
logger.info("Processing contact form", { email: event.body?.email });
// ...
}); השירותים שלנו
מה כלול בעבודה שלנו
- עיצוב ארכיטקטוני: בחירת טריגרים, איזון התחלה קרה
- פיתוח פונקציות ב-TypeScript עם אימות וטיפול בשגיאות
- הגדרת CI/CD דרך GitHub Actions: בנייה, בדיקות, פריסה
- תיעוד API ותיאור תשתית
- ניטור: לוחות מחוונים ב-CloudWatch, התראות על שגיאות וזמן ביצוע
- הדרכת צוות: סקירת קוד, מדריך תחזוקה
לוח זמנים
פונקציית Lambda אחת עם פריסת SAM — 1–2 ימים. סט של 5–7 פונקציות עם CI/CD וניטור — 5–7 ימים. למהנדסים שלנו יש ניסיון של 12+ שנים ב-AWS והם סיפקו 80+ פרויקטי Serverless. לוחות זמנים מדויקים תלויים באינטגרציות. קבל ייעוץ על ארכיטקטורת הפתרון — נכין הצעה מפורטת ומקיפה.







