🛎️ Amazon API Gateway शाळेच्या पद्धतीने शिका

तुमच्या APIs समोरचे मुख्य दार, शाळेच्या front office च्या रूपात शिकवलेले: ते badges तपासते, visitors मोजते, उत्तरे सूचना फलकावर लावते आणि प्रत्येकाला योग्य kitchen कडे पाठवते. प्रत्येक धडा म्हणजे चित्र आणि lab असलेली एक शाळेची गोष्ट — आणि front office repo मध्येच आहे: शुद्ध Python मधील local gateway (apigw/gateway.py, कोणतीही dependency नाही) ज्यात routes, JWT authorizer, token bucket, cache, CORS आणि access logs आहेत — code मधून किंवा localhost:8080 वर वापरता येतो.

🧰 REST · HTTP · WebSocket🗺️ routes आणि {proxy+}📝 validation🎭 stages🔐 JWT आणि Lambda authorizers🚦 token bucket📌 cache TTL🌐 CORS📈 Latency विरुद्ध IntegrationLatency

🛎️ भाग 1 — FRONT OFFICE (1–6)

  • एकच front office का 🛎️
  • office चे तीन प्रकार 🧰
  • कोणता desk, कोणते kitchen 🗺️📝
  • रंगीत तालीम आणि badges 🎭🔐

🚦 भाग 2 — PRODUCTION मध्ये चालवणे (7–12)

  • दारावरचा token bucket 🚦
  • सूचना फलक 📌
  • आधी विचारणारे browsers 🌐
  • नावे, आकडे आणि कठोर मर्यादा 🏷️📈🛡️
# the 60-second wow — the front office, live:
git clone https://github.com/BaluRaut/learn-apigateway-school.git && cd learn-apigateway-school
python3 apigw/demo.py              # 12 lessons: every request and its answer
python3 apigw/test_apigw.py        # 12 checks across the lessons
python3 apigw/demo.py serve        # then: curl -i localhost:8080/students/7

तुम्हाला काय दिसायला हवे (छाटलेले — यश असे दिसते):

═══ why ═══
── one front office for every visitor: it checks, counts, remembers and forwards — the kitchen only cooks
   GET     /students/7              → 200 {'id': '7', 'name': 'Aishwarya', 'class': '8B'}  X-Cache: Miss
   GET     /teachers                → 404 {'message': 'Not Found'}
   without it, every service rebuilds auth, limits, logging and TLS on its own

═══ kinds ═══
── three kinds of API Gateway
   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

═══ routes ═══
── the most specific route wins: a fixed word beats {id}, {proxy+} catches everything else
   GET     /students/9              → 200 {'id': '9', 'name': 'Katrina', 'class': '9A'}  X-Cache: Miss
   GET     /students/me             → 200 {'you': 'teacher-42'}
   GET     /files/term1/maths/paper.pdf → 200 {'file': 'term1/maths/paper.pdf'}
   DELETE  /students/9              → 405 {'message': 'Method Not Allowed'}
   integration = where the office forwards the visitor: Lambda, an HTTP backend, an AWS service, or a mock

═══ validate ═══
── the office rejects a bad form BEFORE the kitchen sees it (the backend is not called, not billed)
   POST    /marks                   → 400 {'message': 'Invalid request body', 'why': "missing required field 'mark'"}
   POST    /marks                   → 400 {'message': 'Invalid request body', 'why': "'mark' must be int"}
   POST    /marks                   → 201 {'saved': {'student': '7', 'subject': 'maths', 'mark': 91}, 'table': 'marks-prod'}
── response mapping: the kitchen returns the phone number, the office removes it on the way out
   kitchen: {'id': '7', 'name': 'Aishwarya', 'class': '8B', 'phone': '98xxxxxx12'}
   GET     /students/7              → 200 {'id': '7', 'name': 'Aishwarya', 'class': '8B'}  X-Cache: Miss

═══ stages ═══
── one API, many stages — each a snapshot (deployment) with its own variables, limits and cache
   stage dev   → 201 {'saved': {'student': '7', 'subject': 'maths', 'mark': 91}, 'table': 'marks-dev'}
   stage prod  → 201 {'saved': {'student': '7', 'subject': 'maths', 'mark': 91}, 'table': 'marks-prod'}
   stage test  → 403 {'message': 'Forbidden'}
   a change is live only after a new deployment to a stage · canary: send 10% of prod to the new deployment

═══ auth ═══
── who are you? JWT authorizer (Cognito or any OIDC issuer) — checks signature, issuer, audience, expiry
   no token             GET     /students/me             → 401 {'message': 'Unauthorized', 'why': 'no token'}
   forged               GET     /students/me             → 401 {'message': 'Unauthorized', 'why': 'bad signature'}
   expired              GET     /students/me             → 401 {'message': 'Unauthorized', 'why': 'expired'}
   other app's token    GET     /students/me             → 401 {'message': 'Unauthorized', 'why': 'wrong audience'}
   good                 GET     /students/me             → 200 {'you': 'teacher-42'}
── scope check: a read-only token may not write marks
   POST    /marks                   → 403 {'message': 'Forbidden', 'why': 'needs scope marks:write'}
── Lambda authorizer: your own code decides (here: a staff badge)
   GET     /staffroom               → 403 {'message': 'User is not authorized to access this resource'}
   GET     /staffroom               → 200 {'you': 'teacher-42'}
   IAM auth (SigV4) for callers inside AWS · API keys are NOT auth — they say which client, not who, and leak easily

═══ throttle ═══
── token bucket: holds `burst` tokens, refills `rate`/s — defaults 10,000 rps and 5,000 burst per account & Region
   stage dev: rate 5/s, burst 5 — 8 requests in the same instant:
   200 200 200 200 200 429 429 429
   one second later: 200 200 200 200 200 429
── usage plan 'partner-basic' (2 rps, burst 2) on the partner route, identified by x-api-key:
   200 200 429 429  · unknown key → 403
   429 means slow down and retry with backoff — it is the office protecting the kitchen

═══ cache ═══
── the notice board: stage cache TTL 300 s (default; 0–3600) — the kitchen is asked once
   +0   s  200 Miss   kitchen calls so far: 1
   +10  s  200 Hit   kitchen calls so far: 1
   +200 s  200 Hit   kitchen calls so far: 1
   +301 s  200 Miss   kitchen calls so far: 2
   the cache key is method + path (+ chosen headers / query strings) — never cache per-user answers under a shared key

═══ cors ═══
── a browser page on another site asks first (OPTIONS preflight); the office answers with Allow-* headers
   OPTIONS /students/7              → 204   Access-Control-Allow-Origin: https://school.example Access-Control-Allow-Methods: GET,POST,PUT,DELETE Access-Control-Allow-Headers: authorization,content-type,x-api-key Access-Control-Max-Age: 600
   OPTIONS /students/7              → 403 {'message': 'CORS origin not allowed'}
   GET     /students/7              → 200 {'id': '7', 'name': 'Aishwarya', 'class': '8B'}  X-Cache: Miss Access-Control-Allow-Origin: https://school.example
   CORS is enforced by BROWSERS — curl ignores it. It is not security for your API, it protects users' browsers

═══ domains ═══
── custom domain: api.school.example instead of abc123.execute-api.ap-south-1.amazonaws.com
   certificate        ACM — in us-east-1 for edge-optimized, in the API's Region for regional
   DNS                Route 53 alias (A/AAAA) → the gateway's domain name
   base path mapping  api.school.example/v1 → school-api prod · /v2 → school-api-v2 prod
   TLS                security policy TLS 1.2 minimum · mutual TLS for partners with client certificates
   endpoint types     edge-optimized (CloudFront in front) · regional · private (inside a VPC)

═══ monitor ═══
── CloudWatch metrics the office keeps:
   Count=6 · 4XXError=2 · 5XXError=2 · CacheHitCount=1 · CacheMissCount=2
