ЁЯЫОя╕П рдзрдбрд╛ 01 тАФ API gateway рдХрд╛: рд╢рд╛рд│реЗрдЪреЗ front office
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 01 ┬╖ рдкреБрдвреЗ: lesson-02-rest-http-websocket
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рд╕рдВрдкреВрд░реНрдг рдХреЛрд░реНрд╕рдорд╛рдЧрдЪреА рдПрдХрдЪ рдХрд▓реНрдкрдирд╛: рдкреНрд░рддреНрдпреЗрдХ kitchen рд╕рдореЛрд░ рдПрдХрдЪ front office рдареЗрд╡рд╛. рддреЗ рдкреНрд░рддреНрдпреЗрдХ visitor рд▓рд╛ рддрдкрд╛рд╕рддреЗ, рдореЛрдЬрддреЗ, рд▓рдХреНрд╖рд╛рдд рдареЗрд╡рддреЗ рдЖрдгрд┐ рдкреБрдвреЗ рдкрд╛рдард╡рддреЗ, рддреНрдпрд╛рдореБрд│реЗ рдкреНрд░рддреНрдпреЗрдХ kitchen рд▓рд╛ рдлрдХреНрдд рд╕реНрд╡рдпрдВрдкрд╛рдХ рдХрд░рд╛рдпрдЪрд╛ рдЕрд╕рддреЛ. AWS рдордзреНрдпреЗ рддреЗ office рдореНрд╣рдгрдЬреЗ Amazon API Gateway. рдкреВрд░реНрдг рдХреЛрд░реНрд╕рднрд░ рддреБрдореНрд╣реА рд╡рд╛рдкрд░рд╛рд▓ рддреНрдпрд╛ рдЦрд▒реНрдпрд╛ files:
- apigw/gateway.py тАФ front office: рд╢реБрджреНрдз Python рдордзрд▓реЗ API Gateway REST API рдЪреЗ рд╢рд┐рдХрд╡рдгреНрдпрд╛рд╕рд╛рдареАрдЪреЗ model (routes,
{proxy+}, JWT рдЖрдгрд┐ Lambda authorizers, API keys рдЖрдгрд┐ usage plans, token bucket, stage cache, CORS, access logs, 29 s timeout рдЖрдгрд┐ 10 MB рдорд░реНрдпрд╛рджрд╛) - apigw/demo.py тАФ рдкреНрд░рддреНрдпреЗрдХ рдзрдбрд╛ рдПрдХ рдЫреЛрдЯрд╛ program рдореНрд╣рдгреВрди (
python3 apigw/demo.py <section>), рдЖрдгрд┐ officelocalhost:8080рд╡рд░ рдЙрдШрдбрдгреНрдпрд╛рд╕рд╛рдареАserve - apigw/test_apigw.py тАФ office рдЪреНрдпрд╛ рдирд┐рдпрдорд╛рдВрд╡рд░ 12 checks
- demo-output.txt тАФ рдирд┐рд░реЛрдЧреА run рдХрд╛рдп print рдХрд░рддреЛ рддреЗ
ЁЯОТ рд╕реБрд░реВ рдХрд░рдгреНрдпрд╛рдЖрдзреА: рддреБрдореНрд╣рд╛рд▓рд╛ рдлрдХреНрдд Python 3 рд▓рд╛рдЧрддреЗ, рджреБрд╕рд░реЗ рдХрд╛рд╣реАрд╣реА рдирд╛рд╣реА тАФ AWS account рдирд╛рд╣реА,
pip installрдирд╛рд╣реА.gateway.pyрд╣реЗ рд╢рд┐рдХрд╡рдгреНрдпрд╛рд╕рд╛рдареАрдЪреЗ model рдЖрд╣реЗ: AWS docs рд╕рд╛рдВрдЧрддрд╛рдд рддреЛ рдХреНрд░рдо рдЖрдгрд┐ defaults рддреЗ рдкрд╛рд│рддреЗ, рдкрдг рдЦрд▒реНрдпрд╛ API Gateway рдордзреНрдпреЗ рдЦреВрдк рдЬрд╛рд╕реНрдд settings рдЖрд╣реЗрдд. рддреНрдпрд╛рдЪреА JWT check HS256 рд╡рд╛рдкрд░рддреЗ рдореНрд╣рдгреВрди рддреНрдпрд╛рд▓рд╛ crypto library рд▓рд╛рдЧрдд рдирд╛рд╣реА; рдЦрд░реЗ JWT authorizers RS256 signatures issuer рдЪреНрдпрд╛ public keys рд╡рд┐рд░реБрджреНрдз рддрдкрд╛рд╕рддрд╛рдд. on a real account рдЕрд╢реА рдЦреВрдг рдЕрд╕рд▓реЗрд▓реНрдпрд╛ commands рдирд╛ AWS CLI рдЖрдгрд┐ credentials рд▓рд╛рдЧрддрд╛рдд; рдмрд╛рдХреА рд╕рдЧрд│реЗ рдЗрдереЗрдЪ рдЪрд╛рд▓рддреЗ.
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
рдПрдХрд╛ рдореЛрдареНрдпрд╛ рд╢рд╛рд│реЗрдд рдЕрдиреЗрдХ kitchens ЁЯН│ рдЕрд╕рддрд╛рдд тАФ рдПрдХ рд╡рд┐рджреНрдпрд╛рд░реНрдереНрдпрд╛рдВрдЪреНрдпрд╛ рдиреЛрдВрджреА рдмрдирд╡рддреЗ, рдПрдХ marks рдмрдирд╡рддреЗ, рдПрдХ рд╡реЗрд│рд╛рдкрддреНрд░рдХреЗ рдмрдирд╡рддреЗ. рджрд┐рд╡рд╕рднрд░ visitors рдпреЗрдд рдЕрд╕рддрд╛рдд: рдкрд╛рд▓рдХ, рд╢рд┐рдХреНрд╖рд┐рдХрд╛, apps, рдЗрддрд░ рд╢рд╛рд│рд╛.
Front office рдирд╕реЗрд▓ рддрд░ рдкреНрд░рддреНрдпреЗрдХ kitchen рд▓рд╛ рд╕рдЧрд│реЗ рдХрд╛рд╣реА рд╕реНрд╡рддрдГрдЪ рдХрд░рд╛рд╡реЗ рд▓рд╛рдЧрддреЗ: visitor рдХреЛрдг рдЖрд╣реЗ рддреЗ рддрдкрд╛рд╕рдгреЗ, рдХрд┐рддреА рдЖрд▓реЗ рддреЗ рдореЛрдЬрдгреЗ, рдЧрд░реНрджреА рдерд╛рдВрдмрд╡рдгреЗ, visitor book рд▓рд┐рд╣рд┐рдгреЗ, рдЖрдгрд┐ рд╕реНрд╡рдпрдВрдкрд╛рдХрд╣реА. рдкреНрд░рддреНрдпреЗрдХ kitchen рд╣реЗ рдереЛрдбреЗ рд╡реЗрдЧрд│реЗ рдХрд░рддреЗ, рдЖрдгрд┐ рддреНрдпрд╛рддрд▓реЗ рдПрдХ рдиреЗрд╣рдореА рдХрд╛рд╣реАрддрд░реА рд╡рд┐рд╕рд░рддреЗ.
рдореНрд╣рдгреВрди рд╢рд╛рд│рд╛ рдлрд╛рдЯрдХрд╛рд╡рд░ рдПрдХрдЪ front office ЁЯЫОя╕П рдмрд╛рдВрдзрддреЗ. рддрд┐рдереЗ рдПрдХ clerk рдмрд╕рддреЛ. рдкреНрд░рддреНрдпреЗрдХ visitor рдЖрдзреА рддреНрдпрд╛ desk рд╡рд░ рдерд╛рдВрдмрддреЛ. Clerk:
- badge рддрдкрд╛рд╕рддреЛ (рддреБрдореНрд╣реА рдХреЛрдг?),
- visitors рдореЛрдЬрддреЛ рдЖрдгрд┐ рджрд╛рд░рд╛рд╡рд░рдЪ рдЧрд░реНрджреА рдерд╛рдВрдмрд╡рддреЛ,
- рдиреЗрд╣рдореАрдЪреА рдЙрддреНрддрд░реЗ рд╕реВрдЪрдирд╛ рдлрд▓рдХрд╛рд╡рд░ рд▓рдХреНрд╖рд╛рдд рдареЗрд╡рддреЛ,
- рдкреНрд░рддреНрдпреЗрдХ рднреЗрдЯ visitor book рдордзреНрдпреЗ рд▓рд┐рд╣рд┐рддреЛ,
- рдЖрдгрд┐ visitor рд▓рд╛ рдпреЛрдЧреНрдп kitchen рдХрдбреЗ рдкреБрдвреЗ рдкрд╛рдард╡рддреЛ тАФ рдХрд┐рдВрд╡рд╛ "рдЕрд╕реЗ kitchen рдирд╛рд╣реА" рдЕрд╕реЗ рд╕рд╛рдВрдЧрддреЛ.
Kitchens рд▓рд╣рд╛рди рдЖрдгрд┐ рд╕реЛрдкреА рд░рд╛рд╣рддрд╛рдд. рддреЗ front office рдореНрд╣рдгрдЬреЗрдЪ API gateway.
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart LR
v["ЁЯСк visitors<br/>apps ┬╖ browsers ┬╖ partners"]
office["ЁЯЫОя╕П front office тАФ API Gateway<br/>badge check ┬╖ count ┬╖ notice board ┬╖ visitor book"]
k1["ЁЯН│ kitchen: students<br/>GET /students/{id}"]
k2["ЁЯН│ kitchen: marks<br/>POST /marks"]
no["ЁЯЪл 404 Not Found<br/>no such kitchen"]
log["ЁЯУТ visitor book<br/>metrics + access log"]
v -->|"1 every request"| office
office -->|"2 forward"| k1
office -->|"2 forward"| k2
office -.->|"no route"| no
office -.->|"3 write it down"| log
ЁЯЧ║я╕П рдХрд╛рдврд▓реЗрд▓реА рдЖрд╡реГрддреНрддреА + рдПрдХ lab: https://school-edh.pages.dev/apigateway/lesson-diagrams.html#l01
тЭУ рдХрд╛рдп
- API gateway тАФ рддреБрдордЪреНрдпрд╛ back ends рд╕рдореЛрд░ рдмрд╕рдгрд╛рд░реА managed service, рдЬреА рдкреНрд░рддреНрдпреЗрдХ API рд▓рд╛ рд▓рд╛рдЧрдгрд╛рд░реЗ рдХрд╛рдо рд╣рд╛рддрд╛рд│рддреЗ: routing, authentication, throttling, caching, request validation, CORS, TLS, logging рдЖрдгрд┐ metrics.
- Amazon API Gateway тАФ AWS рдЪреЗ gateway. рддреБрдореНрд╣реА routes (method + path) рд╡рд░реНрдгрди рдХрд░рддрд╛, рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХрд╛рд╕рд╛рдареА рдПрдХ integration (kitchen: Lambda function, HTTP back end, рджреБрд╕рд░реА AWS service, рдХрд┐рдВрд╡рд╛ mock).
- Back end / integration тАФ рдЙрддреНрддрд░ рддрдпрд╛рд░ рдХрд░рдгрд╛рд░рд╛ code. рдпрд╛ рдХреЛрд░реНрд╕рдордзреНрдпреЗ рддреЛ рдореНрд╣рдгрдЬреЗ "kitchen".
- Managed тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХреЛрдгрддреЗрд╣реА servers рдЪрд╛рд▓рд╡рд╛рдпрдЪреЗ рдирд╕рддрд╛рдд. рддреБрдореНрд╣реА рдкреНрд░рддреНрдпреЗрдХ request рдЪреЗ рдкреИрд╕реЗ рджреЗрддрд╛ (рдЖрдгрд┐ cache рд╕рд╛рд░рдЦреНрдпрд╛ рдЬрд╛рджрд╛ рдЧреЛрд╖реНрдЯреАрдВрдЪреЗ), рдЖрдгрд┐ AWS рддреБрдордЪреНрдпрд╛рд╕рд╛рдареА office scale рдХрд░рддреЗ.
- рдПрдХ рдкреБрдврдЪреЗ рджрд╛рд░, рдЕрдиреЗрдХ back ends тАФ caller рд▓рд╛ рдПрдХрдЪ рдкрддреНрддрд╛ рджрд┐рд╕рддреЛ, рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде
https://api.school.example, рдорд╛рдЧреЗ рдкрд╛рдЪ teams рдкрд╛рдЪ services рдЪрд╛рд▓рд╡рдд рдЕрд╕рд▓реНрдпрд╛ рддрд░реАрд╣реА.
ЁЯдФ рдХрд╛
рдХрд╛рд░рдг auth, limits, logging рдЖрдгрд┐ TLS рд╣реЗ рдкреНрд░рддреНрдпреЗрдХ service рд╕рд╛рдареА рддреЗрдЪ рдХрд╛рдо рдЖрд╣реЗ, рдЖрдгрд┐ рддреНрдпрд╛рдд рдЪреВрдХ рд╣реЛрдгреЗ рд╕реЛрдкреЗ рдЖрд╣реЗ. рдкреНрд░рддреНрдпреЗрдХ service рддреЗ рдПрдХрдЯреАрдЪ рдмрдирд╡рддреЗ рддреЗрд╡реНрд╣рд╛ рдПрдХ token expiry рд╡рд┐рд╕рд░рддреЗ, рджреБрд╕рд░реАрд▓рд╛ rate limit рдирд╕рддреЗ, рддрд┐рд╕рд░реА рдХрд╛рд╣реАрдЪ log рдХрд░рдд рдирд╛рд╣реА. Gateway рд╣реЗ рдХрд╛рдо рдПрдХрджрд╛рдЪ, рдПрдХрд╛рдЪ рдЬрд╛рдЧреА, рд╕рдЧрд│реНрдпрд╛рдВрд╕рд╛рдареА рдПрдХрд╛рдЪ рдкрджреНрдзрддреАрдиреЗ рдХрд░рддреЗ. рдордЧ kitchens рдордзреНрдпреЗ рдлрдХреНрдд business logic рд░рд╛рд╣рддреЗ тАФ рдЖрдгрд┐ рддреНрдпрд╛рдВрдирд╛ рд╣рд╛рдд рди рд▓рд╛рд╡рддрд╛ рддреБрдореНрд╣реА рджрд╛рд░рд╛рд╡рд░рдЪреЗ рдирд┐рдпрдо рдмрджрд▓реВ рд╢рдХрддрд╛.
ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)
apigw/demo.py рдордзрд▓реЗ office() рд╢рд╛рд│реЗрдЪреЗ gateway (school-api) рджреЛрди
stages (dev, prod) рдЖрдгрд┐ рдЖрда routes рд╕рд╣ рдмрдирд╡рддреЗ. apigw/gateway.py
рдордзрд▓реЗ Gateway.handle() рдкреНрд░рддреНрдпреЗрдХ request рд▓рд╛ рдПрдХрд╛рдЪ рд░рд╛рдВрдЧреЗрддреВрди рдиреЗрддреЗ:
CORS preflight тЖТ route match тЖТ API key тЖТ authorizer тЖТ throttle тЖТ validation тЖТ cache тЖТ
integration тЖТ response mapping тЖТ access log. why() рдПрдХ рдпреЛрдЧреНрдп request рдЖрдгрд┐ рдЕрд╕реНрддрд┐рддреНрд╡рд╛рдд
рдирд╕рд▓реЗрд▓реНрдпрд╛ kitchen рд╕рд╛рдареА рдПрдХ request рдкрд╛рдард╡рддреЗ. serve() рддреЗрдЪ office рдлрдХреНрдд standard library
рд╡рд╛рдкрд░реВрди http://localhost:8080 рд╡рд░ рдЙрдШрдбрддреЗ.
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛
python3 apigw/demo.py why
python3 - <<'EOF'
import sys; sys.path.insert(0, "apigw"); from demo import office
gw, clock = office()
for p in ("/students/7", "/students/9", "/teachers"):
st, headers, out = gw.handle("GET", p)
print(st, p, out)
print(gw.metrics)
print(gw.logs[-1])
EOF
python3 apigw/test_apigw.py
рдЖрддрд╛ office рдЦрд░реЛрдЦрд░ рдЙрдШрдбрд╛ рдЖрдгрд┐ curl рдиреЗ рджрд╛рд░рд╛рд╡рд░ рдЯрдХрдЯрдХ рдХрд░рд╛:
python3 apigw/demo.py serve & # the office opens on localhost:8080
sleep 1 # give the office a second to open
curl -i localhost:8080/students/7
curl -i localhost:8080/students/7 # the same question again
curl -i localhost:8080/teachers
kill %1 # close the office
тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ
why рд╣реЗ GET /students/7 тЖТ 200 {'id': '7', 'name': 'Aishwarya', 'class': '8B'} X-Cache: Miss
рдЖрдгрд┐ GET /teachers тЖТ 404 {'message': 'Not Found'} print рдХрд░рддреЗ. рддреБрдордЪрд╛ snippet
/students/7 рдЖрдгрд┐ /students/9 рд╕рд╛рдареА 200, 404 /teachers {'message': 'Not Found'}, рдордЧ
counters {'Count': 3, '4XXError': 1, '5XXError': 0, 'CacheHitCount': 0, 'CacheMissCount': 2}
рдЖрдгрд┐ visitor book рдЪреА рд╢реЗрд╡рдЯрдЪреА рдУрд│ print рдХрд░рддреЛ:
{'requestId': 'req-0003', 'stage': 'prod', 'httpMethod': 'GET', 'path': '/teachers', 'status': 404, 'principal': None, 'latencyMs': 4, 'integrationLatencyMs': 0}.
Tests 12/12 passed рдиреЗ рд╕рдВрдкрддрд╛рдд.
рдЪрд╛рд▓реВ office рд╕рд╣: server front office open on http://localhost:8080 (stage prod) тАФ Ctrl+C to close print рдХрд░рддреЛ.
рдкрд╣рд┐рд▓рд╛ curl HTTP/1.0 200 OK, X-Cache: Miss рдЖрдгрд┐
{"id": "7", "name": "Aishwarya", "class": "8B"} рджрд╛рдЦрд╡рддреЛ; рджреБрд╕рд░рд╛ X-Cache: Hit рджрд╛рдЦрд╡рддреЛ тАФ
office рдиреЗ рддреНрдпрд╛рдЪреНрдпрд╛ рд╕реВрдЪрдирд╛ рдлрд▓рдХрд╛рд╡рд░реВрди рдЙрддреНрддрд░ рджрд┐рд▓реЗ. /teachers рд╣реЗ HTTP/1.0 404 Not Found рдЖрдгрд┐
{"message": "Not Found"} рджрд╛рдЦрд╡рддреЗ.
ЁЯПБ рддреБрдореНрд╣реА рдЖрддреНрддрд╛рдЪ рдХрд╛рдп рд╕рд┐рджреНрдз рдХреЗрд▓реЗ
рдкреНрд░рддреНрдпреЗрдХ visitor рдПрдХрд╛рдЪ desk рд╡рд░реВрди рдЬрд╛рддреЛ. Desk рдиреЗ рдкреНрд░рддреНрдпреЗрдХ рднреЗрдЯреАрдЪреЗ рдЙрддреНрддрд░ рджрд┐рд▓реЗ, рддреА рдореЛрдЬрд▓реА, рд▓рдХреНрд╖рд╛рдд рдареЗрд╡рд▓реА рдЖрдгрд┐ рд▓рд┐рд╣реВрди рдареЗрд╡рд▓реА тАФ рдЖрдгрд┐ kitchen рд▓рд╛ рдлрдХреНрдд рдЧрд░рдЬ рдЕрд╕реЗрд▓ рддреЗрд╡реНрд╣рд╛рдЪ рд╡рд┐рдЪрд╛рд░рд▓реЗ рдЧреЗрд▓реЗ.
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
- "gateway рдЬрд╛рджрд╛ рдЖрд╣реЗ" рдореНрд╣рдгреВрди рдкреНрд░рддреНрдпреЗрдХ service рдордзреНрдпреЗ рдкреБрдиреНрд╣рд╛ auth, rate limits рдЖрдгрд┐ logging рдмрдирд╡рдгреЗ
- gateway рд╕реНрд╡рддрдГрд╣реВрдирдЪ back end рд╕реБрд░рдХреНрд╖рд┐рдд рдХрд░рддреЗ рдЕрд╕реЗ рд╕рдордЬрдгреЗ тАФ рддреБрдореНрд╣реА configure рдХреЗрд▓реЗрд▓реЗ рддреЗрд╡рдвреЗрдЪ рддреЗ рддрдкрд╛рд╕рддреЗ
- рдЕрдиреЛрд│рдЦреА path рд╕рд╛рдареА рдЦрд░рд╛ REST API
404рдореНрд╣рдгреЗрд▓ рдЕрд╢реА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рдгреЗ: route рдирд╕рд▓реЗрд▓реНрдпрд╛ path рдХрд┐рдВрд╡рд╛ method рд╕рд╛рдареА рдЦрд░реЗ REST APIs403 {"message":"Missing Authentication Token"}рдЕрд╕реЗ рдЙрддреНрддрд░ рджреЗрддрд╛рдд (HTTP APIs404 Not FoundрджреЗрддрд╛рдд). рдзрдбрд╛ рд╕реНрдкрд╖реНрдЯ рд░рд╛рд╣рд╛рд╡рд╛ рдореНрд╣рдгреВрди рд╣реЗ model404/405рдореНрд╣рдгрддреЗ gateway.pyрд▓рд╛рдЪ рдЦрд░реА service рд╕рдордЬрдгреЗ тАФ рддреЗ model рдЖрд╣реЗ; AWS console рдЪреЗ Test button рдЖрдгрд┐aws apigateway test-invoke-methodрд╣реЗрдЪ рдкрдВрдЪ рдЖрд╣реЗрдд
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд
On a real account тАФ рддреБрдордЪреЗ REST рдЖрдгрд┐ HTTP APIs list рдХрд░рд╛, рдЖрдгрд┐ рдЖрдзреАрдкрд╛рд╕реВрди рдЕрд╕рд▓реЗрд▓реНрдпрд╛ Lambda function рд╕рдореЛрд░ рдПрдХрд╛рдЪ command рдиреЗ HTTP API рдмрдирд╡рд╛ ("quick create"):
aws apigateway get-rest-apis --query 'items[].{name:name,id:id}'
aws apigatewayv2 get-apis --query 'Items[].{name:Name,id:ApiId,type:ProtocolType}'
aws apigatewayv2 create-api --name school-api --protocol-type HTTP \
--target arn:aws:lambda:ap-south-1:111122223333:function:students
ЁЯПн Production рдордзреНрдпреЗ рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ: рдмрд╣реБрддреЗрдХ AWS serverless systems Lambda рд╕рдореЛрд░ API Gateway рдареЗрд╡рддрд╛рдд, рдореНрд╣рдгрдЬреЗ auth, throttling рдЖрдгрд┐ logging рдПрдХрд╛рдЪ рддрдкрд╛рд╕рд▓реЗрд▓реНрдпрд╛ рдЬрд╛рдЧреА рд░рд╛рд╣рддрд╛рдд. рдкрд╣рд┐рд▓рд╛ review рдкреНрд░рд╢реНрди рд╕реЛрдкрд╛ рдЕрд╕рддреЛ: рдХреЛрдгрддреЗ routes рдЖрд╣реЗрдд, рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХрд╛рд▓рд╛ рдХреЛрдг call рдХрд░реВ рд╢рдХрддреЛ?
тПня╕П рдкреБрдвреЗ
Office рддрдпрд╛рд░ рдЖрд╣реЗ. рдкрдг AWS рддреАрди рдкреНрд░рдХрд╛рд░рдЪреА front offices рджреЗрддреЗ тАФ рдПрдХ рдкреВрд░реНрдг, рдПрдХ рд╣рд▓рдХреЗ, рдЖрдгрд┐ рдПрдХ рдЬреНрдпрд╛рдд phone line рдЙрдШрдбреА рд░рд╛рд╣рддреЗ.
git checkout lesson-02-rest-http-websocket