ЁЯз░ рдзрдбрд╛ 02 тАФ REST рд╡рд┐рд░реБрджреНрдз HTTP рд╡рд┐рд░реБрджреНрдз WebSocket APIs: front office рдЪреЗ рддреАрди рдкреНрд░рдХрд╛рд░
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 02 ┬╖ рдорд╛рдЧреЗ: lesson-01-why-gateway ┬╖ рдкреБрдвреЗ: lesson-03-routes-integrations
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рдзрдбрд╛ 01, рдЖрдгрд┐ AWS рд╡рд░ рддреБрдореНрд╣реА рд╕рд░реНрд╡рд╛рдд рдЖрдзреА рдХрд░рддрд╛ рддреА рдирд┐рд╡рдб: REST API (рдкреВрд░реНрдг рд╕рд╛рд╣рд┐рддреНрдп),
HTTP API (рд╣рд▓рдХреЗ рдЖрдгрд┐ рд╕реНрд╡рд╕реНрдд) рдХрд┐рдВрд╡рд╛ WebSocket API (рдЙрдШрдбреА рд░рд╛рд╣рдгрд╛рд░реА line).
apigw/demo.py рдордзрд▓реЗ kinds() рд╣реЗ рддрд┐рдиреНрд╣реА print рдХрд░рддреЗ, рдЖрдгрд┐ lab рдЪреЗ office
рдХреЛрдгрддреЗ рдлрдХреНрдд-REST рднрд╛рдЧ рд╡рд╛рдкрд░рддреЗ рддреНрдпрд╛рдВрдЪреА рддреБрдореНрд╣реА рдпрд╛рджреА рдХрд░рддрд╛.
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
рд╢рд╛рд│рд╛ рддрд┐рдЪреЗ front office рддреАрди рдкреНрд░рдХрд╛рд░реЗ рдмрд╛рдВрдзреВ рд╢рдХрддреЗ:
- рдкреВрд░реНрдг office ЁЯПв (REST API). рдореЛрдард╛ desk, рдЕрдиреЗрдХ рдЦрдг: рд░реЛрдЬрдЪреНрдпрд╛ рдорд░реНрдпрд╛рджреЗрд╕рд╣ visitor passes (API keys рдЖрдгрд┐ usage plans), рд╕реВрдЪрдирд╛ рдлрд▓рдХ (cache), form рддрдкрд╛рд╕рдгрд╛рд░рд╛ (request validation), рдкрддреНрд░реЗ рдирд╡реНрдпрд╛рдиреЗ рд▓рд┐рд╣рд┐рдгрд╛рд░рд╛ clerk (mapping templates), рдлрд╛рдЯрдХрд╛рд╡рд░рдЪрд╛ рдкрд╣рд╛рд░реЗрдХрд░реА (AWS WAF), рдЖрдгрд┐ рдлрдХреНрдд рдЖрддрд▓реНрдпрд╛ visitors рд╕рд╛рдареА рдПрдХ рдЦрд╛рдЬрдЧреА рджрд╛рд░.
- рдЬрд▓рдж counter ЁЯкЯ (HTTP API). рд▓рд╣рд╛рди рдЖрдгрд┐ рд╕реНрд╡рд╕реНрдд. рддреЗ badges рддрдкрд╛рд╕рддреЗ (JWT), рдПрдХрд╛ setting рдиреЗ browsers рдирд╛ рдЖрдд рдпреЗрдК рджреЗрддреЗ (CORS) рдЖрдгрд┐ рдкрдЯрдХрди рдкреБрдвреЗ рдкрд╛рдард╡рддреЗ. рд╕реВрдЪрдирд╛ рдлрд▓рдХ рдирд╛рд╣реА, visitor passes рдирд╛рд╣реАрдд.
- Phone line тШОя╕П (WebSocket API). Visitor рдПрдХрджрд╛ call рдХрд░рддреЛ рдЖрдгрд┐ line рдЙрдШрдбреАрдЪ рд░рд╛рд╣рддреЗ. рджреЛрдиреНрд╣реА рдмрд╛рдЬреВ рдХрдзреАрд╣реА рдмреЛрд▓реВ рд╢рдХрддрд╛рдд тАФ marks рддрдпрд╛рд░ рдЭрд╛рд▓реЗ рдХреА рд╢рд╛рд│рд╛ рдкрд░рдд call рдХрд░реВ рд╢рдХрддреЗ.
рддреБрдореНрд╣рд╛рд▓рд╛ рд▓рд╛рдЧрдгрд╛рд░реЗ рд╕рдЧрд│реЗ рдЦрдг рдЬреНрдпрд╛рдд рдЖрд╣реЗрдд рдЕрд╕реЗ рд╕рд░реНрд╡рд╛рдд рд▓рд╣рд╛рди office рдирд┐рд╡рдбрд╛.
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart TB
q["тЭУ what do you need?"]
rest["ЁЯПв REST API<br/>keys + usage plans ┬╖ cache ┬╖ validation<br/>VTL mapping ┬╖ WAF ┬╖ private endpoint<br/>~$3.50 per million"]
http["ЁЯкЯ HTTP API<br/>JWT authorizer ┬╖ simple CORS<br/>auto-deploy ┬╖ Lambda + HTTP proxy<br/>~$1.00 per million"]
ws["тШОя╕П WebSocket API<br/>$connect ┬╖ $disconnect ┬╖ $default<br/>route by a field in the message"]
q -->|"partners, quotas, caching, WAF"| rest
q -->|"JWT + Lambda, lower price"| http
q -->|"server must push: chat, live marks"| ws
ЁЯЧ║я╕П рдХрд╛рдврд▓реЗрд▓реА рдЖрд╡реГрддреНрддреА + рдПрдХ lab: https://school-edh.pages.dev/apigateway/lesson-diagrams.html#l02
тЭУ рдХрд╛рдп
- REST API (API Gateway "v1") тАФ рдкреВрд░реНрдг рд╕рд╛рд╣рд┐рддреНрдп: API keys рдЖрдгрд┐ usage plans, caching, request validation, mapping templates (VTL рдордзреНрдпреЗ, рдореНрд╣рдгрдЬреЗ Velocity Template Language рдордзреНрдпреЗ рд▓рд┐рд╣рд┐рд▓реЗрд▓реЗ), AWS WAF, resource policies, рдЖрдгрд┐ рддреАрди endpoint types: edge-optimized, regional рдЖрдгрд┐ private. Authorizers: IAM, Cognito user pools рдЖрдгрд┐ Lambda.
- HTTP API (API Gateway "v2", 2019) тАФ рд╣рд▓рдХреЗ: рдЖрдзреАрдЪ рдЕрд╕рд▓реЗрд▓реЗ JWT authorizers, Lambda authorizers рдЖрдгрд┐ IAM; automatic deployments; рдПрдХрд╛ setting рдордзреНрдпреЗ CORS; Lambda рдЖрдгрд┐ HTTP proxy integrations, рдЖрдгрд┐ VPC link рдордзреВрди private integrations. Cache рдирд╛рд╣реА, usage plans рдирд╛рд╣реАрдд, request validation рдирд╛рд╣реА, WAF рдирд╛рд╣реА. us-east-1 рдордзреНрдпреЗ рдкрд╣рд┐рд▓реНрдпрд╛ tier рд╕рд╛рдареА рдЕрдВрджрд╛рдЬреЗ рдХрд┐рдВрдордд: ~$1.00 рдкреНрд░рддрд┐ million requests, рддрд░ REST рд╕рд╛рдареА ~$3.50 рдкреНрд░рддрд┐ million.
- WebSocket API тАФ рджреАрд░реНрдШрдХрд╛рд│ рдЯрд┐рдХрдгрд╛рд░реЗ, рджреЛрдиреНрд╣реА рджрд┐рд╢рд╛рдВрдЪреЗ connection. рдЦрд╛рд╕ routes:
$connect,$disconnectрдЖрдгрд┐$default.$request.body.actionрд╕рд╛рд░рдЦреЗ route selection expression рдкреНрд░рддреНрдпреЗрдХ message рдордзрд▓реНрдпрд╛ рдПрдХрд╛ field рд╡рд░реВрди route рдирд┐рд╡рдбрддреЗ. рддреБрдордЪрд╛ back end@connectionsAPI рдордзреВрди messages рдкрд░рдд рдкрд╛рдард╡рддреЛ. - Lab REST API рдЪреЗ model рдмрдирд╡рддреЗ тАФ рдХрд╛рд░рдг REST API рдордзреНрдпреЗ рд╢рд┐рдХрдгреНрдпрд╛рд╕рд╛рд░рдЦреЗ рд╕рд░реНрд╡рд╛рдд рдЬрд╛рд╕реНрдд рднрд╛рдЧ рдЖрд╣реЗрдд.
ЁЯдФ рдХрд╛
рдХрд╛рд░рдг рд╣реА рдирд┐рд╡рдб рддреБрдордЪреА рдХрд┐рдВрдордд рдард░рд╡рддреЗ, рдЖрдгрд┐ рдХреЛрдгрддреА features рддреБрдореНрд╣реА рдХрдзреАрд╣реА рдЪрд╛рд▓реВ рдХрд░реВ рд╢рдХрд╛рд▓ рддреЗрд╣реА. Teams рдЕрдиреЗрдХрджрд╛ "рд╕реБрд░рдХреНрд╖рд┐рдд рд░рд╛рд╣рд╛рд╡реЗ" рдореНрд╣рдгреВрди REST рдирд┐рд╡рдбрддрд╛рдд рдЖрдгрд┐ рдХрдзреАрдЪ рди рд╡рд╛рдкрд░рд▓реЗрд▓реНрдпрд╛ features рд╕рд╛рдареА рдЬрд╡рд│рдкрд╛рд╕ рд╕рд╛рдбреЗрддреАрди рдкрдЯ рдЬрд╛рд╕реНрдд рдкреИрд╕реЗ рджреЗрддрд╛рдд. рдЗрддрд░ HTTP рдирд┐рд╡рдбрддрд╛рдд рдЖрдгрд┐ рдирдВрддрд░ рддреНрдпрд╛рдВрдирд╛ рдХрд│рддреЗ рдХреА partners рд╕рд╛рдареА usage plans рдХрд┐рдВрд╡рд╛ рд╕рдореЛрд░ WAF рд╣рд╡рд╛ рдЖрд╣реЗ тАФ рдЖрдгрд┐ рдордЧ migrate рдХрд░рд╛рд╡реЗ рд▓рд╛рдЧрддреЗ. рдирд╛рд╡рд╛рд╡рд░реВрди рдирд╛рд╣реА, рддрд░ features рдЪреНрдпрд╛ рдпрд╛рджреАрд╡рд░реВрди рдирд┐рд░реНрдгрдп рдШреНрдпрд╛.
ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)
kinds() рддрд┐рдиреНрд╣реА рдкреНрд░рдХрд╛рд░ print рдХрд░рддреЗ. office() REST-рдкрджреНрдзрддреАрдЪрд╛ API рдмрдирд╡рддреЗ, рдЖрдгрд┐
apigw/gateway.py рдордзрд▓рд╛ рдкреНрд░рддреНрдпреЗрдХ Route REST features flags рдореНрд╣рдгреВрди
рдмрд╛рд│рдЧрддреЛ: auth, cache, api_key, schema (request validation) рдЖрдгрд┐ mapping (response
mapping). Routes рдЪреА рдпрд╛рджреА рдХреЗрд▓реА рдХреА lab рдкреВрд░реНрдг office рдЪреЗ рдХреЛрдгрддреЗ рдЦрдг рд╡рд╛рдкрд░рддреЗ рддреЗ рджрд┐рд╕рддреЗ.
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛
python3 apigw/demo.py kinds
python3 - <<'EOF'
import sys; sys.path.insert(0, "apigw"); from demo import office
gw, _ = office()
for r in gw.routes:
print(f"{r.method:<5} {r.path:<24} auth={r.auth} cache={r.cache} api_key={r.api_key} schema={'yes' if r.schema else 'no'} mapping={'yes' if r.mapping else 'no'}")
print("stages:", list(gw.stages), "┬╖ usage plans:", list(gw.plans))
EOF
тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ
kinds рддреАрди рдУрд│реА print рдХрд░рддреЗ:
REST API the full kit: API keys + usage plans, caching, request validation, mapping templates, WAF, private,
HTTP API lean and cheaper: JWT authorizers built in, CORS in one setting, Lambda + HTTP proxy,
WebSocket API a phone line that stays open: $connect, $disconnect, routes by a field in the message,
рдордЧ this lab models a REST API because it shows the most parts.
рддреБрдордЪрд╛ snippet рдЖрда routes print рдХрд░рддреЛ. рддреНрдпрд╛рдкреИрдХреА рддреАрди рдлрдХреНрдд-REST рдЦрдг рд╡рд╛рдкрд░рддрд╛рдд:
GET /students/{id} auth=None cache=True api_key=False schema=no mapping=yes (cache рдЖрдгрд┐ mapping),
POST /marks auth=jwt cache=False api_key=False schema=yes mapping=no (validation) рдЖрдгрд┐
GET /partner/students/{id} auth=None cache=False api_key=True schema=no mapping=no (API key).
рдордЧ stages: ['dev', 'prod'] ┬╖ usage plans: ['partner-basic']. HTTP API рдордзреНрдпреЗ cache,
validator, mapping рдХрд┐рдВрд╡рд╛ usage plan рдмрд╕реВ рд╢рдХрд▓реЗ рдирд╕рддреЗ.
ЁЯПБ рддреБрдореНрд╣реА рдЖрддреНрддрд╛рдЪ рдХрд╛рдп рд╕рд┐рджреНрдз рдХреЗрд▓реЗ
API рдЪреНрдпрд╛ рдЧрд░рдЬрд╛ рд╡рд╛рдЪреВрди рддреБрдореНрд╣реА рддреНрдпрд╛рдЪрд╛ рдкреНрд░рдХрд╛рд░ рд╕рд╛рдВрдЧреВ рд╢рдХрддрд╛: рд╣рд╛ рд╢рд╛рд│реЗрдЪрд╛ API cache, validator, mapping рдЖрдгрд┐ usage plan рд╡рд╛рдкрд░рддреЛ, рдореНрд╣рдгреВрди рддреНрдпрд╛рд▓рд╛ REST API рд▓рд╛рдЧрддреЛ. рддреНрдпрд╛ рдЪрд╛рд░ рдЧреЛрд╖реНрдЯреА рдирд╕рддреНрдпрд╛, рддрд░ HTTP API рдиреЗ рддреЗрдЪ рдХрд╛рдо рдХрдореА рдЦрд░реНрдЪрд╛рдд рдХреЗрд▓реЗ рдЕрд╕рддреЗ.
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
- рд╕рд╛рдзреНрдпрд╛ "JWT + Lambda" API рд╕рд╛рдареА рд╕рд╡рдпреАрдиреЗ REST рдирд┐рд╡рдбрдгреЗ тАФ HTTP рд╕реНрд╡рд╕реНрдд рдЖрдгрд┐ рд╕реЛрдкреЗ рдЖрд╣реЗ
- HTTP рдирд┐рд╡рдбрдгреЗ рдЖрдгрд┐ рдирдВрддрд░ usage plans, caching рдХрд┐рдВрд╡рд╛ WAF рд▓рд╛рдЧрдгреЗ тАФ рдЖрдзреА features рдЪреА рдпрд╛рджреА рдард░рд╡рд╛
- рдПрдХрд╛рдЪ рдЙрддреНрддрд░рд╛рдЪреНрдпрд╛ request рд╕рд╛рдареА WebSocket рд╡рд╛рдкрд░рдгреЗ тАФ рд╕рд╛рдзреА request рдЬрд╛рд╕реНрдд рд╕реЛрдкреА рдЖрд╣реЗ
- WebSocket (рдХрд┐рдВрд╡рд╛ push service) рдкрд░рдд call рдХрд░реВ рд╢рдХрдд рдЕрд╕рддрд╛рдирд╛ рдмрд╛рддрдореАрд╕рд╛рдареА рджрд░ рд╕реЗрдХрдВрджрд╛рд▓рд╛ polling рдХрд░рдгреЗ
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд
On a real account тАФ рддреЛрдЪ students route HTTP API (AWS SAM) рдореНрд╣рдгреВрди рдЖрдгрд┐ REST API (AWS SAM) рдореНрд╣рдгреВрди, рд╢реЗрдЬрд╛рд░реА рд╢реЗрдЬрд╛рд░реА:
# template.yaml тАФ AWS SAM
Resources:
StudentsFn:
Type: AWS::Serverless::Function
Properties:
Runtime: python3.12
Handler: app.handler
CodeUri: src/
Events:
LeanCounter: # HTTP API
Type: HttpApi
Properties: { Path: /students/{id}, Method: GET }
FullOffice: # REST API
Type: Api
Properties: { Path: /students/{id}, Method: GET }
WebSocket API рддреНрдпрд╛рдЪрд╛ route message body рд╡рд░реВрди рдирд┐рд╡рдбрддреЛ:
aws apigatewayv2 create-api --name school-live --protocol-type WEBSOCKET \
--route-selection-expression '$request.body.action'
ЁЯПн Production рдордзреНрдпреЗ рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ: рдкреНрд░рдХрд╛рд░ рдирдВрддрд░ рдмрджрд▓рдгреЗ рдЕрд╡рдШрдб рдЕрд╕рддреЗ тАФ clients, domains рдЖрдгрд┐ authorizers рддреНрдпрд╛рдЪреНрдпрд╛рднреЛрд╡рддреА рдмрд╛рдВрдзрд▓реЗрд▓реЗ рдЕрд╕рддрд╛рдд. API рдмрдирд╡рдгреНрдпрд╛рдЖрдзреА рддреБрдореНрд╣рд╛рд▓рд╛ рд▓рд╛рдЧрдгрд╛рд░реА features рд▓рд┐рд╣реВрди рдареЗрд╡рд╛ (keys? cache? WAF? private?).
тПня╕П рдкреБрдвреЗ
Office рдирд┐рд╡рдбрд▓реЗ. рдЖрддрд╛: рдХреЛрдгрддрд╛ desk рдХреЛрдгрддреНрдпрд╛ visitor рд▓рд╛ рдШреЗрддреЛ? Routes рдЖрдгрд┐ integrations.
git checkout lesson-03-routes-integrations