ЁЯЫбя╕П рдзрдбрд╛ 12 тАФ Private APIs, WAF, рдорд░реНрдпрд╛рджрд╛ рдЖрдгрд┐ рдЦрд░реНрдЪ: рдХрдбрдХ рдорд░реНрдпрд╛рджрд╛
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 12 ┬╖ рдорд╛рдЧреЗ: lesson-11-monitoring
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рдзрдбреЗ 01тАУ11, рдЖрдгрд┐ рдлрдХреНрдд рдЗрдЪреНрдЫрд╛ рдХрд░реВрди рди рд╣рд▓рдгрд╛рд▒реНрдпрд╛ рдорд░реНрдпрд╛рджрд╛: integration
timeout (REST APIs рд╡рд░ default 29 s, HTTP APIs рд╡рд░ 30 s), 10 MB payload
рдорд░реНрдпрд╛рджрд╛, interface VPC endpoint рдорд╛рдЧрдЪреЗ private APIs, REST stages рд╕рдореЛрд░рдЪрд╛
AWS WAF, рдЖрдгрд┐ bill. apigw/demo.py рдордзрд▓реЗ limits()
504 рдЖрдгрд┐ 502 рджрд╛рдЦрд╡рддреЗ, рдЖрдгрд┐ рдиреЗрдордХреНрдпрд╛ рдорд░реНрдпрд╛рджрд╛ рддреБрдореНрд╣реА рд╕реНрд╡рддрдГ рд╢реЛрдзрддрд╛.
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
Front office рдЪреЗ рдХрд╛рд╣реА рдирд┐рдпрдо рдЕрд╕реЗ рдЖрд╣реЗрдд рдЬреЗ рдХреЛрдгреАрд╣реА рд╡рд╛рдХрд╡реВ рд╢рдХрдд рдирд╛рд╣реА:
- тП▒я╕П Stopwatch: visitor kitchen рд╕рд╛рдареА рдЬрд╛рд╕реНрддреАрдд рдЬрд╛рд╕реНрдд 29 рд╕реЗрдХрдВрдж рдерд╛рдВрдмрддреЛ. Kitchen
рдЕрдЬреВрди рд╕реНрд╡рдпрдВрдкрд╛рдХ рдХрд░рдд рдЕрд╕реЗрд▓, рддрд░ clerk рдореНрд╣рдгрддреЛ "kitchen рдиреЗ рдЦреВрдк рд╡реЗрд│ рдШреЗрддрд▓рд╛" (
504) тАФ рдЬреЗрд╡рдг рдЬрд╡рд│рдЬрд╡рд│ рддрдпрд╛рд░ рдЕрд╕рд▓реЗ рддрд░реАрд╣реА. рд▓рд╛рдВрдм рдХрд╛рдорд╛рд╕рд╛рдареА clerk рддреНрдпрд╛рдРрд╡рдЬреА visitor рд▓рд╛ token рдХреНрд░рдорд╛рдВрдХ рджреЗрддреЛ рдЖрдгрд┐ рдореНрд╣рдгрддреЛ "рдирдВрддрд░ рдкрд░рдд рдпрд╛". - ЁЯУж Parcel рдЪрд╛ рдЖрдХрд╛рд░: 10 MB рдкреЗрдХреНрд╖рд╛ рдореЛрдареЗ рдХреЛрдгрддреЗрд╣реА parcel desk рд╡рд░реВрди рдкреБрдвреЗ рдЬрд╛рдд рдирд╛рд╣реА (
413). рдореЛрдареНрдпрд╛ files рд╡реЗрдЧрд│реНрдпрд╛ рдорд╛рд▓-рдлрд╛рдЯрдХрд╛рддреВрди рдЬрд╛рддрд╛рдд (pre-signed S3 link). - ЁЯФе Kitchen рдордзреНрдпреЗ рдЖрдЧ: kitchen рдмрд┐рдШрдбрд▓реЗ рддрд░ clerk рдореНрд╣рдгрддреЛ "рдЖрдд рдХрд╛рд╣реАрддрд░реА рдмрд┐рдШрдбрд▓реЗ
рдЖрд╣реЗ" (
502) тАФ рдЖрдгрд┐ visitor рд▓рд╛ kitchen рдХрдзреАрдЪ рджрд╛рдЦрд╡рдд рдирд╛рд╣реА.
рдХрд╛рд╣реА offices рдлрдХреНрдд рд╢рд╛рд│реЗрдЪреНрдпрд╛ рдЖрддрдЪ ЁЯПл рдЕрд╕рддрд╛рдд тАФ рдПрдХ рдЦрд╛рдЬрдЧреА рджрд╛рд░, рдЬреНрдпрд╛рдкрд░реНрдпрдВрдд рдЖрдзреАрдЪ campus рд╡рд░ рдЕрд╕рд▓реЗрд▓реЗ рд▓реЛрдХрдЪ рдкреЛрд╣реЛрдЪреВ рд╢рдХрддрд╛рдд. рдЖрдгрд┐ office рд╕рдореЛрд░ рдПрдХ рдкрд╣рд╛рд░реЗрдХрд░реА ЁЯЫбя╕П (WAF) рдЙрднрд╛ рд░рд╛рд╣реВ рд╢рдХрддреЛ, рдЬреЛ рдУрд│рдЦреАрдЪреНрдпрд╛ рддреНрд░рд╛рд╕рджрд╛рдпрдХ рд▓реЛрдХрд╛рдВрдирд╛ clerk рдкрд░реНрдпрдВрдд рдкреЛрд╣реЛрдЪрдгреНрдпрд╛рдЖрдзреАрдЪ рдкрд░рдд рдкрд╛рдард╡рддреЛ.
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart LR
c["ЁЯЩЛ caller"] --> waf["ЁЯЫбя╕П AWS WAF<br/>SQL injection ┬╖ IP sets ┬╖ rate rules"]
waf --> gw["ЁЯЫОя╕П REST API stage"]
gw -->|"body > 10 MB"| e413["413 Request too large"]
gw -->|"kitchen > 29 s"| e504["504 Endpoint request timed out"]
gw -->|"kitchen crashes"| e502["502 Internal server error"]
vpc["ЁЯПл VPC тЖТ interface endpoint<br/>com.amazonaws.region.execute-api"] -->|"resource policy allows this vpce"| priv["ЁЯФТ private API"]
ЁЯЧ║я╕П рдХрд╛рдврд▓реЗрд▓реА рдЖрдХреГрддреА + рдПрдХ lab: https://school-edh.pages.dev/apigateway/lesson-diagrams.html#l12
тЭУ рдХрд╛рдп
- Integration timeout тАФ REST APIs: default 29 рд╕реЗрдХрдВрдж. 2024 рдкрд╛рд╕реВрди рддреБрдореНрд╣реА
(Service Quotas рдордзреВрди) Regional рдЖрдгрд┐ private REST APIs рд╕рд╛рдареА рдЬрд╛рд╕реНрдд рдореЛрдард╛ timeout рдорд╛рдЧреВ рд╢рдХрддрд╛;
рддреНрдпрд╛рдмрджрд▓реНрдпрд╛рдд AWS рддреБрдордЪреНрдпрд╛ account рдЪрд╛ throttle quota рдХрдореА рдХрд░реВ рд╢рдХрддреЗ. HTTP APIs: 30 рд╕реЗрдХрдВрдж, рд╣реА
рдХрдбрдХ рдХрдорд╛рд▓ рдорд░реНрдпрд╛рджрд╛. Caller рд▓рд╛
504рдорд┐рд│рддреЛ. - Payload тАФ REST рдЖрдгрд┐ HTTP API requests рд╕рд╛рдареА 10 MB. Lambda integration рд╡рд░
Lambda рдЪреА рд╕реНрд╡рддрдГрдЪреА synchronous payload рдорд░реНрдпрд╛рджрд╛рд╣реА (6 MB) рд▓рд╛рдЧреВ рд╣реЛрддреЗ. Model
413рдЙрддреНрддрд░ рджреЗрддреЗ. - WebSocket тАФ 10 рдорд┐рдирд┐рдЯреЗ рдирд┐рд╖реНрдХреНрд░рд┐рдп рд░рд╛рд╣рд┐рд▓реНрдпрд╛рд╡рд░ рдХрд┐рдВрд╡рд╛ рдПрдХреВрдг 2 рддрд╛рд╕рд╛рдВрдирдВрддрд░ office connection рдмрдВрдж рдХрд░рддреЗ.
- рд▓рд╛рдВрдм рдХрд╛рдореЗ тАФ request рд╕реНрд╡реАрдХрд╛рд░рд╛, job id рд╕рд╣
202 AcceptedрдЙрддреНрддрд░ рджреНрдпрд╛, рдХрд╛рдо background рдордзреНрдпреЗ рдХрд░рд╛ (SQS, Step Functions), рдЖрдгрд┐ client рд▓рд╛ poll рдХрд░реВ рджреНрдпрд╛ рдХрд┐рдВрд╡рд╛ push рдкрд╛рдард╡рд╛ (WebSocket, email). рдореЛрдареНрдпрд╛ files тАФ pre-signed S3 URL рджреНрдпрд╛; file рдХрдзреАрдЪ API рдордзреВрди рдЬрд╛рдд рдирд╛рд╣реА. 502тАФ back end рдЕрдкрдпрд╢реА рдард░рд▓рд╛ рдХрд┐рдВрд╡рд╛ рддреНрдпрд╛рдиреЗ рдмрд┐рдШрдбрд▓реЗрд▓реЗ рдЙрддреНрддрд░ рджрд┐рд▓реЗ (рдЙрджрд╛. error рдлреЗрдХрдгрд╛рд░реЗ Lambda proxy function).- Private API (REST) тАФ endpoint type
PRIVATE. рдлрдХреНрддexecute-apiрд╕рд╛рдареАрдЪреНрдпрд╛ interface VPC endpoint рдордзреВрдирдЪ (com.amazonaws.<region>.execute-api) рдкреЛрд╣реЛрдЪрддрд╛ рдпреЗрддреЗ, рдЖрдгрд┐ рддреЗрд╣реА рдлрдХреНрдд API рдЪреА resource policy рдкрд░рд╡рд╛рдирдЧреА рджреЗрдд рдЕрд╕реЗрд▓ рддрд░ (рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрдеaws:SourceVpceрдиреЗ). - AWS WAF тАФ REST API stage рд▓рд╛ web ACL рдЬреЛрдбрд╛: managed rule groups (SQL injection, рдУрд│рдЦреАрдЪреЗ рд╡рд╛рдИрдЯ inputs), IP sets, рднреМрдЧреЛрд▓рд┐рдХ rules рдЖрдгрд┐ rate-based rules. HTTP APIs рдирд╛ WAF рдереЗрдЯ рдЬреЛрдбрддрд╛ рдпреЗрдд рдирд╛рд╣реА тАФ рд╕рдореЛрд░ WAF рд╕рд╣ CloudFront рдареЗрд╡рд╛.
- рдЦрд░реНрдЪ (рдЕрдВрджрд╛рдЬреЗ, us-east-1, рдкрд╣рд┐рд▓рд╛ tier): REST ~$3.50 рдкреНрд░рддрд┐ рджрд╢рд▓рдХреНрд╖ requests, HTTP ~$1.00 рдкреНрд░рддрд┐ рджрд╢рд▓рдХреНрд╖, WebSocket ~$1.00 рдкреНрд░рддрд┐ рджрд╢рд▓рдХреНрд╖ messages рдЕрдзрд┐рдХ connection minutes тАФ рддреНрдпрд╛рд╢рд┐рд╡рд╛рдп cache рддрд╛рд╕ (рдзрдбрд╛ 08), рдмрд╛рд╣реЗрд░ рдЬрд╛рдгрд╛рд░реЗ data transfer, CloudWatch Logs, рдЖрдгрд┐ WAF (web ACL, rules рдЖрдгрд┐ requests). рддреБрдордЪреНрдпрд╛ Region рд╕рд╛рдареА pricing page рддрдкрд╛рд╕рд╛.
ЁЯдФ рдХрд╛
рдХрд╛рд░рдг рдпрд╛ рдорд░реНрдпрд╛рджрд╛ рддреБрдордЪреЗ design рдард░рд╡рддрд╛рдд, рддреБрдордЪреЗ configuration рдирд╛рд╣реА. 45 рд╕реЗрдХрдВрджрд╛рдВрдЪрд╛ report default timeout рдЕрд╕рд▓реЗрд▓реНрдпрд╛ REST API рдорд╛рдЧреЗ рдирдХреНрдХреАрдЪ рдЕрдкрдпрд╢реА рдард░реЗрд▓, рддреБрдореНрд╣реА рдХрд┐рддреАрд╣реА tune рдХреЗрд▓реЗ рддрд░реА тАФ рдЙрдкрд╛рдп рдореНрд╣рдгрдЬреЗ рд╡реЗрдЧрд│рд╛ рдЖрдХрд╛рд░ (рдЖрдзреА рд╕реНрд╡реАрдХрд╛рд░рд╛, рдордЧ poll). Private API рд╣рд╛ internal service рдкреНрд░рд╕рд┐рджреНрдз рдХрд░рдгреНрдпрд╛рдЪрд╛, internet рдЪрд╛ рдХреЛрдгрддрд╛рд╣реА рдорд╛рд░реНрдЧ рди рдареЗрд╡рддрд╛, рд╕рдЧрд│реНрдпрд╛рдд рд╕реЛрдкрд╛ рдорд╛рд░реНрдЧ рдЖрд╣реЗ. рдЖрдгрд┐ bill рдкреНрд░рддреНрдпреЗрдХ request рд╕реЛрдмрдд рд╡рд╛рдврддреЗ, рдореНрд╣рдгреВрди рдЦреВрдк рдЬрд╛рд╕реНрдд рдЖрдгрд┐ рд╕реНрдерд┐рд░ volume рд╡рд░ load balancer рд╕реНрд╡рд╕реНрдд рдкрдбреВ рд╢рдХрддреЛ.
ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)
apigw/gateway.py рдордзреНрдпреЗ рдорд░реНрдпрд╛рджрд╛ constants рдореНрд╣рдгреВрди рдЖрд╣реЗрдд:
TIMEOUT_S = 29 рдЖрдгрд┐ MAX_PAYLOAD = 10 * 1024 * 1024. Gateway._handle() рдордзреНрдпреЗ MAX_PAYLOAD рдкреЗрдХреНрд╖рд╛
(JSON рдореНрд╣рдгреВрди) рдореЛрдареНрдпрд╛ body рд▓рд╛ 413 рдорд┐рд│рддреЛ; рдЬреНрдпрд╛ route рдЪреА latency 29 s рдкреЗрдХреНрд╖рд╛ рдЬрд╛рд╕реНрдд рдЖрд╣реЗ рддреНрдпрд╛рд▓рд╛
kitchen рд▓рд╛ call рди рдХрд░рддрд╛рдЪ 504 рдорд┐рд│рддреЛ; exception рдлреЗрдХрдгрд╛рд▒реНрдпрд╛ integration рд▓рд╛
502 Internal server error рдорд┐рд│рддреЛ. apigw/demo.py рдордзреНрдпреЗ /report рд▓рд╛
31 s рд▓рд╛рдЧрддрд╛рдд рдЖрдгрд┐ /broken RuntimeError рдлреЗрдХрддреЛ. Private endpoints, WAF рдЖрдгрд┐ рдХрд┐рдорддреА
limits() рдЫрд╛рдкрддреЗ тАФ lab рддреНрдпрд╛ рдЪрд╛рд▓рд╡реВ рд╢рдХрдд рдирд╛рд╣реА.
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛
python3 apigw/demo.py limits
python3 - <<'EOF'
import sys; sys.path.insert(0, "apigw"); from demo import office
from gateway import Route, TIMEOUT_S, MAX_PAYLOAD
gw, _ = office()
gw.add(Route("GET", "/slow/{s}", lambda e: (200, {"ok": True}), latency=29),
Route("GET", "/slower/{s}", lambda e: (200, {"ok": True}), latency=29.5),
Route("POST", "/upload", lambda e: (201, {"size": len(e["body"]["data"])})))
print("29 s :", gw.handle("GET", "/slow/x")[0::2])
print("29.5 s:", gw.handle("GET", "/slower/x")[0::2])
print("limit :", TIMEOUT_S, "s ┬╖", MAX_PAYLOAD, "bytes")
print("1 MB :", gw.handle("POST", "/upload", body={"data": "x" * 1_000_000})[0::2])
print("11 MB :", gw.handle("POST", "/upload", body={"data": "x" * 11_000_000})[0::2])
EOF
python3 apigw/test_apigw.py
рдЖрдгрд┐ рдЪрд╛рд▓реВ office рд╡рд░:
python3 apigw/demo.py serve &
sleep 1 # give the office a second to open
curl -i localhost:8080/report
kill %1
тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ
limits рдЫрд╛рдкрддреЗ hard edges: integration timeout 29 s (REST default), payload 10 MB,
GET /report тЖТ 504 {'message': 'Endpoint request timed out'},
GET /broken тЖТ 502 {'message': 'Internal server error'}, рдордЧ рд▓рд╛рдВрдм рдХрд╛рдореЗ,
private API, WAF рдпрд╛рдВрдЪреНрдпрд╛ рдУрд│реА, рдЖрдгрд┐
cost (example, us-east-1): REST ~$3.50 per million requests, HTTP ~$1.00 per million тАФ plus cache hours and data out.
рддреБрдордЪрд╛ snippet рд╣реЗ рдЫрд╛рдкрддреЛ:
29 s : (200, {'ok': True})
29.5 s: (504, {'message': 'Endpoint request timed out'})
limit : 29 s ┬╖ 10485760 bytes
1 MB : (201, {'size': 1000000})
11 MB : (413, {'message': 'Request too large'})
рдЖрдгрд┐ tests 12/12 passed рдиреЗ рд╕рдВрдкрддрд╛рдд. рдЪрд╛рд▓реВ office
{"message": "Endpoint request timed out"} рд╕рд╣ HTTP/1.0 504 Gateway Timeout рдЙрддреНрддрд░ рджреЗрддреЗ.
ЁЯПБ рддреБрдореНрд╣реА рдЖрддреНрддрд╛рдЪ рдХрд╛рдп рд╕рд┐рджреНрдз рдХреЗрд▓реЗ
рддреБрдореНрд╣реА рдорд░реНрдпрд╛рджрд╛ рдиреЗрдордХреНрдпрд╛ рд╢реЛрдзрд▓реНрдпрд╛: 29 s рдкрд╛рд╕ рд╣реЛрддреЛ рдЖрдгрд┐ 29.5 s рдирд╛рд╣реА; 1 MB рдкрд╛рд╕ рд╣реЛрддреЛ рдЖрдгрд┐ 11 MB
рдирд╛рд╣реА; рдмрд┐рдШрдбрд▓реЗрд▓реЗ kitchen рддрдкрд╢реАрд▓ рд▓рдкрд╡рдгрд╛рд░рд╛ рд╕рд╛рдзрд╛ 502 рдмрдирддреЗ.
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
- REST API рдорд╛рдЧреЗ Lambda timeout 5 рдорд┐рдирд┐рдЯреЗ рдХрд░рдгреЗ рдЖрдгрд┐ caller рдерд╛рдВрдмреЗрд▓ рдЕрд╢реА рдЕрдкреЗрдХреНрд╖рд╛ рдареЗрд╡рдгреЗ тАФ office рддрд░реАрд╣реА 29 s рд▓рд╛ рдерд╛рдВрдмрддреЗ (рддреБрдореНрд╣реА рддреЛ quota рд╡рд╛рдврд╡рд▓рд╛ рдирд╕реЗрд▓ рддрд░)
- pre-signed S3 URL рдРрд╡рдЬреА API рдордзреВрди files upload рдХрд░рдгреЗ
- interface endpoint рдЕрд╕рд▓реЗрд▓рд╛ рдкрдг resource policy рдирд╕рд▓реЗрд▓рд╛ private API тАФ рдкреНрд░рддреНрдпреЗрдХ call рдирд╛рдХрд╛рд░рд▓рд╛ рдЬрд╛рддреЛ
- VPC рдордзреНрдпреЗ
execute-apiendpoint рд╕рд╛рдареА private DNS рдЪрд╛рд▓реВ рдХрд░рдгреЗ рдЖрдгрд┐ рдордЧ рд▓рдХреНрд╖рд╛рдд рдпреЗрдгреЗ рдХреА рддреНрдпрд╛ VPC рдордзреВрди public APIs рддреНрдпрд╛рдВрдЪреНрдпрд╛ default рдирд╛рд╡рд╛рдВрдиреА рдкреЛрд╣реЛрдЪрддрд╛ рдпреЗрдд рдирд╛рд╣реАрдд (рддреНрдпрд╛рдВрдЪреНрдпрд╛рд╕рд╛рдареА custom domain рд╡рд╛рдкрд░рд╛) - custom domain рдЪреНрдпрд╛ API рд╡рд░ WAF, рдкрдг default
execute-apiendpoint рдЕрдЬреВрдирд╣реА рдЙрдШрдбрд╛ - bill рд╡рд░рдЪреНрдпрд╛ "рддреНрдпрд╛рд╢рд┐рд╡рд╛рдп" рдЧреЛрд╖реНрдЯреАрдВрдХрдбреЗ рджреБрд░реНрд▓рдХреНрд╖: cache рддрд╛рд╕, logs рдЖрдгрд┐ WAF рдпрд╛рдВрдЪрд╛ рдЦрд░реНрдЪ рдЕрдиреЗрдХрджрд╛ requests рдкреЗрдХреНрд╖рд╛ рдЬрд╛рд╕реНрдд рдЕрд╕рддреЛ
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд
рдЦрд▒реНрдпрд╛ account рд╡рд░ тАФ execute-api рд╕рд╛рдареА interface endpoint, рдлрдХреНрдд рддреЛрдЪ рд╕реНрд╡реАрдХрд╛рд░рдгрд╛рд░рд╛ private REST API,
рдЖрдгрд┐ public stage рд╡рд░ WAF:
aws ec2 create-vpc-endpoint --vpc-id vpc-0123456789abcdef0 --vpc-endpoint-type Interface \
--service-name com.amazonaws.ap-south-1.execute-api \
--subnet-ids subnet-0aaa1111bbbb2222c --security-group-ids sg-0123456789abcdef0
aws apigateway create-rest-api --name school-internal --endpoint-configuration types=PRIVATE \
--policy file://private-policy.json
aws wafv2 associate-web-acl \
--web-acl-arn arn:aws:wafv2:ap-south-1:111122223333:regional/webacl/school-api-acl/1234abcd-12ab-34cd-56ef-1234567890ab \
--resource-arn arn:aws:apigateway:ap-south-1::/restapis/abc123/stages/prod
private-policy.json тАФ рдлрдХреНрдд рддреНрдпрд╛ рдПрдХрд╛рдЪ endpoint рдордзреВрди calls рдирд╛ рдкрд░рд╡рд╛рдирдЧреА:
{
"Version": "2012-10-17",
"Statement": [
{ "Effect": "Allow", "Principal": "*", "Action": "execute-api:Invoke",
"Resource": "execute-api:/*" },
{ "Effect": "Deny", "Principal": "*", "Action": "execute-api:Invoke",
"Resource": "execute-api:/*",
"Condition": { "StringNotEquals": { "aws:SourceVpce": "vpce-0123456789abcdef0" } } }
]
}
ЁЯПн Production рдордзреНрдпреЗ рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ рдЖрд╣реЗ: рдкрд╣рд┐рд▓реНрдпрд╛ рджрд┐рд╡рд╕рд╛рдкрд╛рд╕реВрдирдЪ рд▓рд╛рдВрдм рдХрд╛рдореЗ accept-then-poll рдореНрд╣рдгреВрди design рдХрд░рд╛, files S3 рдордзреВрди рдкрд╛рдард╡рд╛, internal APIs private рдареЗрд╡рд╛, public REST stages рд╕рдореЛрд░ WAF рдареЗрд╡рд╛, рдЖрдгрд┐ рдорд╣рд┐рдиреНрдпрд╛рддреВрди рдПрдХрджрд╛ рд╕рдВрдкреВрд░реНрдг bill рд╡рд╛рдЪрд╛ тАФ рдлрдХреНрдд requests рдЪреА рдУрд│ рдирд╛рд╣реА.
ЁЯОУ Front office рдЖрддрд╛ рддреБрдордЪреЗ рдЖрд╣реЗ
рдПрдХ front office тЖТ offices рдЪреЗ рддреАрди рдкреНрд░рдХрд╛рд░ тЖТ рдХреЛрдгрддрд╛ desk, рдХреЛрдгрддреЗ kitchen тЖТ form рддрдкрд╛рд╕рдгреА рдЖрдгрд┐ рд╕реНрд╡рдЪреНрдЫ рдЙрддреНрддрд░ тЖТ рд░рдВрдЧреАрдд рддрд╛рд▓реАрдо рдЖрдгрд┐ рдЦрд░рд╛ рдкреНрд░рдпреЛрдЧ тЖТ badge рддрдкрд╛рд╕рдгреА тЖТ рджрд╛рд░рд╛рд╡рд░рдЪрд╛ token bucket тЖТ рд╕реВрдЪрдирд╛ рдлрд▓рдХ тЖТ browser рдЖрдзреА рд╡рд┐рдЪрд╛рд░рддреЛ тЖТ рдирд╛рд╡рдлрд▓рдХ тЖТ dashboard рдЖрдгрд┐ stopwatch тЖТ рдХрдбрдХ рдорд░реНрдпрд╛рджрд╛. рддреБрдореНрд╣реА рдлрдХреНрдд API Gateway рд╢рд┐рдХрд▓рд╛ рдирд╛рд╣реАрдд тАФ рддреБрдореНрд╣реА front office рдЪрд╛рд▓рд╡реВ рд╢рдХрддрд╛. ЁЯЫОя╕ПЁЯОУ
рд╢рд╛рд│реЗрддрд▓реА рдкреБрдврдЪреА рджрд╛рд░реЗ: API school office рдорд╛рдЧреЗ рдХрд╛рдп рдмрд╕рддреЗ рддреНрдпрд╛рдЪреЗ design рдХрд░рддреЗ; IAM school SigV4 рдЖрдгрд┐ IAM auth рдорд╛рдЧрдЪреЗ roles рд╕рдордЬрд╛рд╡рддреЗ; VPC school private API рдЬреНрдпрд╛рдд рд░рд╛рд╣рддреЛ рддреЛ рдЦрд╛рдЬрдЧреА campus рдмрд╛рдВрдзрддреЗ.
git checkout main
python3 apigw/demo.py # one last run, for fun