── access log (one JSON line per request — you choose the fields):
   {'requestId': 'req-0001', 'stage': 'prod', 'httpMethod': 'GET', 'path': '/students/7', 'status': 200, 'principal': None, 'latencyMs': 42, 'integrationLatencyMs': 38}
   {'requestId': 'req-0002', 'stage': 'prod', 'httpMethod': 'GET', 'path': '/students/7', 'status': 200, 'principal': None, 'latencyMs': 4, 'integrationLatencyMs': 0}
   {'requestId': 'req-0003', 'stage': 'prod', 'httpMethod': 'GET', 'path': '/students/404', 'status': 404, 'principal': None, 'latencyMs': 42, 'integrationLatencyMs': 38}
   {'requestId': 'req-0004', 'stage': 'prod', 'httpMethod': 'GET', 'path': '/broken', 'status': 502, 'principal': None, 'latencyMs': 4, 'integrationLatencyMs': 0}
   {'requestId': 'req-0005', 'stage': 'prod', 'httpMethod': 'GET', 'path': '/report', 'status': 504, 'principal': None, 'latencyMs': 29004, 'integrationLatencyMs': 29000}
   {'requestId': 'req-0006', 'stage': 'prod', 'httpMethod': 'GET', 'path': '/teachers', 'status': 404, 'principal': None, 'latencyMs': 4, 'integrationLatencyMs': 0}
   Latency = whole trip; IntegrationLatency = the kitchen only; the gap is the office itself · X-Ray draws the path

═══ 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'}
   long jobs: accept → 202 + job id → poll or WebSocket/push · big files: pre-signed S3 URL, not through the API
── private API: reachable only through an interface VPC endpoint (execute-api) + a resource policy
── AWS WAF in front of REST APIs: SQL-injection rules, IP sets, rate-based rules
── cost (example, us-east-1): REST ~$3.50 per million requests, HTTP ~$1.00 per million — plus cache hours and data out

✅ done — the front office answered every lesson
🎒 धडा 01 पूर्वी: तुम्हाला फक्त Python 3 हवे — दुसरे काहीही नाही; AWS account नको, framework नको. हा lab API Gateway मधील REST API चे शिकवण्यासाठीचे मॉडेल आहे; त्याची JWT तपासणी HS256 वापरते म्हणून crypto library लागत नाही (खरे Cognito/OIDC tokens RS256 असतात, issuer च्या keys वापरून तपासले जातात). चांगले शेजारी: API शाळा (office मागचा API design करणे), IAM शाळा (SigV4 आणि roles) आणि VPC शाळा (private APIs आणि endpoints).

🗺️ संपूर्ण चित्र — एक आकृती, पूर्ण कोर्स

संपूर्ण कोर्स एका कॅनव्हासवर. 4K आवृत्तीसाठी क्लिक करा.

The big picture: the front office (why a gateway, REST vs HTTP vs WebSocket, routes and integrations, validation and mapping, stages, auth) and running it in production (throttling, caching, CORS, custom domains, monitoring, private APIs, WAF and limits)

🛎️ भाग 1 — front office (धडे 1–6)

एक git branch = एक कल्पना; branch 04 मध्ये धडे 01–04 आहेत. प्रत्येक उत्तर apigw/gateway.py मधून येते — AWS account लागत नाही.

1

🛎️ API gateway का

शाळेचे front office — प्रत्येक visitor तपासला जातो, मोजला जातो, लक्षात ठेवला जातो आणि पुढे पाठवला जातो; kitchen फक्त स्वयंपाक करते.lesson-01-why-gatewayधडा वाचा →आकृती पहा ↗
2

🧰 REST विरुद्ध HTTP विरुद्ध WebSocket APIs

front office चे तीन प्रकार — संपूर्ण संच, हलका आणि स्वस्त, आणि सतत चालू राहणारी फोन लाइन.lesson-02-rest-http-websocketधडा वाचा →आकृती पहा ↗
3

🗺️ Routes आणि integrations

कोणता desk कोणत्या visitor ला घेतो — path params, {proxy+}, सर्वात नेमका route जिंकतो, आणि office कुठे पुढे पाठवते.lesson-03-routes-integrationsधडा वाचा →आकृती पहा ↗
4

📝 Validation आणि mapping

kitchen ला दिसण्याआधीच चुकीचा अर्ज नाकारा, आणि बाहेर जाताना उत्तराचा आकार बदला.lesson-04-mapping-validationधडा वाचा →आकृती पहा ↗
5

🎭 Stages आणि deployments

रंगीत तालीम आणि खरा प्रयोग — snapshots, stage variables, आणि deploy करेपर्यंत काहीही live नसते.lesson-05-stages-deploymentsधडा वाचा →आकृती पहा ↗
6

🔐 आत कोण येऊ शकतो

IAM, JWT (Cognito किंवा कोणताही OIDC issuer) आणि Lambda authorizers — आणि API key म्हणजे authentication का नाही.lesson-06-authधडा वाचा →आकृती पहा ↗

🚦 भाग 2 — production मध्ये चालवणे (धडे 7–12)

खऱ्या API ला त्याच्या gateway कडून काय हवे: मर्यादा, caching, CORS, स्वतःचे domain, monitoring आणि कठोर मर्यादांची माहिती.

7

🚦 Throttling आणि usage plans

दारावरचा token bucket — प्रत्येक stage साठी, प्रत्येक client साठी rate आणि burst, आणि दैनिक quota; 429 म्हणजे सावकाश.lesson-07-throttlingधडा वाचा →आकृती पहा ↗
8

📌 Caching

सूचना फलक — TTL संपेपर्यंत kitchen ला न विचारता त्याच प्रश्नाचे उत्तर द्या.lesson-08-cachingधडा वाचा →आकृती पहा ↗
9

🌐 CORS

browser आधी परवानगी विचारतो — preflight, Allow-* headers, आणि CORS browsers चे संरक्षण करते, तुमच्या API चे नाही हे का.lesson-09-corsधडा वाचा →आकृती पहा ↗
10

🏷️ Custom domains आणि TLS

कोणत्याही यादृच्छिक नावाऐवजी api.school.example — certificates, base paths, endpoint types आणि mutual TLS.lesson-10-custom-domainsधडा वाचा →आकृती पहा ↗
11

📈 Monitoring

Count, 4XXError, 5XXError, Latency विरुद्ध IntegrationLatency, access logs आणि X-Ray — वेळ आणि errors कुठून येतात.lesson-11-monitoringधडा वाचा →आकृती पहा ↗
12

🛡️ Private APIs, WAF, मर्यादा आणि खर्च

कठोर मर्यादा — 29-second timeout, 10 MB payloads, private APIs, WAF rules आणि bill.lesson-12-private-waf-limitsधडा वाचा →आकृती पहा ↗
🗣️ हे मोठ्याने समजावून सांगा — धडा 12 नंतर: (1) /students/me हा /students/{id} वर का जिंकतो? (2) JWT authorizer कोणत्या चार गोष्टी तपासतो, आणि प्रत्येक अपयशावर कोणता status परत येतो? (3) API key म्हणजे authentication का नाही? (4) burst 5 असलेल्या stage वर एकाच वेळी आठ requests येतात — काय होते आणि का? (5) Latency 420 ms आणि IntegrationLatency 400 ms आहे — वेळ कुठे जात आहे? (6) एका report ला 45 seconds लागतात — तुम्ही काय बदलाल?
🎓 त्याच शाळेतून: API · IAM · VPC · NAT · AWS — तेच उपमांचे विश्व, तीच branch-by-branch पद्धत.

📐 धड्यांच्या आकृत्या — क्रमांक अनुसरा

प्रत्येक धडा एका क्रमांकित बॉक्स-आणि-बाण आकृतीत — स्वतंत्र पानावरही.

1 🛎️ API gateway का

शाळेचे front office — प्रत्येक visitor तपासला जातो, मोजला जातो, लक्षात ठेवला जातो आणि पुढे पाठवला जातो; kitchen फक्त स्वयंपाक करते.

🧒 सोप्या शब्दांत

शाळेत येणारे पाहुणे थेट kitchen मध्ये जात नाहीत. ते आधी front office मध्ये थांबतात. Office ते कोण आहेत ते तपासते, त्यांना मोजते, नेहमीची उत्तरे लक्षात ठेवते आणि प्रत्येकाला योग्य खोलीत पाठवते. Kitchen फक्त स्वयंपाक करते. तुमच्या APIs साठी API Gateway हेच front office आहे.

