ЁЯОЯя╕П рдзрдбрд╛ 25 тАФ API Gateway: APIs рд╕рд╛рдареА front desk
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 25 рдкреИрдХреА рдзрдбрд╛ 25 тАФ рд╢реЗрд╡рдЯрдЪрд╛ рдзрдбрд╛! ЁЯОУ ┬╖ рдорд╛рдЧреАрд▓: lesson-24-waf-shield
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рд╕рдЧрд│реЗ 25 рдзрдбреЗ тАФ рд╕рдВрдкреВрд░реНрдг course. рдирдХрд╛рд╢рд╛рд╡рд░рдЪрд╛ рд╢реЗрд╡рдЯрдЪрд╛ рдбрдмрд╛ рдореНрд╣рдгрдЬреЗ рддреБрдордЪреА apps рд╕рдЧрд│реНрдпрд╛рдд рдЬрд╛рд╕реНрдд рдЬреНрдпрд╛рдЪреНрдпрд╛рд╢реА рдмреЛрд▓рддреАрд▓ рддреЛ. рдЦрд░реА file:
- apigw/api.tf тАФ рдзрдбрд╛ 19 рдЪреНрдпрд╛ hello рдорджрддрдиреАрд╕рд╛рд╕рдореЛрд░ рдПрдХ HTTP API
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
Reception (ALB) browsers рдЪреНрдпрд╛ рдЧрд░реНрджреАрд╕рд╛рдареА рдмрд╛рдВрдзрд▓реЗрд▓реЗ рдЖрд╣реЗ. API Gateway ЁЯОЯя╕П рд╣реЗ рд╡реЗрдЧрд│реЗ front desk рдЖрд╣реЗ, programs рдиреА programs рдирд╛ call рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдмрд╛рдВрдзрд▓реЗрд▓реЗ:
- Routes ЁЯкз тАФ
GET /grades/{id}тЖТ рд╣рд╛ рдорджрддрдиреАрд╕;POST /homeworkтЖТ рддреЛ. рдкреНрд░рддреНрдпреЗрдХ route Lambda рдХрдбреЗ (рдзрдбрд╛ 19 тАФ рдмрд╛рдХрдЪ рдирд╛рд╣реАрдд), VPC link рдорд╛рд░реНрдЧреЗ ALB рдорд╛рдЧрдЪреНрдпрд╛ рдмрд╛рдХрд╛рдВрдХрдбреЗ, рдХрд┐рдВрд╡рд╛ рдХреЛрдгрддреНрдпрд╛рд╣реА HTTP URL рдХрдбреЗ рдирд┐рд░реНрджреЗрд╢ рдХрд░реВ рд╢рдХрддреЛ. - рдУрд│рдЦ рддрдкрд╛рд╕рдгреА ЁЯкк тАФ рдкреБрдвреЗ рдкрд╛рдард╡рдгреНрдпрд╛рдЖрдзреА, desk JWT рддрдкрд╛рд╕реВ рд╢рдХрддреЗ (Cognito рдХрд┐рдВрд╡рд╛ рдХреЛрдгрддреНрдпрд╛рд╣реА OIDC issuer рдХрдбреВрди), IAM signatures рдорд╛рдЧреВ рд╢рдХрддреЗ, рдХрд┐рдВрд╡рд╛ рдирд┐рд░реНрдгрдпрд╛рд╕рд╛рдареА рдПрдХрд╛ рдЫреЛрдЯреНрдпрд╛ Lambda authorizer рд▓рд╛ рд╡рд┐рдЪрд╛рд░реВ рд╢рдХрддреЗ. рддреБрдордЪреНрдпрд╛ рдорджрддрдирд┐рд╕рд╛рдВрдирд╛ unauthenticated request рдХрдзреАрдЪ рджрд┐рд╕рдд рдирд╛рд╣реА.
- рддрд┐рдХрд┐рдЯреЗ тП▒я╕П тАФ throttling (рджрд░ second рд▓рд╛ requests, burst) рдорджрддрдирд┐рд╕рд╛рдВрдирд╛ рдЪреЗрдВрдЧрд░рд╛рдЪреЗрдВрдЧрд░реАрдкрд╛рд╕реВрди рд╡рд╛рдЪрд╡рддреЗ; usage plans + API keys partner A рд▓рд╛ рджрд┐рд╡рд╕рд╛рд▓рд╛ 1,000 calls рдЖрдгрд┐ partner B рд▓рд╛ 10,000 рджреЗрддрд╛рдд тАФ рдореЛрдЬрд▓реЗрд▓реЗ, рдкреНрд░рддреНрдпреЗрдХ key рдиреБрд╕рд╛рд░.
- Stages ЁЯОн тАФ
dev,prod: рддреЗрдЪ routes, рд╡реЗрдЧрд│реА settings рдЖрдгрд┐ рдкрддреНрддреЗ; custom domain (api.school.com, рдзрдбрд╛ 23 рдЪреА phonebook + рдПрдХ certificate рд╡рд╛рдкрд░реВрди) рдХреБрд░реВрдк default URL рд▓рдкрд╡рддреЛ. - ALB рди рдХрд░рдгрд╛рд▒реНрдпрд╛ рдЬрд╛рджрд╛ рдЧреЛрд╖реНрдЯреА: рдПрдХрд╛рдЪ setting рдордзреНрдпреЗ CORS, request/response transformation, caching, рдкреНрд░рддреНрдпреЗрдХ route рдЪреЗ logging рдЖрдгрд┐ metrics, push рд╕рд╛рдареА WebSocket APIs.
рджреЛрди рдкреНрд░рдХрд╛рд░: HTTP API (рдирд╡рд╛, рд╕реНрд╡рд╕реНрдд, рдЬрд▓рдж тАФ Lambda/REST-рд╕рд╛рд░рдЦреНрдпрд╛ рдХрд╛рдорд╛рд╕рд╛рдареА default) рдЖрдгрд┐ REST API (рдЬреБрдирд╛, рдЬрд╛рд╕реНрдд рдмрдЯрдгреЗ: caching, request validation, usage plans). рддреНрдпрд╛рдРрд╡рдЬреА ALB рдХреЗрд╡реНрд╣рд╛ рд╡рд╛рдкрд░рд╛рдпрдЪрд╛: рдмрд╛рдХрд╛рдВрдХрдбреЗ рд╕рддрдд рдЬрд╛рд╕реНрдд traffic (рддрд╛рд╕рд╛рдкреНрд░рдорд╛рдгреЗ рдЦрд░реНрдЪ рдкреНрд░рддрд┐-request рдкреЗрдХреНрд╖рд╛ рд╕реНрд╡рд╕реНрдд рдкрдбрддреЛ), non-HTTP protocols, рдХрд┐рдВрд╡рд╛ рд╡рд░реАрд▓рдкреИрдХреА рдХрд╛рд╣реАрдЪ рд▓рд╛рдЧрдд рдирд╕реЗрд▓ рддреЗрд╡реНрд╣рд╛.
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart LR
c["ЁЯУ▒ client app"]
gw["ЁЯОЯя╕П API Gateway (HTTP API)<br/>ЁЯкк JWT authorizer ┬╖ тП▒я╕П throttle 100 rps<br/>ЁЯОн stage: prod ┬╖ api.school.com"]
lam["тЪб Lambda hello (L19)"]
alb["ЁЯЫОя╕П ALB via VPC link тЖТ desks"]
c -->|"1 GET /grades/3A + token"| gw
gw -->|"2 token ok, under quota"| lam
gw -.->|"other routes"| alb
gw -->|"тЬЧ 401 / 429"| c
тЭУ рдХрд╛рдп
- рдХрд┐рдВрдордд: HTTP API тЙИ рджрд╣рд╛ рд▓рд╛рдЦ requests рд▓рд╛ $1; REST API тЙИ $3.50; рдЕрдзрд┐рдХ рдмрд╛рд╣реЗрд░ рдЬрд╛рдгрд╛рд░рд╛ data. рддрд╛рд╕рд╛рдкреНрд░рдорд╛рдгреЗ рд╢реБрд▓реНрдХ рдирд╛рд╣реА тАФ рд░рд┐рдХрд╛рдореЗ = $0 (Lambda рдзрдбреНрдпрд╛рдЪреЗ рдЕрд░реНрдерд╢рд╛рд╕реНрддреНрд░, front desk рдкрд░реНрдпрдВрдд рд╡рд╛рдврд╡рд▓реЗрд▓реЗ).
- Integrations: Lambda proxy (event рдЖрдд, JSON рдмрд╛рд╣реЗрд░), HTTP proxy, private (VPC link тЖТ ALB/NLB), AWS service (рдереЗрдЯ SQS рдордзреНрдпреЗ рд▓рд┐рд╣рд╛).
- Auth рдкрд░реНрдпрд╛рдп: JWT (HTTP API), IAM SigV4, Lambda authorizer, Cognito user pools (REST), API keys (рдУрд│рдЦ рдкрдЯрд╡рдгреЗ, authentication рдирд╡реНрд╣реЗ).
- рдорд╛рд╣реАрдд рдЕрд╕рд╛рдпрд▓рд╛ рд╣рд╡реНрдпрд╛ рдорд░реНрдпрд╛рджрд╛: 29 s integration timeout (рдореЛрдареА рдХрд╛рдореЗ тЖТ async + polling рдХрд┐рдВрд╡рд╛ WebSockets), 10 MB payload.
- Observability: CloudWatch рдордзреНрдпреЗ access logs (рдзрдбрд╛ 18), рдкреНрд░рддреНрдпреЗрдХ route рдЪреЗ 4xx/5xx/latency metrics, X-Ray tracing.
ЁЯдФ рдХрд╛
рдкреНрд░рддреНрдпреЗрдХ mobile app, partner integration рдЖрдгрд┐ webhook рдореНрд╣рдгрдЬреЗ рдПрдХ API. API Gateway рддреНрдпрд╛рдВрдирд╛ рдХрдВрдЯрд╛рд│рд╡рд╛рдгреЗ, рдмрд░реЛрдмрд░ front desk рджреЗрддреЛ тАФ auth, throttling, metering, staging тАФ рдЬреЗ рдирд╛рд╣реАрддрд░ рддреБрдореНрд╣рд╛рд▓рд╛ рдкреНрд░рддреНрдпреЗрдХ рдорджрддрдиреАрд╕рд╛рдд code рдореНрд╣рдгреВрди рд▓рд┐рд╣рд╛рд╡реЗ рд▓рд╛рдЧрд▓реЗ рдЕрд╕рддреЗ, рддреЗ configuration рдореНрд╣рдгреВрди. Lambda рд╕реЛрдмрдд рддреА рд╕рдВрдкреВрд░реНрдг "serverless backend" рдЪреА рдЧреЛрд╖реНрдЯ рдЖрд╣реЗ; ALB рд╕реЛрдмрдд рддреЗ programs рд╕рд╛рдареА campus рдЪреЗ рдкреНрд░рд╡реЗрд╢рджреНрд╡рд╛рд░ рдЖрд╣реЗ.
ЁЯФз рдХрд╕реЗ
aws apigatewayv2 get-apis --query 'Items[].{name:Name,proto:ProtocolType,endpoint:ApiEndpoint}'
# quick smoke test of a deployed stage:
curl -s "$API_ENDPOINT/hello?name=class%203A" # тЖТ {"greeting": "hello, class 3A"}
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛ (~10 рдорд┐рдирд┐рдЯреЗ, ~рдореЛрдлрдд)
cd apigw && terraform apply # HTTP API тЖТ lesson 19's hello Lambda, stage $default
curl -s "$(terraform output -raw api_url)/hello?name=school"
curl -si "$(terraform output -raw api_url)/nope" # 404 from the desk, Lambda never woke
terraform destroy
тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ
curl API_URL/hello?name=school greeting рдкрд░рдд рджреЗрддреЛ; curl -i API_URL/nope desk рдХрдбреВрди 404 рджреЗрддреЛ рдЖрдгрд┐ Lambda log рдордзреНрдпреЗ рдХреЛрдгрддреЗрд╣реА invocation рджрд┐рд╕рдд рдирд╛рд╣реА.
ЁЯз╣ рд╕рд╛рдлрд╕рдлрд╛рдИ тАФ рдЪрд╛рд▓реВ рдареЗрд╡реВ рдирдХрд╛
terraform destroy тАФ рдкреНрд░рддрд┐-request billing рдореБрд│реЗ рд░рд┐рдХрд╛рдореЗ рдЕрд╕рддрд╛рдирд╛ рдХрд╛рд╣реАрдЪ рдЦрд░реНрдЪ рдирд╛рд╣реА, рдкрдг Lambda рдЖрдгрд┐ role рддрд░реАрд╣реА рдкрд╕рд╛рд░рд╛ рдЖрд╣реЗрдд
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
- API key рд▓рд╛ authentication рд╕рдордЬрдгреЗ тАФ рддреА рдУрд│рдЦ рдкрдЯрд╡рддреЗ, authenticate рдХрд░рдд рдирд╛рд╣реА
- API Gateway рдорд╛рдЧреЗ 29 seconds рдЪреЗ рдХрд╛рдо (30 s timeout) тАФ async рдХрд░рд╛
- рд╕рддрдд рдЬрд╛рд╕реНрдд traffic рдЕрд╕рд▓реЗрд▓реНрдпрд╛ fleet рд╕рдореЛрд░ API Gateway рд╡рд╛рдкрд░рдгреЗ тАФ рддрд┐рдереЗ ALB рд╕реНрд╡рд╕реНрдд рдЖрд╣реЗ
ЁЯОУ рддреБрдореНрд╣реА рдХрд░реВрди рджрд╛рдЦрд╡рд▓реЗ тАФ рдкреБрдиреНрд╣рд╛
рдУрд│рдЦ, рдмрд╛рдХ, campus, lockers, reception, phonebook, рджрдкреНрддрд░ рдХрд╛рд░реНрдпрд╛рд▓рдп, рдкреНрд░рдЧрддрд┐рдкреБрд╕реНрддрдХреЗ, рдорджрддрдиреАрд╕, рдореАрдЯрд░ тАФ рдЖрдгрд┐ рдЖрддрд╛ corridors, рдЯрдкрд╛рд▓рдкреЗрдЯреА, receptionist рдЪреЗ рдореВрдб, bouncer, рдЖрдгрд┐ API front desk. рдЖрддрд╛ рддреБрдореНрд╣реА рдмрд╛рд╣реЗрд░ рджрд┐рд╕рдгрд╛рд░реА рдХреЛрдгрддреАрд╣реА AWS architecture рдЖрдХреГрддреА рд╡рд╛рдЪреВ рд╢рдХрддрд╛ рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХ рдбрдмрд╛, рдЖрдгрд┐ рддреНрдпрд╛рдЪрд╛ рдЦрд░реНрдЪ, рдУрд│рдЦреВ рд╢рдХрддрд╛. рд╢реЗрдЬрд╛рд░реА: Docker рдбрдмреЗ рднрд░рддреЛ, Kubernetes рддреНрдпрд╛рдВрдирд╛ рдпрд╛ campus рд╡рд░ рдЪрд╛рд▓рд╡рддреЛ, ArgoCD рддреНрдпрд╛рдВрдирд╛ git рдордзреВрди deploy рдХрд░рддреЛ. ЁЯПл