למה AWS Lambda ללוגיקת צד שרת באפליקציות מובייל?
דמיין שהאפליקציה שלך מעבדת 1000 רכישות בדקה. לקוח מאשר עסקה — אתה צריך לאמת את האותנטיות שלה מול חנות האפליקציות. אתה לא יכול לעשות זאת בצד הלקוח — תוקף יכול לזייף את התשובה. לכן לוגיקת צד שרת עם AWS Lambda לאפליקציות מובייל היא קריטית. ללא אימות בצד השרת, תוקף יכול לזייף את התשובה ולקבל תוכן בחינם. AWS Lambda פותר זאת: הפונקציה בודקת את הקבלה מול Apple או Google, כותבת את התוצאה ל-DynamoDB, ומחזירה את הסטטוס ללקוח. הכל ללא ניהול שרתים ועם קנה מידה אוטומטי בעומסי שיא.
AWS Lambda הן פונקציות serverless שמבוצעות לפי דרישה ואינן דורשות ניהול שרתים. אנו משתמשים ב-Lambda למשימות שלא ניתן להעביר ללקוח: אימות תשלומים, יצירת קישורי S3 חתומים, התראות push דרך APNs/FCM, עיבוד webhooks מ-Stripe או Apple IAP, וחישובים כבדים. בניגוד לשרת מסורתי, Lambda מתקנה אוטומטית תחת עומס, ואתה משלם רק על זמן ביצוע בפועל.
ארכיטקטורה: לקוח מובייל → Lambda
האפליקציה הניידת קוראת ל-Lambda דרך אחת מהדרכים הבאות:
- API Gateway + Lambda — הנפוצה ביותר. API Gateway מסוג REST או HTTP מקבל את הבקשה ומעביר אותה ל-Lambda. Lambda מגיבה, וה-Gateway מעביר את התשובה ללקוח. אימות דרך Cognito JWT Authorizer או IAM.
- AppSync + Lambda resolver — עבור GraphQL. Lambda משמשת כ-resolver לשדות ספציפיים בסכמה.
- Lambda Function URL — נקודת קצה HTTPS ישירה לפונקציה ללא API Gateway. זול ופשוט יותר, אבל עם פחות תכונות (ללא throttling, ללא דומיינים מותאמים אישית ללא CloudFront).
השוואת אפשרויות קריאה ל-Lambda
| קריטריון | API Gateway + Lambda | Function URL |
|---|---|---|
| מורכבות הגדרה | בינונית | נמוכה |
| אימות | Cognito, JWT, IAM | IAM, אימות Lambda URL |
| Throttling | מובנה | אין |
| דומיין מותאם אישית | כן (דרך CloudFront) | רק דרך CloudFront |
| עלות | בקשות + תעבורה | רק קריאות ל-Lambda |
איך להפחית Cold Start?
Cold start — האתגר המרכזי של Lambda ללקוחות מובייל. ב-Node.js 20.x עם SnapStart, זמן ההשהיה הוא 200–400 אלפיות השנייה. עבור Java ללא SnapStart — 1–3 שניות. אנו מיישמים צעדי הפחתה:
- Provisioned Concurrency — מופעים מחוממים מראש, אבל משלמים על זמן סרק
- AWS Lambda SnapStart (Java) — תמונת מצב של האתחול
- מזעור תלויות: aws-sdk v3 עם ייבוא מודולרי במקום ה-SDK המלא
- בחירת runtime: Node.js או Python לפונקציות רגישות לזמן השהיה
השוואת Cold Start לפי Runtime
| Runtime | ללא SnapStart | עם SnapStart |
|---|---|---|
| Node.js 20.x | 200–400 אלפיות השנייה | — |
| Python 3.12 | 300–500 אלפיות השנייה | — |
| Java 21 | 1–3 שניות | 150–300 אלפיות השנייה |
| .NET 8 | 800–1500 אלפיות השנייה | 400–800 אלפיות השנייה |
דוגמה לאופטימיזציית ייבוא:
// Плохо: импортируем весь SDK
import AWS from 'aws-sdk';
// Хорошо: только нужный клиент
import { DynamoDBClient, PutItemCommand } from '@aws-sdk/client-dynamodb';גודל החבילה: 30 MB לעומת 150 KB. ההבדל ב-cold start משמעותי.
דוגמה מעשית: אימות Apple IAP
לא ניתן לבצע אימות רכישה ב-App Store בצד הלקוח — קל לזייף את הקבלה. לפי מדריך אימות הקבלות של Apple, השרת שולח את receipt-data לנקודת הקצה verifyReceipt. Lambda:
// handler.mjs (Node.js 20.x)
import { AppleVerifyReceiptResponse } from './types.js';
export const handler = async (event) => {
const { receiptData, userId } = JSON.parse(event.body);
const verifyUrl = process.env.APPLE_ENV === 'production' ? 'https://buy.itunes.apple.com/verifyReceipt' : 'https://sandbox.itunes.apple.com/verifyReceipt';
const response = await fetch(verifyUrl, {
method: 'POST',
body: JSON.stringify({
'receipt-data': receiptData,
password: process.env.APPLE_SHARED_SECRET,
'exclude-old-transactions': true,
}),
});
const data = await response.json();
if (data.status !== 0) {
return {
statusCode: 400,
body: JSON.stringify({ error: 'Invalid receipt' })
};
}
// Сохраняем purchase в DynamoDB
await savePurchase(userId, data.latest_receipt_info);
return {
statusCode: 200,
body: JSON.stringify({ success: true })
};
};סודות (APPLE_SHARED_SECRET) — ב-AWS Secrets Manager או Parameter Store, לא ישירות במשתני סביבה (הם מופיעים בלוגים אם מטפלים בהם לא נכון). אם אתה צריך אינטגרציה דומה, צור קשר — נעזור ליישם אותה עבור המחסנית שלך.
מחסנית Infrastructure as Code
Lambda דרך CDK או Terraform היא חובה לסביבת production. אנו משתמשים ב-AWS CDK על TypeScript:
דוגמת מחסנית CDK מורחבת
// AWS CDK (TypeScript)
const verifyPurchaseFn = new NodejsFunction(this, 'VerifyPurchase', {
entry: 'src/functions/verify-purchase/handler.ts',
runtime: Runtime.NODEJS_20_X,
timeout: Duration.seconds(10),
memorySize: 256,
environment: {
APPLE_ENV: 'production',
},
bundling: {
minify: true,
sourceMap: true,
},
});
const api = new RestApi(this, 'MobileApi');
api.root.addResource('purchase').addResource('verify')
.addMethod('POST', new LambdaIntegration(verifyPurchaseFn), {
authorizer: cognitoAuthorizer,
});
CDK מהדר ומאגד פונקציות TypeScript דרך esbuild ופורס דרך CloudFormation.
תהליך האינטגרציה
- ניתוח: קביעת פונקציות צד שרת (אימות, התראות, webhooks)
- עיצוב: ארכיטקטורת API, בחירת runtime, הגדרת IAM
- יישום: פיתוח Lambda, אינטגרציה עם ה-SDK הנייד
- בדיקות: בדיקות יחידה, בדיקות עומס, אימות cold start
- פריסה: IaC, הגדרת סביבות dev/staging/prod
- ניטור: CloudWatch Logs, X-Ray tracing
מה כלול
- הגדרת פונקציות Lambda ללוגיקת צד שרת ספציפית
- API Gateway או Function URL עם אימות
- IaC דרך CDK או Terraform
- הגדרת סביבות (dev/staging/prod)
- ניטור דרך CloudWatch + X-Ray tracing
- אינטגרציה עם הלקוח הנייד (SDK או fetch)
לוחות זמנים משוערים
פונקציית Lambda אחת עם API Gateway: 1–2 ימים. Backend serverless מלא (5–10 פונקציות + DynamoDB + Auth): 1–3 שבועות. התמחור נקבע באופן אישי לפי היקף העבודה. שימוש ב-Lambda יכול להפחית עלויות תשתית בעד 60% בהשוואה לשרת מסורתי.
קבל ייעוץ
אם אתה צריך לוגיקת צד שרת אמינה לאפליקציה הניידת שלך, צור קשר להערכת פרויקט ובדיקה חינמית של ה-backend הנוכחי שלך. הניסיון הרב שלנו בפיתוח מובייל ומאות פתרונות serverless שיושמו מבטיחים איכות ואספקה בזמן.