📖 नवे शब्दAPI Gateway — तुमच्या services समोर उभे राहून प्रत्येक request आधी हाताळणारे AWS चे front officerequest — program पाठवतो तो एक प्रश्न, जसे GET /students/7backend — office मागचे kitchen जे खरे काम करते, जसे Lambda functionstatus code — प्रत्येक उत्तरातला आकडा: 200 म्हणजे ठीक, 404 म्हणजे सापडले नाही404 — कोणताही desk path शी जुळला नाही तेव्हाचे office चे उत्तर, जसे /teachers
1🛎️ प्रत्येक visitor साठी एकच front office — ते तपासते, मोजते, लक्षात ठेवते आणि पुढे पाठवते; kitchens फक्त स्वयंपाक करतातvisitors counter वर रांगेत उभे आहेतschool.exampleएक browser pagephone appभागीदाराचा server(x-api-key)GET /students/7POST /marksGET /partner/…🛎️ FRONT OFFICE · school-api✔ तपासतेतुम्ही कोण? badge,token, key (L6)🔢 मोजतेएकाच वेळी खूप जास्त?→ 429 (L7)📌 लक्षात ठेवतेआधी विचारले? ते फलकावरूनवाचा (L8)➡ पुढे पाठवतेहा route कोणतेkitchen घेते? (L3)मागे kitchens — ती फक्त स्वयंपाक करतातλget_studentLambda · GET /students/{id}files सेवाcontainer · /files/{proxy+}marks tableDynamoDB · POST /marksकोणतेही kitchen auth, limits, logs किंवा TLS पुन्हा करत नाही2📨 दोन खरे visitors — python3 apigw/demo.py whyGET /students/7officeλ200id 7Aishwarya8B200 {id: 7, name: Aishwarya, class: 8B} X-Cache: MissGET /teachersoffice404λ404 Not Found — office उत्तर देते; कोणत्याही kitchen ला त्रास नाही3🧰 याशिवाय, प्रत्येक kitchen तोच संच बांधते3 kitchens × 4 साधने = 12प्रती ज्या sync मध्ये ठेवाव्या लागतातofficeएक office × 4 tools = 4kitchens साधी राहतातauth 🔒 · limits 🪙 · logs 📄 · TLS/config ⚙
⏪ आधी

प्रत्येक kitchen स्वतःच badges तपासत, visitors मोजत आणि स्वतःचे logs लिहीत असे, आणि प्रत्येकाची पद्धत थोडी वेगळी होती.

💡 काय

API Gateway म्हणजे शाळेचे front office: ते प्रत्येक visitor ला तपासते, मोजते, लक्षात ठेवते आणि पुढे पाठवते; kitchen फक्त स्वयंपाक करते.

⚙️ कसे

GET /students/7 ला Aishwarya, class 8B सह 200 मिळतो; GET /teachers ला office कडूनच 404 Not Found, कोणत्याही kitchen ला न विचारता.

🎯 का

Auth, limits, logging आणि TLS एकाच जागी राहतात, त्यामुळे प्रत्येक kitchen लहान राहते आणि प्रत्येक दार तेच नियम पाळते.

🚀 पुढे

पुढचा धडा तीन प्रकारची front offices दाखवतो: REST (पूर्ण साहित्य), HTTP (हलके आणि स्वस्त) आणि WebSocket (उघडी राहणारी line).

🧪 इथे करून पाहा — एका visitor ला front office मधून पाठवा — तो ज्या ज्या desk वरून जातो ते पाहा (दोनदा पाठवा: दुसरा GET फलकावरून वाचला जातो)

संपूर्ण धडा 01 वाचा →

2 🧰 REST विरुद्ध HTTP विरुद्ध WebSocket APIs

front office चे तीन प्रकार — संपूर्ण संच, हलका आणि स्वस्त, आणि सतत चालू राहणारी फोन लाइन.

🧒 सोप्या शब्दांत

मोठ्या शाळेत सगळी साधने असलेले पूर्ण office असते: शिक्के, files, सूचना फलक आणि पहारेकरी. लहान शाळेत मूलभूत काम करणारा हलका desk असतो, ज्याचा खर्च कमी असतो. काही पाहुण्यांना चालूच राहणारी phone line हवी असते, म्हणजे दोन्ही बाजू कधीही बोलू शकतात. API Gateway तिन्ही देते: REST, HTTP आणि WebSocket.

📖 नवे शब्दREST API — पूर्ण साहित्याचे office: API keys, usage plans, caching, validation, WAF आणि private APIsHTTP API — JWT आणि CORS आधीच असलेले हलके, स्वस्त officeWebSocket API — उघडी राहणारी line, त्यामुळे server सुद्धा आधी बोलू शकतो$connect — caller line वर पहिल्यांदा येतो तेव्हा चालणारा WebSocket route
1🧰 front office चे तीन प्रकार — सवयीने नव्हे, तुम्हाला काय हवे त्यानुसार निवडाREST APIसंपूर्ण संचHTTP APIहलका आणि स्वस्तWebSocket APIसतत चालू राहणारी फोन लाइनRESTkeys + usage plans · cache · तपासणी (validation)mapping templates · WAF · private APIs~$3.50 प्रति दहा लाख requestsHTTPकमी भाग,कमी bill,कमी latencyJWT authorizer अंगभूत · CORS एकाचsetting मध्ये · Lambda + HTTP proxy~$1.00 प्रति दहा लाख requestsWSजोडलेले राहतेदोन्ही बाजू बोलू शकतात$connect · $disconnect · $defaultmessage मधील field नुसार route करते(route selection: $request.body.action)प्रति message + connection minute2✅ प्रत्येक office काय करू शकते (demo.py kinds)RESTHTTPAPI keys + usage plans (धडा 7)stage cache — सूचना फलक (L8)request validation (L4)mapping templates (L4)~AWS WAF जोडलेले (L12)VPC मधील private endpoint (L12)JWT authorizer अंगभूत (L6)~CORS एकाच setting मध्ये (L9)~Lambda + HTTP proxy integrations~ = अंशतः: HTTP मध्ये फक्त parameter mapping आहे; REST JWT हे Cognito किंवा Lambda authorizer मार्फत करते3📞 एक WebSocket संभाषणWS$connect (एकदा)इथे authorize करा{"action":"marks", …}route key → marks routePOST @connections/{id}server push करतो{"action":"ping"}जुळणी नाही → $default$disconnectसाफसफाई
⏪ आधी

प्रत्येक कामासाठी एकच प्रकारचे office म्हणजे service फक्त Lambda कडे पाठवत असली तरी पूर्ण साहित्याचे पैसे भरणे.

💡 काय

API Gateway ची तीन offices: सगळी साधने असलेले REST, हलके आणि स्वस्त HTTP, आणि WebSocket, म्हणजे चालूच राहणारी phone line.

⚙️ कसे

REST देते API keys, usage plans, caching आणि WAF; HTTP मध्ये JWT आणि CORS आधीच असतात; WebSocket $connect आणि $disconnect वर route करते.

🎯 का

योग्य प्रकार निवडला की पैसे वाचतात: त्याच forwarding साठी HTTP API ला ~$1.00 प्रति million requests, REST ला ~$3.50.

🚀 पुढे

पुढचा धडा office ला desks देतो: /students/{id}, {proxy+} सारखे routes, आणि प्रत्येक visitor कुठे पाठवायचा ते.

🧪 इथे करून पाहा — तुम्हाला काय हवे ते tick करा — कोणते front office जुळते, आणि एका महिन्याचा खर्च किती?
30

पूर्ण धडा 02 वाचा →

3 🗺️ Routes आणि integrations

कोणता desk कोणत्या visitor ला घेतो — path params, {proxy+}, सर्वात नेमका route जिंकतो, आणि office कुठे पुढे पाठवते.

🧒 सोप्या शब्दांत

Office मध्ये अनेक desks असतात, प्रत्येकावर पाटी: students, files, marks. 'माझी स्वतःची नोंद' मागणारा पाहुणा विद्यार्थी क्रमांकांच्या desk कडे नाही, खास 'me' desk कडे जातो. 'files मधले बाकी सगळे' असे लिहिलेला desk कोणताही folder path घेतो. पाटी आहे पण तिथे परवानगी नसलेले काम मागितले, जसे delete, तर clerk 405 ने नाही म्हणतो.

