פיתוח מיקרוסרוויס על Lambda וקבלת שגיאה 502 — פסקי זמן באינטגרציה. או שלקוח מתלונן על מהירות תגובה בעוד שיומני CloudWatch מראים עיכובים של עד 10 שניות. סביר להניח שהבעיה היא בתצורת API Gateway: פסק זמן שגוי, חוסר caching, או סוג authorizer שגוי. במשך יותר מ-5 שנים של עבודה עם AWS, הגדרנו יותר מ-50 API Gateways — מפרוקסי REST פשוטים ועד שערים רב-אזוריים עם Cognito ו-authorizers מותאמים אישית. לאחרונה, בפרויקט אחד, תצורת פסק זמן שגויה גרמה לכשל נקודת קצה תחת עומס שיא. לאחר מעבר מ-HTTP ל-REST API והפעלת caching, זמן האחזור ירד ב-40%, ועלויות התשתית ירדו ב-30%. הזמינו ייעוץ — נעזור לכם לחסוך עד 30% מהוצאות ה-API Gateway החודשיות שלכם.
אנחנו פותרים בעיות אלה: אינטגרציית Lambda שגויה (שאילתות N+1 ב-DynamoDB עקב תכנון לקוי), חוסר throttling המוביל לעומס יתר על השרת האחורי, ובחירת סוג API שגויה — REST במקום HTTP, הגורמת לכם לשלם פי 3.5 יותר. תצורה נכונה של API Gateway יכולה להפחית את זמן האחזור ב-40% ולמנוע השבתות. הגדרת caching אופטימלית מקצצת את זמן האחזור בחצי.
איך לבחור בין REST API ל-HTTP API?
| תכונה | REST API | HTTP API |
|---|---|---|
| אינטגרציית Lambda | + | + |
| JWT authorizer | + | + |
| Authorizer מותאם אישית | + | + |
| תוכניות שימוש / מפתחות API | + | — |
| מיפוי בקשה/תגובה | + | — |
| אינטגרציית WAF | + | — |
| נקודות קצה פרטיות | + | — |
| מחיר (למיליון בקשות) | $3.50 | $1.00 |
HTTP API מתאים לפרוקסי פשוטים של backend->Lambda. REST API נדרש לשינויי בקשות מורכבים ו-throttling לפי מפתחות API. אם אתם רק מתחילים, בחרו ב-HTTP — הוא זול פי 3.5. בחירה נכונה יכולה לחסוך עד 20% מתקציב התשתית שלכם.
איך להפחית עלויות API Gateway?
בחירת סוג ה-API הנכון היא רק הצעד הראשון. הפעלת caching ברמת השער מפחיתה את מספר הקריאות ל-Lambda, מה שמשפיע ישירות על העלות. תחת עומס גבוה, מעבר מ-HTTP ל-REST עם caching יכול להוריד עלויות ב-30–50%. כמו כן, השתמשו ב-Terraform לאוטומציה: ביטול שגיאות ידניות מפחית תקלות יקרות. נבחן את התרחיש שלכם ונציע תצורה אופטימלית — צרו קשר לפרטים.
למה להשתמש ב-Terraform עבור API Gateway?
Terraform מאפשר ניהול גרסאות של תשתית כקוד, הימנעות משגיאות תצורה ידניות ושכפול סביבות תוך דקות. להלן תצורת REST API טיפוסית עם הרשאת Cognito שבה אנו משתמשים בכל פרויקט.
# main.tf
resource "aws_api_gateway_rest_api" "main" {
name = "myapp-api"
description = "Main application API"
endpoint_configuration {
types = ["REGIONAL"]
}
}
resource "aws_api_gateway_resource" "users" {
rest_api_id = aws_api_gateway_rest_api.main.id
parent_id = aws_api_gateway_rest_api.main.root_resource_id
path_part = "users"
}
resource "aws_api_gateway_method" "users_get" {
rest_api_id = aws_api_gateway_rest_api.main.id
resource_id = aws_api_gateway_resource.users.id
http_method = "GET"
authorization = "COGNITO_USER_POOLS"
authorizer_id = aws_api_gateway_authorizer.cognito.id
request_parameters = {
"method.request.querystring.page" = false
"method.request.querystring.limit" = false
}
}
resource "aws_api_gateway_integration" "users_get" {
rest_api_id = aws_api_gateway_rest_api.main.id
resource_id = aws_api_gateway_resource.users.id
http_method = aws_api_gateway_method.users_get.http_method
integration_http_method = "POST"
type = "AWS_PROXY"
uri = aws_lambda_function.users_handler.invoke_arn
} איך לבחור את סוג ההרשאה?
Cognito מתאים לאימות JWT עם רשתות חברתיות או LDAP. Lambda authorizer נדרש לאינטגרציה עם ספק זהויות חיצוני (IdP) או לוגיקה מורכבת (למשל, בקרת גישה מבוססת IP). בחרו ב-Cognito לתרחישים סטנדרטיים, וב-Lambda לגמישות.
Cognito Authorizer
resource "aws_api_gateway_authorizer" "cognito" {
name = "cognito-authorizer"
rest_api_id = aws_api_gateway_rest_api.main.id
type = "COGNITO_USER_POOLS"
provider_arns = [aws_cognito_user_pool.main.arn]
identity_source = "method.request.header.Authorization"
} Lambda Authorizer (אימות מותאם אישית)
resource "aws_api_gateway_authorizer" "lambda" {
name = "lambda-authorizer"
rest_api_id = aws_api_gateway_rest_api.main.id
authorizer_uri = aws_lambda_function.authorizer.invoke_arn
authorizer_result_ttl_in_seconds = 300
type = "TOKEN"
identity_source = "method.request.header.Authorization"
} תוכניות שימוש ומפתחות API
resource "aws_api_gateway_usage_plan" "standard" {
name = "standard-plan"
api_stages {
api_id = aws_api_gateway_rest_api.main.id
stage = aws_api_gateway_stage.prod.stage_name
}
throttle_settings {
burst_limit = 100
rate_limit = 50
}
quota_settings {
limit = 10000
period = "DAY"
}
}
resource "aws_api_gateway_api_key" "partner_app" {
name = "partner-app-key"
}
resource "aws_api_gateway_usage_plan_key" "partner" {
key_id = aws_api_gateway_api_key.partner_app.id
key_type = "API_KEY"
usage_plan_id = aws_api_gateway_usage_plan.standard.id
} Stage, רישום ופריסה
resource "aws_api_gateway_deployment" "main" {
rest_api_id = aws_api_gateway_rest_api.main.id
triggers = {
redeployment = sha1(jsonencode([
aws_api_gateway_resource.users.id,
aws_api_gateway_method.users_get.id,
aws_api_gateway_integration.users_get.id,
]))
}
lifecycle {
create_before_destroy = true
}
}
resource "aws_api_gateway_stage" "prod" {
deployment_id = aws_api_gateway_deployment.main.id
rest_api_id = aws_api_gateway_rest_api.main.id
stage_name = "prod"
access_log_settings {
destination_arn = aws_cloudwatch_log_group.api_gateway.arn
format = jsonencode({
requestId = "$context.requestId"
sourceIp = "$context.identity.sourceIp"
requestTime = "$context.requestTime"
httpMethod = "$context.httpMethod"
routeKey = "$context.routeKey"
status = "$context.status"
responseLength = "$context.responseLength"
latency = "$context.responseLatency"
})
}
}
resource "aws_api_gateway_method_settings" "prod" {
rest_api_id = aws_api_gateway_rest_api.main.id
stage_name = aws_api_gateway_stage.prod.stage_name
method_path = "*/*"
settings {
throttling_burst_limit = 500
throttling_rate_limit = 200
logging_level = "INFO"
metrics_enabled = true
}
} איך להגדיר ניטור והתראות?
- הפעל
# main.tf resource "aws_api_gateway_rest_api" "main" { name = "myapp-api" description = "Main application API" endpoint_configuration { types = ["REGIONAL"] } } resource "aws_api_gateway_resource" "users" { rest_api_id = aws_api_gateway_rest_api.main.id parent_id = aws_api_gateway_rest_api.main.root_resource_id path_part = "users" } resource "aws_api_gateway_method" "users_get" { rest_api_id = aws_api_gateway_rest_api.main.id resource_id = aws_api_gateway_resource.users.id http_method = "GET" authorization = "COGNITO_USER_POOLS" authorizer_id = aws_api_gateway_authorizer.cognito.id request_parameters = { "method.request.querystring.page" = false "method.request.querystring.limit" = false } } resource "aws_api_gateway_integration" "users_get" { rest_api_id = aws_api_gateway_rest_api.main.id resource_id = aws_api_gateway_resource.users.id http_method = aws_api_gateway_method.users_get.http_method integration_http_method = "POST" type = "AWS_PROXY" uri = aws_lambda_function.users_handler.invoke_arn }בהגדרות ה-stage. - הגדר מדדים מרכזיים: 4XXError, 5XXError, Latency, Count.
- צור CloudWatch Alarms בהתאם לספים (ראה טבלה להלן).
- הגדר התראות SNS עבור אזעקות.
| מדד | תיאור | סף התראה |
|---|---|---|
| 4XXError | מספר שגיאות לקוח | > 5% מהבקשות |
| 5XXError | מספר שגיאות שרת | > 1% מהבקשות |
| Latency | זמן אחזור ממוצע | > 1000 ms |
| Count | מספר בקשות | > 1000/דקה |
גישה זו מאפשרת תגובה בזמן לבעיות ושמירה על SLA.
מה כלול בעבודה
| שלב | משך | תוצאה |
|---|---|---|
| ביקורת ארכיטקטורה נוכחית | יום אחד | תוכנית אופטימיזציה |
| עיצוב API | 1–2 ימים | סכמת API, בחירת הרשאה |
| סקריפטים של Terraform | 2–3 ימים | תשתית ניתנת לשכפול |
| אינטגרציה עם Lambda/DB | 1–2 ימים | נקודות קצה פעילות |
| הגדרת ניטור | 0.5 יום | לוח מחוונים של CloudWatch והתראות |
| פריסה ותיעוד | יום אחד | Staging + תיעוד |
לוחות זמנים לאספקה
הגדרת REST API עם authorizer אחד ותוכנית שימוש אורכת 3–5 ימי עסקים. אם נדרש דומיין מותאם אישית או טרנספורמציה מורכבת, עד 7 ימים. לוחות זמנים מדויקים נקבעים לאחר ביקורת של הפרויקט שלכם.
הגדרת API Gateway מקצה לקצה יכולה לחסוך עד 30% מעלויות הפיתוח באמצעות שימוש בתשתית כקוד. לצוות שלנו של מהנדסי AWS מוסמכים יש ניסיון של 5+ שנים ו-50+ פרויקטים מוצלחים של API Gateway. צרו קשר לייעוץ — נכין הצעה מותאמת אישית ונחשב את החיסכון האמיתי שלכם. קבלו הערכת פרויקט עוד היום.