📖 नवे शब्दroute — एक desk: एक method अधिक एक path, जसे GET /students/{id}path parameter — path मधली रिकामी जागा, जसे {id}, जी visitor भरतो, उदा. 7{proxy+} — path चा उरलेला सगळा भाग घेणारी रिकामी जागा, जसे term1/maths/paper.pdfintegration — office visitor ला कुठे पाठवते ते: Lambda, HTTP backend, AWS service किंवा mock405 — path आहे, पण त्या method साठी नाही
1🗺️ route चा फलक — school-api (demo.py office())/students{id}meगुणfiles{proxy+}शिक्षक कक्षअहवालबिघडलेलेभागीदारstudents{id}GETλ get_student · cache · phone लपवतोGETJWT → {you: sub}POSTJWT + scope marks:write + schemaGETgreedy: path चा उरलेला भागGETLambda authorizer (शिक्षकांचा badge)GETkitchen ला 31 s लागतात → 504GETkitchen कोसळते → 502GETx-api-keyएक resource = path ची एक पातळी · त्यावरची एक method = एक route2🧭 visitor ला कोणता desk घेतोGET /students/9→ /students/{id}id = 9 → कतरिना · 9A200GET /students/me→ /students/meठरलेला शब्द {id} वर मात करतो → teacher-42200GET /files/term1/maths/paper.pdf→ /files/{proxy+}proxy = term1/maths/paper.pdf → ती file200DELETE /students/9→ path सापडला, पण DELETE नाहीMethod Not Allowed405सर्वात नेमका जिंकतो: score = (slashes − 10 × greedy, −braces)/students/me (2, 0) हा /students/{id} (2, −1) वर मात करतो/files/{proxy+} (−8, −1) — दुसरे काहीच जुळत नसेल तेव्हाच3🍳 integrations — office visitor ला कुठे पुढे पाठवतेλLambda proxyसंपूर्ण request एक event म्हणून आत जाते;function status + body परत करतेget_student(event) → 200HTTP backendकोणत्याही URL वर पुढे पाठवा — एक container,एक EC2 box, दुसरीकडचा एखादा serverhttps://files.internal/{proxy}AWS serviceservice ला थेट बोलवा — code नाही:SQS SendMessage, S3, DynamoDBAction=SendMessageMOCKपुठ्ठ्याचाकारकूनMockoffice स्वतःच उत्तर देते —kitchen मध्ये अजून कोणीच नाही200 {"status":"ok"}
⏪ आधी

Routes शिवाय एकच handler प्रत्येक URL हाताने वाचत असे, आणि /students/me ला 'me' नावाचा विद्यार्थी समजले जाऊ शकत असे.

💡 काय

Route म्हणजे desk: method अधिक path. सर्वात नेमका desk जिंकतो, आणि integration सांगते visitor कोणत्या kitchen कडे जाईल.

⚙️ कसे

/students/me हा /students/{id} वर जिंकतो, /files/{proxy+} term1/maths/paper.pdf पकडतो, आणि DELETE /students/9 ला 405 मिळतो.

🎯 का

स्पष्ट desks म्हणजे स्पष्ट उत्तरे: कोणताही path जुळला नाही तर 404, path आहे पण ती method नाही तर 405.

🚀 पुढे

पुढचा धडा office ला counter वरच forms तपासायला लावतो, आणि बाहेर जाणाऱ्या उत्तरातून खाजगी fields काढायला लावतो.

🧪 इथे करून पाहा — एक method आणि एक path लिहा — कोणता route जिंकतो, आणि params मध्ये काय येते?

पूर्ण धडा 03 वाचा →

4 📝 Validation आणि mapping

kitchen ला दिसण्याआधीच चुकीचा अर्ज नाकारा, आणि बाहेर जाताना उत्तराचा आकार बदला.

🧒 सोप्या शब्दांत

Counter वर clerk तुमचा form kitchen कडे जाण्याआधी वाचतो. Mark चा रकाना रिकामा असेल किंवा आकड्याऐवजी शब्द असतील, तर form लगेच तुमच्याकडे परत येतो. बाहेर जाताना clerk उत्तर देण्याआधी विद्यार्थ्याचा phone number सारख्या खाजगी गोष्टी झाकतो.

📖 नवे शब्दvalidation — backend ला दिसण्याआधी request नियमांनुसार तपासणेschema — form चे नियम: कोणते fields आवश्यक आहेत आणि प्रत्येकाचा type काय400 — Bad Request: form चुकीचा होता, जसे 'mark' नसणेmapping template — request किंवा response नव्याने मांडणारी कृती, जसे phone field काढणे
1📝 चुकीचा अर्ज counter वरच 400 ने अडवला जातो — kitchen ला तो कधी दिसत नाही, त्याचे bill ही लागत नाहीPOST /marksविद्यार्थी"7"subject"maths"गुण(गहाळ)नाकारले 400आवश्यक field 'mark' गहाळ आहे400visitor कडे परतPOST /marksविद्यार्थी"7"subject"maths"गुण"ninety"नाकारले 400'mark' int असायलाच हवा400visitor कडे परतPOST /marksविद्यार्थी"7"subject"maths"गुण91स्वीकारले 201जतन केले → table marks-prodया दोघांसाठी kitchen ला बोलावणे: 0marks tableadd_mark(event)stage var table=marks-prodschema = { "required": ["student", "subject", "mark"], "types": {"mark": int}}office ज्याच्याशी तपासते ते modelखरे REST APIs: method वर एक request validator + एक JSON-schema model; HTTP APIs मध्ये यापैकी काहीच नाही2✂️ response mapping — kitchen phone number देऊन टाकते, office बाहेर जाताना तो कापून टाकतेλget_studentGET /students/7{"id": "7", "name": "Aishwarya", "class": "8B", "phone": "98xxxxxx12"}kitchen काय परत करतेmapping: hide_phonekey "phone" काढून टाका"phone": "98xx…"{"id": "7", "name": "Aishwarya", "class": "8B"}visitor ला काय मिळते200 · X-Cache: MissREST: request आणि response वर mapping templates (VTL) · HTTP APIs: headers आणि paths साठी parameter mapping
⏪ आधी

चुकीचे forms थेट kitchen कडे जात, ते जागे होऊन राहिलेल्या field मुळे अपयशी ठरत असे, आणि तरीही त्या call चे bill लागत असे.

💡 काय

Validation चुकीचा form counter वरच नाकारते; mapping बाहेर जाणारे उत्तर नव्याने मांडते, जसे phone number काढून टाकणे.

⚙️ कसे

'mark' नसलेल्या POST /marks ला kitchen ला न विचारताच 400; kitchen phone 98xxxxxx12 परत देते आणि office तो काढून टाकते.

🎯 का

Kitchen ला फक्त स्वच्छ input दिसतो, खाजगी fields चुकून बाहेर जात नाहीत, आणि नाकारलेल्या calls चा त्याला काहीच खर्च नाही.

🚀 पुढे

पुढचा धडा खऱ्या प्रयोगाआधी तालीम करतो: dev आणि prod stages, stage variables, आणि snapshot deploy करणे.

🧪 इथे करून पाहा — POST /marks चा अर्ज भरा आणि जमा करा — मग phone लपवणारे mapping बंद-चालू करून पाहा

पूर्ण धडा 04 वाचा →

5 🎭 Stages आणि deployments

रंगीत तालीम आणि खरा प्रयोग — snapshots, stage variables, आणि deploy करेपर्यंत काहीही live नसते.

🧒 सोप्या शब्दांत

वार्षिक दिवसाआधी वर्ग सरावाच्या stage वर तालीम करतो, मग खऱ्या stage वर प्रयोग करतो. प्रेक्षकांना काय दिसेल ते शिक्षक 'ही आवृत्ती अंतिम' म्हणतात तेव्हाच ठरते. सरावाचा stage marks सरावाच्या वहीत लिहितो, खरा stage खऱ्या वहीत. कधीच तयार न केलेला stage तुम्हाला परत पाठवतो.

📖 नवे शब्दstage — API ची नाव असलेली प्रत, जसे dev किंवा prod, स्वतःच्या settings सहdeployment — API चा snapshot; deploy केल्यानंतरच बदल live होतातstage variable — प्रत्येक stage साठी वेगळी असणारी value, जसे table marks-dev किंवा marks-prodcanary — आधी थोडा भाग, जसे prod चे 10%, नव्या deployment कडे पाठवणे
1🎭 एक API, अनेक stages — प्रत्येक आपापले deployment सादर करतो, स्वतःचे variables, limits आणि cache घेऊनdev — रंगीत तालीमstage variablestable = marks-devrate 5/s · burst 5cache बंद (ttl 0)POST /marks201table 'marks-dev'prod — खरा प्रयोगstage variablestable = marks-prod10,000 rps · burst 5,000cache 300 sPOST /marks201table 'marks-prod'test — असा कोणताही stage नाहीबंदdeploy केलेले नाहीPOST /marks403Forbiddenpython3 apigw/demo.py stages → dev 201 marks-dev · prod 201 marks-prod · test 403 {"message": "Forbidden"}URL मध्येच stage असतो: https://abc123.execute-api.ap-south-1.amazonaws.com/prod/marks · kitchen event["stageVariables"]["table"] वाचतेतोच code, तेच routes — कोणते table, कोणते limits आणि कोणता cache हे फक्त stage ठरवतो2📸 deployment म्हणजे एक snapshot — deploy करेपर्यंत काहीही live नसतेdep-1सोमवारdep-2बुधवारdep-3आजprod →dev →$ aws apigateway create-deployment \ --rest-api-id abc123 --stage-name prod# route बदला → हे चालेपर्यंत जुनाच प्रयोग सुरू राहतो3🐤 canary — 10% जण नवा प्रयोग पाहतात90% → dep-210% → dep-3prod stage · canarySettings percentTraffic 10canary वर 5XXError लक्ष ठेवा — मग त्याला100% वर promote करा, किंवा delete करा आणि कोणाला कळलेही नाही
⏪ आधी

बदल थेट चालू API वर जात, त्यामुळे एखादा test बदल सगळ्यांसमोर खऱ्या marks table मध्ये लिहू शकत असे.

💡 काय

Stage म्हणजे नाव असलेला प्रयोग, जसे dev किंवा prod; deployment म्हणजे snapshot, आणि deploy केल्याशिवाय काहीच live होत नाही.

⚙️ कसे

तोच POST /marks stage dev वर marks-dev मध्ये आणि prod वर marks-prod मध्ये लिहितो; stage test कधी deploy झालाच नाही, म्हणून 403.

🎯 का

Dev वर सुरक्षित तालीम होते, प्रत्येक stage चे स्वतःचे variables, limits आणि cache असतात, आणि canary prod चे 10% नव्या code कडे पाठवतो.

🚀 पुढे

पुढचा धडा विचारतो आत कोण येऊ शकतो: JWT, IAM आणि Lambda authorizers, आणि API key म्हणजे authentication का नाही.

🧪 इथे करून पाहा — बदला, deploy करा, आणि पाठवा — stage वर deploy करेपर्यंत त्यावर काहीही live नसते

पूर्ण धडा 05 वाचा →

6 🔐 आत कोण येऊ शकतो

IAM, JWT (Cognito किंवा कोणताही OIDC issuer) आणि Lambda authorizers — आणि API key म्हणजे authentication का नाही.

🧒 सोप्या शब्दांत

दारावर पाहुणा badge दाखवतो. पहारेकरी तपासतो की तो खरा आहे, मुदत संपलेली नाही, आणि दुसऱ्या शाळेसाठी नाही तर याच शाळेसाठी बनवलेला आहे. योग्य badge ने आत जाता येते; विद्यार्थ्याच्या badge ने marks च्या वहीत लिहिता येत नाही. पाहुण्याचा pass number फक्त तुम्ही कोणत्या गटासोबत आलात ते सांगतो, तुम्ही कोण ते नाही, म्हणून तो कशाचाच पुरावा नाही.

📖 नवे शब्दauthorizer — backend चालण्याआधी caller ला तपासणारा counter वरचा पहारेकरीJWT — Cognito किंवा दुसऱ्या OIDC issuer ने सही केलेला badge, issuer, audience, expiry आणि scope सह401 — Unauthorized: badge नाही, किंवा बनावट, expired किंवा दुसऱ्या app चा badge403 — Forbidden: तुम्ही कोण ते माहीत आहे, पण तुम्हाला हे करता येत नाहीLambda authorizer — निर्णय घेणारा तुमचा स्वतःचा code, जसे badge-T-42 स्वीकारणेAPI key — कोणता client call करतोय ते सांगणारे लेबल; कोण आहे याचा पुरावा नाही
1🔐 JWT authorizer badge चार प्रकारे तपासतो — मग route एखादा scope मागू शकतोteacher-42JWT · Beareriss https://login.school.exampleaud school-apisub teacher-42exp now + 3600 sscope marks:readAuthorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJpc3Mi….9Jf2kheaderpayload (claims)सही1 signatureissuer च्या key ने बनवला? (AWS मध्ये RS256 + JWKS; इथे HS256)2 issueriss = https://login.school.example3 audienceaud मध्ये school-api आहे — दुसरे app नाही4 expiryexp अजून भविष्यात आहे200{'you': 'teacher-42'}GET /students/me5 scope (फक्त मागणाऱ्या routes वर) — POST /marks ला marks:write हवाहा badge marks:read सांगतो → 403 needs scope marks:writeतपासण्या 1–4 पैकी कोणतीही चुकली → 401 Unauthorized (तुम्ही कोण?) · तपासणी 5 चुकली → 403 Forbidden (मी तुम्हाला ओळखतो, पण नाही)kitchen ला event["principal"] = teacher-42 मिळते — ते स्वतः कधीच token parse करत नाहीHTTP APIs: JWT authorizer आधीच असतो · REST APIs: Cognito user-pool authorizer किंवा Lambda authorizer2🚫 office ने परत पाठवलेले पाच badges (python3 apigw/demo.py auth)(रिकामा हात)401token नाहीtoken नाहीJWT · Beareriss login.school…sig …9Jabc ✗sub teacher-42401बनावटचुकीची signatureJWT · Beareriss login.school…exp now − 1 ssub x401मुदत संपलेलामुदत संपलेलाJWT · Beareriss login.school…aud library-apisub x401दुसऱ्या app चा tokenचुकीचा audienceJWT · Beareriss login.school…scope marks:readsub teacher-42403फक्त वाचण्याचा scopescope marks:write लागतो3🧑‍✈️ Lambda authorizerbadge == T-42?badge-S-1403badge-T-42200तुमचा स्वतःचा code ठरवतो → allow + principalteacher-42 · deny → 403 "User is notauthorized to access this resource"4✍️ IAM auth (SigV4)सही केलेली200AWS मधील callers साठी: एक rolerequest वर सही करतो; IAM route वर execute-api:Invokeतपासते — वाटायला कोणतेही tokens नाहीत5🏷️ API key म्हणजे auth नाहीkey-partner-1कोणता client ते सांगतेकोण call करत आहे ते नाहीkey-stolen → 403फुटलेली खरी key → कोणालाही 200keys usage plans + quotas साठी वापरा (L7);आणि समोर खरा authorizer सुद्धा ठेवा
⏪ आधी

प्रत्येक kitchen स्वतःच tokens वाचत असे, काही expiry तपासायला विसरत, आणि काही API key ने तुम्ही कोण आहात हे सिद्ध होते असे मानत.

💡 काय

Authorizer counter वरच visitor चा badge तपासतो: JWT, IAM SigV4, किंवा तुमचा स्वतःचा Lambda code. API keys म्हणजे auth नाही.

⚙️ कसे

Token नाही, बनावट, expired किंवा चुकीचा audience: 401; योग्य JWT: 200; read-only scope ने marks लिहिले: 403; badge-T-42: 200.

🎯 का

एकच तपासलेली check प्रत्येक route चे रक्षण करते, आणि 401 की 403 हे caller ला सांगते: login करा, की जास्त अधिकार मागा.

🚀 पुढे

पुढचा धडा दारावर token bucket ठेवतो: प्रत्येक stage साठी rate आणि burst, प्रत्येक client साठी usage plans, आणि 429.

🧪 इथे करून पाहा — badge बनवा, दार निवडा, पाठवा — authorizer आपल्या तपासण्या क्रमाने चालवतो

पूर्ण धडा 06 वाचा →

7 🚦 Throttling आणि usage plans

दारावरचा token bucket — प्रत्येक stage साठी, प्रत्येक client साठी rate आणि burst, आणि दैनिक quota; 429 म्हणजे सावकाश.

🧒 सोप्या शब्दांत

Canteen च्या दारावर tokens ची बरणी असते. प्रत्येक पाहुणा आत जाण्यासाठी एक token घेतो, आणि बरणी दर सेकंदाला काही tokens ने भरते. आठ मुले एकदम आली आणि बरणीत पाचच असतील, तर तिघांना 'थांबा आणि पुन्हा प्रयत्न करा' सांगितले जाते. भागीदार शाळेला स्वतःची लहान बरणी मिळते, म्हणून ती मोठी बरणी रिकामी करू शकत नाही.

📖 नवे शब्दthrottling — callers किती वेगाने requests पाठवू शकतात यावर मर्यादाrate — bucket दर सेकंदाला किती tokens भरतो, जसे 5burst — अचानक गर्दीसाठी bucket किती tokens धरू शकतो, जसे 5429 — Too Many Requests: वेग कमी करा आणि थोड्या वेळाने पुन्हा प्रयत्न कराusage plan — x-api-key header वरून ओळखली जाणारी प्रत्येक client ची मर्यादा आणि रोजचा quota
1🪣 दारावरची token bucket — stage dev: burst 5, दर सेकंदाला 5 ने भरतेपुन्हा भरणे: rate = 5 tokens / s(burst पेक्षा कधीच जास्त नाही)burst = 5 = bucket चा आकारएकाच क्षणी 8 requests12345678प्रत्येक जण एक token घेतोtoken उरला नाही → 429, kitchen ला कधीच बोलावले जात नाहीGET /students/7 stage=devt = 0 s200200200200200429429429t = 1 s2002002002002004295 tokens, 8 मागण्या1 s मध्ये 5 पुन्हा भरले, 6 मागण्या2📈 bucket मधील tokens0123450 s0.5 s1 s3 × 4291 × 4295 / s ने पुन्हा भरत आहेtokens = min(burst, tokens + elapsed × rate)request ला ≥ 1 token लागतो (gateway.py TokenBucket)3🧱 limits एकावर एक रचल्या जातात — मार्गातील सर्वात लहान bucket ठरवतेaccount · प्रत्येक Region10,000 rps · burst 5,000AWS चा default quotastage prod10,000 rps · burst 5,000dev: 5 rps · burst 5usage plan partner-basic2 rps · burst 2quota 1,000 / दिवसप्रत्येक method (ऐच्छिक)उदा. POST /marksstage वर सेट केलेलेx-api-key: key-partner-1200200429429x-api-key: key-stolen403अनोळखी keyquota संपला → 429"Limit Exceeded"429 Too Many Requests = "हळू जा" — front office kitchen चे रक्षण करत आहेclients exponential backoff + jitter सह पुन्हा प्रयत्न करतात: 0.1 s, 0.2 s, 0.4 s … थांबा, शिवाय थोडा random वेळ, म्हणजे सगळे एकत्र परत येत नाहीतpython3 apigw/demo.py throttle → 200 200 200 200 200 429 429 429 · one second later 200 200 200 200 200 429 · partner 200 200 429 429
⏪ आधी

URL माहीत असलेला कोणीही हवे तितक्या वेगाने call करू शकत असे, आणि एका गोंगाटी client मुळे सगळ्यांसाठी kitchen भरून जात असे.

💡 काय

दारावरचा token bucket burst इतके tokens धरतो आणि दर सेकंदाला rate इतके भरतो; token उरला नाही की उत्तर 429.

⚙️ कसे

Stage dev: rate 5, burst 5; एकदम आठ requests ला 200 x5 मग 429 x3; partner-basic ला 200 200 429 429, अनोळखी key ला 403.

🎯 का

गर्दीतही kitchen सुरक्षित राहते, आणि account च्या 10,000 rps default ऐवजी प्रत्येक partner ला स्वतःचा योग्य वाटा मिळतो.

🚀 पुढे

पुढचा धडा उत्तरे सूचना फलकावर लावतो: stage cache, त्याचा TTL, आणि Hit व Miss म्हणजे काय.

🧪 इथे करून पाहा — token bucket वर requests सोडा — rate, burst आणि घड्याळ सेट करा
558

पूर्ण धडा 07 वाचा →

8 📌 Caching

सूचना फलक — TTL संपेपर्यंत kitchen ला न विचारता त्याच प्रश्नाचे उत्तर द्या.

🧒 सोप्या शब्दांत

अनेक मुले office ला विचारतात 'Aishwarya चा वर्ग कोणता?'. पहिल्यांदा clerk kitchen ला विचारतो आणि उत्तर सूचना फलकावर लावतो. पुढची पाच मिनिटे सगळे फलक वाचतात, आणि kitchen ला त्रास होत नाही. वेळ संपला की चिठ्ठी काढली जाते आणि पुढचा प्रश्न पुन्हा kitchen कडे जातो.

📖 नवे शब्दcache — office अलीकडची उत्तरे ठेवते तो सूचना फलकTTL — उत्तर फलकावर किती वेळ राहते ते, जसे 300 secondsHit — उत्तर फलकावरून आले; kitchen ला विचारले नाहीMiss — फलकावर ताजे काही नव्हते, म्हणून kitchen ला विचारलेcache key — दोन प्रश्न 'सारखे' कशाने ठरतात: method, path आणि निवडलेले headers
1📌 सूचना फलक — front office kitchen चे उत्तर फलकावर लावते आणि TTL संपेपर्यंत तेच वाचून दाखवतेschool.exampleGET /students/7front officeTTL 300 s(default · 0–3600)GET /students/7{id 7, Aishwarya, 8B}+0 s ला लावले+300 s ला मुदत संपतेGET/students/9stage devttl 0 = फलक नाहीkey = stage + method+ path + queryλget_studentफक्त Miss झाल्यावरचविचारले जातेHit → X-Cache: Hit, फलकावरून उत्तर, IntegrationLatency 0 · Miss → kitchen ला विचारा, उत्तर फलकावर लावा, X-Cache: Missफक्त cache=True असलेले GET routes, फक्त 200 उत्तरे फलकावर लागतात · CloudWatch CacheHitCount आणि CacheMissCount मोजतेखरा stage cache हा एक आकार आहे ज्यासाठी तासाला पैसे मोजावे लागतात (0.5 GB … 237 GB) — फलक फुकट नाही2⏱️ python3 apigw/demo.py cache — चार भेटी, kitchen ला दोन calls0 s100 s200 s300 s400 s500 sफलकावरची चिठ्ठी (TTL 300 s)फलक रिकामा — मुदत संपलीनवी चिठ्ठी+0 s · 200 Miss · kitchen ला विचारले 1+10 s · 200 Hit · kitchen ला विचारले 1+200 s · 200 Hit · kitchen ला विचारले 1+301 s · 200 Miss · kitchen ला विचारले 2प्रत्येक उत्तरावर X-Cache header · दुसरा Miss पुन्हा kitchen ला विचारतो आणि नवी चिठ्ठी लावतोवेळा बेरीज होतात: 0 → 10 → 210 → 511 s · 511 ला 0 s ची चिठ्ठी केव्हाच संपली होती (ती 300 पर्यंत टिकली)3🔑 cache ची key('prod', 'GET', '/students/7', ())?term=1 → वेगळी key → वेगळी चिठ्ठीheaders किंवा query strings key मध्ये तेव्हाच जोडा जेव्हाउत्तर खरोखर त्यांच्यानुसार बदलते4⚠️ एका user चे उत्तर shared key वर कधीच लावू नकाGET /students/me{you: teacher-42}Aishwaryateacher-42 चेउत्तर फलकावरून वाचतोप्रत्येक user चे routes: cache नको, किंवा caller ला key मध्ये जोडा
⏪ आधी

प्रत्येक सारखा प्रश्न kitchen आणि database कडे जात असे, उत्तर कितीतरी मिनिटे बदलले नसले तरी.

💡 काय

Cache म्हणजे सूचना फलक: office उत्तर फलकावर लावते आणि TTL संपेपर्यंत kitchen ला न विचारता तेच उत्तर देते.

⚙️ कसे

TTL 300 s: +0 s Miss, +10 s Hit, +200 s Hit, +301 s Miss; 4 requests साठी kitchen ला फक्त 2 वेळा विचारले.

🎯 का

Kitchen कडे कमी calls आणि जलद उत्तरे; फक्त प्रत्येक user ची वेगळी उत्तरे सगळ्यांच्या एकाच key खाली कधीच cache करू नका.

🚀 पुढे

पुढचा धडा आधी विचारणारा browser दाखवतो: OPTIONS preflight आणि CORS चे Allow-* headers.

🧪 इथे करून पाहा — विचारा, घड्याळ पुढे करा, पुन्हा विचारा — सूचना फलक आणि kitchen चा counter पाहा
300

पूर्ण धडा 08 वाचा →

9 🌐 CORS

browser आधी परवानगी विचारतो — preflight, Allow-* headers, आणि CORS browsers चे संरक्षण करते, तुमच्या API चे नाही हे का.

🧒 सोप्या शब्दांत

दुसऱ्या site वरचे web page शाळेच्या office शी बोलू इच्छिते. खरा प्रश्न पाठवण्याआधी browser आधी विचारतो: 'या site ला परवानगी आहे का?'. Office शाळेच्या स्वतःच्या site ला हो आणि अनोळखी site ला नाही म्हणते. Browser ते उत्तर पाळतो. Browser बाहेरचा program तर विचारतच नाही.

📖 नवे शब्दCORS — कोणत्या इतर sites ची pages तुमचा API call करू शकतात ते browser ला सांगणारे नियमorigin — page ज्या site वरून आले ती, जसे https://school.examplepreflight — खऱ्या request आधी browser पाठवतो तो OPTIONS प्रश्नAccess-Control-Allow-Origin — कोणत्या origin ला परवानगी आहे ते सांगणारा header204 — No Content: preflight ठीक आहे, पुढे चला
1🌐 browser आधी विचारतो — preflight, मग खरी request (python3 apigw/demo.py cors)school.exampleofficeλbrowser पानhttps://school.examplefront officeschool-api · prodkitchenget_student1OPTIONS /students/7Origin: https://school.example · Access-Control-Request-Method: GET2204Access-Control-Allow-Origin: https://school.exampleAccess-Control-Allow-Methods: GET,POST,PUT,DELETEAccess-Control-Allow-Headers: authorization,content-type,x-api-keyAccess-Control-Max-Age: 600preflight साठी kitchen नाही —front office एकटेच उत्तर देतेbrowser हा होकारMax-Age = 600 s पर्यंत लक्षात ठेवतो3GET /students/7 Origin: https://school.exampleपुढे पाठवा{id 7, Aishwarya, 8B, phone …}4200X-Cache: Miss · Access-Control-Allow-Origin: https://school.exampleपान उत्तर वाचू शकते2😈 दुसरी site प्रयत्न करतेevil.exampleofficeOPTIONS /students/7403"CORS origin not allowed"browser पानाची script थांबवतो —खरा GET कधीच पाठवला जात नाहीपरवानगी असलेले origins: फक्त https://school.exampleउत्तरावर Access-Control-Allow-Origin header नाही→ browser उत्तर पानापासून लपवतो3🧰 curl CORS कडे दुर्लक्ष करतो — ते तुमच्या API ला कुलूप नाही$ curl -i https://api.school.example/v1/students/7 \ -H "Origin: https://evil.example"HTTP/1.1 200 OKX-Cache: Hit{"id": "7", "name": "Aishwarya", "class": "8B"}CORS हे BROWSERS लागू करतात, ते वापरणाऱ्यालोकांच्या संरक्षणासाठी — scripts, curl आणि servers कधीच विचारत नाहीतअनोळखींना बाहेर ठेवायला auth (L6), keys + plans (L7), WAF (L12) वापरा
⏪ आधी

school.example वरच्या page ने API call केला आणि browser ने तो थांबवला, अशा error सह जी API team ला कधी दिसलीच नाही.

💡 काय

CORS म्हणजे कोणत्या इतर sites call करू शकतात हे office ने browser ला सांगणे; browser आधी OPTIONS preflight ने विचारतो.

⚙️ कसे

https://school.example कडून आलेल्या OPTIONS ला Allow-* headers सह 204; https://evil.example कडून आलेल्याला 403.

🎯 का

शाळेचे page चालते आणि इतर sites ची pages users च्या browsers मध्ये अडवली जातात; CORS browsers ला वाचवते, तुमच्या API ला नाही.

🚀 पुढे

पुढचा धडा office ला खरे नाव देतो: api.school.example, ACM certificate, base paths आणि TLS.

🧪 इथे करून पाहा — कोणत्यातरी origin वरचे पान API ला call करते — preflight होतो की नाही, आणि पान उत्तर वाचू शकते का?

पूर्ण धडा 09 वाचा →

10 🏷️ Custom domains आणि TLS

कोणत्याही यादृच्छिक नावाऐवजी api.school.example — certificates, base paths, endpoint types आणि mutual TLS.

🧒 सोप्या शब्दांत

पूर्वी office च्या दारावर कोणालाच लक्षात न राहणारा लांब यादृच्छिक code होता. आता तिथे नीट नावफलक आहे: api.school.example. Certificate हा फलक खरोखर शाळेचाच आहे हे सिद्ध करते. /v1 आणि /v2 या खोल्यांच्या पाट्या पाहुण्यांना जुन्या आणि नव्या offices कडे पाठवतात, आणि दोन्ही एकाच वेळी उघडी राहू शकतात.

📖 नवे शब्दcustom domain — API साठी तुमचे स्वतःचे नाव, जसे api.school.exampleACM — AWS Certificate Manager; edge-optimized APIs साठी certificate us-east-1 मध्येच हवेbase path mapping — domain वरचा path जो एका API आणि stage कडे जातो, जसे /v1 ते prodTLS — संवाद खाजगी ठेवणारे कुलूप; इथे किमान TLS 1.2mutual TLS — दोन्ही बाजू certificates दाखवतात, partners साठी वापरतात
1🏷️ दारावर नावाची पाटी — random नावाऐवजी api.school.exampleapi.school.example/v1/…https://api.school.example/v1/students/7Route 53api.school.example alias A/AAAA → d-7x2k.execute-api…DNS: फोनची डिरेक्टरीcustom domain nameapi.school.exampleabc123.execute-api.ap-south-1…/v1base pathmapping/v2base pathmappingschool-api · prod/v1/students/7 → /students/7school-api-v2 · prodजुने clients /v1 वापरत राहतातएक नाव, अनेक APIs:base path API आणि त्याचाstage निवडतो; path चा उरलेला भागroutes ला दिसतो (L3)users आणि partners साठी स्थिर नाव— मागचे API कधीही बदला2📜 certificate — ACM, योग्य Region मध्येACMapi.school.exampleedge-optimized → cert इथे राहतो:us-east-1(CloudFront ते वापरते)regional → certAPI च्या स्वतःच्या Region मध्ये राहतो (ap-south-1)TLS security policy: किमान TLS 1.2जुने TLS 1.0 / 1.1 clients दारातच परत पाठवले जातात3🤝 mutual TLS — partner सुद्धा certificate दाखवतोभागीदारclient certCN=partner-aserver प्रमाणपत्रapi.school.exampleकोणताही HTTP पाठवण्याआधी दोन्ही बाजू आपण कोण आहोत ते सिद्ध करतातtruststore (CA bundle) S3 मध्ये · फक्त regional custom domainsवैध client cert नाही → connection नाकारले जाते, 4XX log नाही4🗺️ तीन endpoint प्रकारedge-optimizedपुढे CloudFront: visitorsजवळच्या edge वर आत येतात,मग AWS च्या network वरून प्रवास करतातregionalएकच Region; स्वतःचेCloudFront किंवा जवळचे usersपुढे ठेवा — आजचा डिफॉल्टVPCprivateफक्त तुमच्या VPCs च्या आतूनचपोहोचता येते, interfaceendpoint (L12) मधून — internet नाहीpython3 apigw/demo.py domains हीच पाच तथ्ये छापते
⏪ आधी

Callers abc123.execute-api.ap-south-1.amazonaws.com वापरत, हे यादृच्छिक नाव API पुन्हा बनवली की बदलत असे.

💡 काय

Custom domain म्हणजे office चा स्वतःचा नावफलक, api.school.example, certificate सह, म्हणजे कुलपाचे चिन्ह खरे ठरते.

⚙️ कसे

Edge-optimized साठी us-east-1 मधले ACM certificate, Route 53 alias, /v1 आणि /v2 base paths, किमान TLS 1.2.

🎯 का

मागच्या APIs बदलल्या तरी नाव तेच राहते, आणि v1 व v2 एकाच domain खाली शेजारी शेजारी राहतात.

🚀 पुढे

पुढचा धडा office ची नोंदवही वाचतो: Count, 4XXError, 5XXError, आणि Latency विरुद्ध IntegrationLatency.

🧪 इथे करून पाहा — custom domain वरचा URL टाइप करा — DNS, certificate, base path, मग route

संपूर्ण धडा 10 वाचा →

11 📈 Monitoring (देखरेख)

Count, 4XXError, 5XXError, Latency विरुद्ध IntegrationLatency, access logs आणि X-Ray — वेळ आणि errors कुठून येतात.

🧒 सोप्या शब्दांत

Office एक नोंदवही ठेवते, प्रत्येक पाहुण्याची एक ओळ: कधी, कुठे, काय उत्तर आणि किती वेळ लागला. ते एकूण आकडेही ठेवते: सहा पाहुणे, दोन चुकीचे forms, दोन kitchen मधल्या अडचणी. एका भेटीला 42 ms लागले आणि त्यातले 38 ms kitchen मध्ये गेले, तर office ला कळते की हळू भाग kitchen आहे.

📖 नवे शब्दCloudWatch metrics — office ठेवते ते एकूण आकडे, जसे Count, 4XXError आणि 5XXError4XXError — caller ची चूक असलेली उत्तरे, जसे 404 किंवा 4015XXError — backend अपयशी ठरलेली उत्तरे, जसे 502 किंवा 504Latency — पूर्ण प्रवासाचा वेळ, office अधिक kitchenIntegrationLatency — फक्त kitchen चा वेळaccess log — प्रत्येक request ची एक JSON ओळ, तुम्ही निवडलेल्या fields सह
1📊 office गुणांची नोंद ठेवते — सहा भेटींनंतरचे CloudWatch metrics (python3 apigw/demo.py monitor)school-api · prod · शेवटची 5 मिनिटेCount64XXError25XXError2CacheHitCount1CacheMissCount2Count4XX5XXसापडलेन सापडलेसहा भेटी200GET /students/7Miss → kitchen200GET /students/7Hit → फलक404GET /students/404kitchen म्हणते 404502GET /brokenkitchen कोसळले504GET /reportkitchen खूप हळू404GET /teachersअसा route नाहीalarm ची कल्पना: 5 मिनिटे 5XXError > 1 → कोणालातरी page करा2⏱️ Latency विरुद्ध IntegrationLatency — हा फरक म्हणजे office स्वतः (OFFICE_MS = 4)0 ms10 ms20 ms30 ms40 ms50 msreq-0001200kitchen 38 ms4latencyMs 42 · integrationLatencyMs 38req-00022004latencyMs 4 · integrationLatencyMs 0req-0003404kitchen 38 ms4latencyMs 42 · integrationLatencyMs 38req-00045024latencyMs 4 · integrationLatencyMs 0req-000550429,004 ms · kitchen 29,000 — 29 s ला सोडून दिलेreq-00064044latencyMs 4 · integrationLatencyMs 03📄 access log — प्रत्येक request साठी एक JSON ओळCloudWatch Logs · API-Gateway-Access-Logs_school-api/prodreq-0001 {'path': '/students/7', 'status': 200, 'latencyMs': 42, 'integrationLatencyMs': 38}req-0002 {'path': '/students/7', 'status': 200, 'latencyMs': 4, 'integrationLatencyMs': 0}req-0003 {'path': '/students/404', 'status': 404, 'latencyMs': 42, 'integrationLatencyMs': 38}req-0004 {'path': '/broken', 'status': 502, 'latencyMs': 4, 'integrationLatencyMs': 0}req-0005 {'path': '/report', 'status': 504, 'latencyMs': 29004, 'integrationLatencyMs': 29000}req-0006 {'path': '/teachers', 'status': 404, 'latencyMs': 4, 'integrationLatencyMs': 0}4🧵 X-Ray मार्ग रेखाटतोreq-0001 · 42 msAPI Gateway · school-api/prodLambda get_student · 38 msstage वर tracing चालू करा; प्रत्येक टप्पाएक segment असतो — हळू टप्पा शोधागुलाबी पट्टी = 4 ms चे office चे काम
⏪ आधी

Users 'हे हळू आहे' म्हणाले की वेळ office मध्ये गेला की kitchen मध्ये, आणि errors कोणाला आल्या, हे कोणालाच कळत नसे.

💡 काय

Monitoring म्हणजे office ची नोंदवही: CloudWatch metrics, प्रत्येक request ची एक JSON access-log ओळ, आणि मार्ग काढणारा X-Ray.

⚙️ कसे

Count=6, 4XXError=2, 5XXError=2; एका GET /students/7 चा Latency 42 ms, त्यापैकी IntegrationLatency 38 ms.

🎯 का

फरक म्हणजे office चा स्वतःचा वेळ, 4XX callers कडे आणि 5XX kitchens कडे बोट दाखवतात, म्हणून आधी योग्य बाजू दुरुस्त होते.

🚀 पुढे

पुढचा धडा कडक मर्यादांपर्यंत पोहोचतो: 29 s timeout, 10 MB payloads, private APIs, WAF आणि bill.

🧪 इथे करून पाहा — requests पाठवा आणि dashboard, latency bars आणि access log भरताना पाहा

संपूर्ण धडा 11 वाचा →

12 🛡️ Private APIs, WAF, मर्यादा आणि खर्च

कठोर मर्यादा — 29-second timeout, 10 MB payloads, private APIs, WAF rules आणि bill.

🧒 सोप्या शब्दांत

Office kitchen साठी फक्त 29 सेकंद थांबते; त्यानंतर ते पाहुण्याला 'वेळ संपला' सांगते. खूप मोठी पार्सले office मधून नेली जात नाहीत; ती वेगळ्या delivery दाराने जातात. काही offices फक्त campus च्या आत असतात, आणि दारावरचा पहारेकरी ओळखीच्या त्रास देणाऱ्यांना परत पाठवतो. प्रत्येक पाहुण्याचा थोडा खर्चही येतो.

📖 नवे शब्द504 — Gateway Timeout: backend ला 29 s पेक्षा जास्त वेळ लागला502 — Bad Gateway: backend बंद पडले किंवा बिघडलेले उत्तर पाठवलेprivate API — फक्त तुमच्या network मधल्या VPC endpoint मधून पोहोचता येणारा APIAWS WAF — SQL injection, वाईट IPs आणि गर्दीविरुद्ध नियम असलेला पहारेकरीpre-signed URL — मोठी file थेट S3 वरून upload किंवा download करण्यासाठी मर्यादित वेळेची link
1⏱️ 29 सेकंदांचे stopwatch0153045GET /report — kitchen ला 31 s लागतात504Endpoint requesttimed outoffice 29 s ला वाट पाहणे थांबवते(REST डिफॉल्ट; kitchen कदाचितशिजवत राहील — उत्तर कोणालाच मिळत नाही)502Internalserver errorGET /broken — kitchen कोसळले504 = kitchen खूप हळू होते · 502 = ते बिघडले किंवा निरर्थक उत्तर दिलेdashboard वर (L11) दोन्ही 5XXError असतात2🎟️ लांब कामे: ticket घ्या, नंतर परत याofficeSQS queuePOST /reportsरांगेत टाका202{"jobId": "job-81"}λworker: 3 मिनिटेGET /reports/job-81200{"status": "done", "url": …}किंवा तेWebSocket (L2) वरून पाठवा3📦 एक request जास्तीत जास्त 10 MB वाहून नेऊ शकतेoffice80 MB413Request खूप मोठीpre-signedS3 URL · 15 मिनिटेS3office एक ticket देते;पार्सल थेट S3 कडे जाते4🔒 private API — फक्त तुमच्या VPC च्या आतूनVPC 10.0.0.0/16appinterface endpointexecute-apiprivate APIAllow execute-api:Invoke if aws:SourceVpce = vpce-0abcinternet: आत येण्याचा मार्ग नाही5🛡️ AWS WAF — counter समोरचा पहारेकरी (REST APIs)WAFoffice?id=7' OR 1=1 --SQL-injection नियम403198.51.100.77 वरूनIP set: blocked range4035 मिनिटांत 2,500 विनंत्याrate-based नियम403GET /students/7पास → नेहमीच्या तपासण्या (auth, throttle …)6💰 खर्च किती (उदाहरण, us-east-1)REST ~$3.50 / दशलक्षHTTP ~$1.00 / दशलक्षमहिन्याला 30 दशलक्ष requests:REST ≈ $105HTTP ≈ $30+ cache तास, data out, WAF rules आणि requestsfree tier: महिन्याला 1 दशलक्ष REST calls, पहिले वर्ष
⏪ आधी

Teams ना मर्यादा production मध्येच कळल्या: 45 सेकंदांचा report मध्येच थांबला, मोठा upload अपयशी ठरला, आणि bill पाहून धक्का बसला.

💡 काय

Office च्या कडक मर्यादा: 29 s timeout, 10 MB payload; private APIs ते VPC मध्ये लपवतात आणि WAF वाईट visitors ना अडवतो.

⚙️ कसे

29 s वर GET /report ला 504, GET /broken ला 502; REST ला ~$3.50 प्रति million requests, HTTP ला ~$1.00.

🎯 का

मर्यादा आधी माहीत असल्या की लांब कामे job id सह 202 परत देतात, आणि मोठ्या files pre-signed S3 URLs मधून जातात.

🚀 पुढे

पुढे कुठे: API school office मागे काय असते ते design करते; VPC आणि IAM schools campus आणि SigV4 चे रक्षण शिकवतात.

🧪 इथे करून पाहा — कठीण कडांवर जोर लावा — हळू kitchen, मोठे upload, WAF आणि private API
3112

संपूर्ण धडा 12 वाचा →

धडा 01 सुरू करा → 🗓️ अभ्यास योजना (4 आठवडे) 📐 सर्व 12 धड्यांच्या आकृत्या 🧪 प्रश्नमंजुषा (15 प्रश्न) ⏮️ आधी काय होते & फायदे-तोटे