Course-এর সূচি

15.6

Amazon API Gateway

API type আর endpoint type, integration, নিরাপত্তা, throttling আর caching, আর API Gateway বনাম ALB।

24 মিনিট পড়া + Animation

টিপস: ডটেড-আন্ডারলাইন করা যেকোনো শব্দে ট্যাপ বা Hover করলে তার অর্থ দেখবে।

এই লেসন শেষে তুমি পারবে

  • Serverless API-র সামনের দরজা হিসেবে Amazon API Gateway কী করে (client → API Gateway → Lambda → DynamoDB) সেটা বুঝিয়ে বলতে, আর কোন কোন কাজ সে তোমার ঘাড় থেকে নামিয়ে দেয় তার তালিকা দিতে: routing, stage, security, API key আর usage plan, throttling, validation, transformation, caching, OpenAPI import, WebSocket।
  • তিন রকম API, মানে REST, HTTP আর WebSocket-এর মধ্যে feature আর দাম দেখে বেছে নিতে।
  • একটা API-কে Lambda function (proxy বা custom), HTTP backend, Kinesis Data Streams-এর মতো AWS service, বা mock-এর সাথে জুড়তে, আর 500-এর পেছনে লুকানো permission-এর অভাব ধরে ঠিক করতে।
  • Endpoint type বেছে নিতে, edge-optimized, Regional নাকি private, আর ঠিক Region-এর ACM certificate দিয়ে তাতে custom domain বসাতে।
  • IAM (SigV4), Cognito user pool, Lambda authorizer, resource policy আর AWS WAF দিয়ে API সুরক্ষিত করতে, আর 401 আর 403-এর তফাত বুঝতে।
  • যে limit-গুলো design ঠিক করে দেয় সেগুলো কাজে লাগাতে (২৯ সেকেন্ডের integration timeout, ১০ MB payload, account-এ সেকেন্ডে ১০,০০০ request, cache TTL ৩০০ থেকে ৩,৬০০ সেকেন্ড পর্যন্ত), আর API Gateway, ALB আর Lambda function URL-এর মধ্যে বেছে নিতে।

#একটা API-র কেন সামনের দরজা লাগে

Mobile app, website বা partner-এর server কখনো সরাসরি তোমার database-এর সাথে কথা বলে না। সে call করে একটা API-কে: কিছু HTTPS ঠিকানা, যেমন GET /products/42 বা POST /orders। এই call-গুলো কাউকে না কাউকে নিতে হবে, কে call করছে যাচাই করতে হবে, বন্যার মতো request এলে থামাতে হবে, প্রতিটা call ঠিক code-এর কাছে পাঠাতে হবে, তারপর উত্তর ফেরত দিতে হবে। Server-ভিত্তিক design-এ এই কাজ করে তোমার web server আর নিজের লেখা একগাদা middleware, যেগুলো patch-ও তোমাকেই করতে হয়।

Amazon API Gateway একটা fully managed service, যে ঠিক এই কাজটা করে। Note-এ একে বলা হয়েছে client (mobile app, website) আর তোমার backend (Lambda, EC2, DynamoDB)-এর মাঝখানের সামনের দরজা বা front door। এটা তোমাকে API বানাতে, publish করতে, রক্ষণাবেক্ষণ করতে, নজরে রাখতে আর সুরক্ষিত করতে সাহায্য করে। টাকা দাও call ধরে; কোনো server নেই, আর কেউ call না করলে কোনো খরচও নেই।

#একটা serverless API, শুরু থেকে শেষ

চেনা serverless API-তে চারটা বাক্স: client HTTPS request পাঠায় API Gateway-কে, সে সেটা (proxy হিসেবে) পাঠায় একটা Lambda function-এর কাছে, আর function একটা DynamoDB table-এ CRUD করে। চারটার কোনোটাতেই তোমার চালানো server লাগে না, চারটাই traffic-এর সাথে বাড়ে-কমে, আর ভোর ৪টায় bill প্রায় শূন্যে নেমে যায়। Note-এর প্রথম exam trick: প্রশ্নে যদি থাকে “serverless architecture” বা “expose AWS Lambda as a RESTful API”, তাহলে উত্তর API Gateway।

Lambda নিজে lesson ১৫.১ আর ১৫.২-এ; DynamoDB lesson ১৫.৪-এ। এখানে আমরা request-টার পিছু নেব সামনের দরজা দিয়ে: আগে সব ঠিক থাকলে কী হয়, তারপর যে পাঁচটা চেনা উপায়ে সেটা ভেস্তে যায়।

একটা serverless API: একটা request, শুরু থেকে শেষ

ঢাকার একটা e-commerce shop-এর product API: browser call করে API Gateway-কে, সে চালায় একটা Lambda function, আর function পড়ে DynamoDB থেকে। Patch করার মতো কোনো server তোমার নেই। তারপর দেখো, একই request কোন পাঁচ ভাবে গোলমাল হয়।

পরিস্থিতি

Lambda proxy integration-এ স্বাভাবিক পথ: REST API-র পেছনে DynamoDB-তে CRUD।

Browsershop.example
API GatewayREST API
Lambdaproducts-example
DynamoDBProducts
S3uploads-example
GET /prod/products/42
ধাপ 1 / 6
1

Browser API-র HTTPS ঠিকানায় call করে। সামনের দরজা API Gateway-এর হাতে: TLS, URL-এর route (resource /products/{id}, method GET), আর path-এর stage (prod)।

#API Gateway তোমার জন্য কী কী করে

“Gateway” এই একটা শব্দের পেছনে অনেকগুলো feature। পরীক্ষায় আর আসল project-এ যেগুলো কাজে লাগে:

Featureকী দেয়উদাহরণ
কোনো infrastructure নেইপেছনে Lambda থাকলে patch বা scale করার মতো কিছুই নেইমাসে কয়েক ডলারে চলা একটা startup API
Route আর methodResource আর method (REST) বা route (HTTP) প্রতিটা path আর verb-কে একটা backend-এর সাথে জোড়েGET /products/{id} → function A, POST /orders → function B
Stageএকই API-র কয়েকটা deploy করা কপি: dev, test, prod, প্রত্যেকটার নিজের URL আর settinghttps://abc123.execute-api.ap-southeast-1.amazonaws.com/prod
VersioningClient-রা v2-তে যেতে যেতে v1 চালু রাখা (আলাদা stage, আলাদা API বা path)পুরোনো app version এখনো /v1/orders call করে
SecurityIAM, Cognito, Lambda authorizer, resource policy, WAF, mutual TLSRider-রা Cognito দিয়ে sign in করে
API key, usage plan, throttlingপ্রতিটা client-কে চেনা, তার rate আর মাসিক quota বেঁধে দেওয়াPartner-দের জন্য একটা free আর একটা paid plan
Request validation আর transformationBackend চলার আগেই ভুল input ফেরত দেওয়া; mapping template দিয়ে request আর response-এর আকার বদলানোProduct ID ছাড়া order এলে 400
Cachingএকটা TTL পর্যন্ত response রেখে দেওয়া, যাতে একই call বারবার backend-এ না যায়Delivery zone ৫ মিনিট cache-এ
OpenAPI (Swagger) import আর exportপুরো API একটা file-এ সংজ্ঞায়িত করা; export করে client SDK আর documentation বানানোMobile team একটা বানিয়ে দেওয়া Android SDK পায়
WebSocketদুই দিকে, অনেকক্ষণ খোলা connection, server থেকে pushRider-এর live location
MonitoringCloudWatch metric (Count, Latency, IntegrationLatency, 4XXError, 5XXError, CacheHitCount), access আর execution log, X-Ray tracing5XX error-এর ওপর একটা alarm

#Stage আর deployment

REST API-তে কোনো method বদলালে client-রা কিছুই টের পায় না, যতক্ষণ না তুমি সেটা একটা stage-এ deploy করো। Deployment হলো API-র একটা snapshot; stage একটা deployment-এর দিকে দেখায় আর নিজের setting যোগ করে: throttling, caching, logging, WAF, আর stage variable (key–value জোড়া, যেমন lambdaAlias=prod, যাতে prod stage function-এর prod alias call করে আর dev call করে dev)। Stage-এর canary setting দিয়ে সবাইকে দেওয়ার আগে নতুন deployment-এ traffic-এর ছোট একটা অংশ পাঠানো যায়। HTTP API প্রতিটা পরিবর্তন নিজে থেকেই একটা stage-এ auto-deploy করতে পারে, dev-এর জন্য খুব কাজের।

Note অনুযায়ী: stage দিয়ে একই API-র কয়েকটা version বা environment (dev, test, prod) পাশাপাশি চালানো যায়। Lambda alias (lesson ১৫.১)-এর সাথে মিলিয়ে এভাবেই নতুন version ছাড়া হয়, মানুষের ফোনে আগে থেকে থাকা app না ভেঙে।

#REST, HTTP নাকি WebSocket API

API Gateway তিন রকম API দেয়। পরীক্ষা বেশিরভাগ সময় শুধু “API Gateway” বলে, আর বোঝায় REST API; আসল project-এ ভেবেচিন্তে বেছে নেওয়া উচিত।

REST APIHTTP APIWebSocket API
কথা বলার ধরনRequest–responseRequest–responseদুই দিকে, অনেকক্ষণ খোলা connection, server থেকে push
Endpoint typeEdge-optimized (default), Regional, privateশুধু RegionalRegional
দাম (us-east-1, প্রথম ধাপ)প্রতি ১০ লাখ request-এ প্রায় $৩.৫০প্রতি ১০ লাখ request-এ প্রায় $১.০০প্রতি ১০ লাখ message-এ প্রায় $১.০০ + প্রতি ১০ লাখ connection-minute-এ $০.২৫
API key, usage plan, client ধরে throttlingআছেনেইনেই
Cachingআছে (০.৫–২৩৭ GB, ঘণ্টা ধরে bill)নেইনেই
Request validation, body transformation, mock integrationআছেনেই (শুধু parameter mapping)Route selection আর কিছু mapping
AWS WAF, resource policy, private endpointআছেনেইWAF নেই
AuthorizerIAM, Cognito user pool, LambdaIAM, JWT (Cognito বা যেকোনো OIDC issuer), LambdaIAM, Lambda ($connect-এ)
Integration timeout৫০ ms – ২৯ সে (Regional/private বেশি চাইতে পারে)সর্বোচ্চ ৩০ সে, বদলানো যায় না২৯ সে
বাড়তি যা আছেCanary deployment, X-Ray, execution log, developer portal, response streamingAutomatic deployment, Cloud Map-এ private integration, কম latency$connect, $disconnect, $default route; @connections callback

AWS documentation-এর সোজা নিয়ম: API key, client ধরে throttling, request validation, WAF, caching বা private endpoint লাগলে REST নাও; না লাগলে HTTP নাও, কারণ সেটা সস্তা আর দ্রুত।

#এক অনুচ্ছেদে WebSocket API

WebSocket API client আর API Gateway-এর মধ্যে একটা connection খোলা রাখে। Client JSON message পাঠায়; $request.body.action-এর মতো একটা route selection expression প্রতিটা message-কে একটা route-এ পাঠায় (sendMessage, updateLocation), আর আছে তিনটা বিশেষ route: $connect (authorize করা আর connection ID রেখে দেওয়া, যেমন DynamoDB-তে), $disconnect (গুছিয়ে ফেলা) আর $default। কোনো client-কে message push করতে backend সেই client-এর connection ID দিয়ে @connections callback URL call করে। একটা connection সর্বোচ্চ ২ ঘণ্টা টেকে, আর ১০ মিনিট চুপচাপ থাকলে বন্ধ হয়ে যায়; একটা message ১২৮ KB পর্যন্ত হতে পারে (৩২ KB-র frame-এ)। Chat app, live dashboard, multiplayer game, আর ride-sharing map-এ rider-এর icon নড়াচড়া, সবই এখানে মানায়।

#Integration: দরজার পেছনে কী থাকে

Integration একটা route বা method-কে একটা backend-এর সাথে জোড়ে। Slide-এ বড় দাগে তিন রকম, আর REST API-তে চতুর্থ একটা।

  1. Lambda function। Lambda-চালিত REST API খুলে দেওয়ার সহজ উপায়।
    • Lambda proxy (AWS_PROXY): পুরো request (path, query string, header, body, caller-এর পরিচয়) হয়ে যায় event; function ফেরত দেয় statusCode, headers আর একটা string body। প্রায় সবাই এটাই ব্যবহার করে।
    • Lambda custom (non-proxy, AWS): mapping template (VTL-এ লেখা) request-কে event-এর আকারে আর function-এর ফলকে HTTP response-এর আকারে বদলায়। পুরোনো, খাটুনিও বেশি, তবে function-কে HTTP নিয়ে কিছু জানতে হয় না।
  2. HTTP। যেকোনো HTTP endpoint-এ পাঠানো: EC2 বা container-এর সামনের একটা ALB, অফিসের ভেতরের একটা পুরোনো API, partner-এর URL। যা আগে থেকেই চলছে তার সামনে API Gateway বসাব কেন? যাতে সেটা না ছুঁয়েই rate limiting, caching, authentication আর API key যোগ করা যায়। VPC-র ভেতরের backend-এ (private ALB বা NLB) পৌঁছাতে লাগে একটা VPC link।
  3. AWS service। মাঝে কোনো Lambda ছাড়াই সরাসরি যেকোনো AWS API call করা: SQS-এ SendMessage, Step Functions workflow চালু করা, Kinesis Data Streams-এ PutRecord, DynamoDB-তে PutItem। API Gateway call-টা sign করে তোমার দেওয়া একটা IAM role দিয়ে। কেন? Code ছাড়াই service-এর সামনে authentication, একটা public HTTPS ঠিকানা আর rate নিয়ন্ত্রণ পাওয়ার জন্য। HTTP API একই জিনিস দেয় তৈরি করা “first-class” integration হিসেবে: SQS, EventBridge, Kinesis Data Streams, Step Functions আর আরও কয়েকটা।
  4. Mock (শুধু REST): API Gateway নিজেই একটা নির্দিষ্ট response দিয়ে উত্তর দেয়। Backend তৈরি না হওয়া পর্যন্ত, বা CORS preflight-এর জন্য কাজে লাগে।

Slide-এর AWS service উদাহরণটা একটা clickstream pipeline: client → API Gateway → Kinesis Data Streams → Data Firehose → S3 (.json file)। যেকোনো হারে event নেয়, অথচ তোমার একটা function-ও চলে না (lesson ১৩.৫ আর ১৩.৬)।

API Gateway-এর পেছনে কী থাকে

তিন রকম backend: একটা Lambda function, যেকোনো HTTP endpoint, বা সরাসরি call করা কোনো AWS service-এর API। সাথে একটা mock, আর সবচেয়ে সাধারণ ভুল configuration।

পরিস্থিতি

Lambda-কে REST API হিসেবে খুলে দেওয়ার স্বাভাবিক উপায়।

Client
API Gateway
Lambda
HTTP backendALB বা অফিসের server
KinesisData Streams
Firehose
S3clicks-example
POST /orders
ধাপ 1 / 3
1

Client POST /orders call করে। Route-টা proxy mode-এর (AWS_PROXY) একটা Lambda integration-এ জোড়া।

#Endpoint type আর custom domain

একটা API সবসময় একটা Region-এই থাকে। Client কীভাবে সেখানে পৌঁছাবে, সেটা ঠিক করে endpoint type।

Endpoint typeClient কীভাবে পৌঁছায়কখন বাছবে
Edge-optimized (REST-এর default)Request AWS-এ ঢোকে সবচেয়ে কাছের CloudFront edge location দিয়ে, তারপর AWS backbone ধরে Region-এ যায়Client-রা সারা পৃথিবীতে ছড়ানো
Regionalসরাসরি Region-এর endpoint-এClient-রা একই Region-এ বা কাছাকাছি; অথবা তুমি সামনে নিজের CloudFront distribution চাও, caching আর behaviour-এর পুরো নিয়ন্ত্রণসহ
Private (শুধু REST)শুধু একটা VPC থেকে, execute-api-এর একটা interface VPC endpoint দিয়ে (private IP-ওয়ালা একটা ENI, AWS PrivateLink)এমন internal API, যা কখনোই internet থেকে পৌঁছানো যাবে না; কে ঢুকবে ঠিক করে একটা resource policy

দুটো কথা slide-এ নেই। প্রথমত, edge-optimized তোমার response edge-এ cache করে না; শুধু network-এর পথটা ছোট করে (API caching আলাদা একটা stage setting)। দ্বিতীয়ত, edge-optimized যে CloudFront distribution ব্যবহার করে সেটা AWS চালায়, তুমি সেটা configure করতে পারো না; CloudFront-এ WAF, geo restriction বা নিজের cache rule চাইলে নিজের distribution-এর পেছনে একটা Regional endpoint রাখো। Interface endpoint নিজে lesson ২২.২-এ।

#Custom domain name আর ACM certificate

Partner-এর চুক্তিপত্রে কেউ abc123.execute-api.ap-southeast-1.amazonaws.com ছাপতে চায় না। api.shop.example-এর মতো একটা custom domain name এক বা একাধিক API আর stage-এর দিকে দেখায় (API mapping দিয়ে, যেমন /v1 → API A-র stage prod)। এর HTTPS-এর জন্য লাগে AWS Certificate Manager-এর একটা certificate (lesson ২১.৪), আর সেই certificate কোন Region-এ থাকবে, এটা পরীক্ষার খুব প্রিয় খুঁটিনাটি:

  • Edge-optimized custom domain → certificate থাকতেই হবে us-east-1-এ (N. Virginia), কারণ পেছনের CloudFront distribution global, আর CloudFront certificate পড়ে ওখান থেকে।
  • Regional custom domain → certificate থাকতে হবে API-র নিজের Region-এ।
  • তারপর একটা Route 53 alias (A বা AAAA) record, বা একটা CNAME বানাও, যেটা নামটাকে domain-এর target-এর দিকে দেখায় (edge-optimized হলে একটা CloudFront নাম, Regional হলে একটা Regional d-…execute-api নাম)। Alias আর CNAME-এর তফাত lesson ৮.২-এ।

২০২৪-এর শেষ থেকে private REST API-তেও custom domain name দেওয়া যায়, access association দিয়ে VPC endpoint-এর সাথে ভাগ করে। ২০২৫-এ API Gateway আরও দুটো জিনিস যোগ করেছে: dual-stack (IPv4 আর IPv6) endpoint (মার্চে, REST, HTTP আর WebSocket API আর custom domain সবগুলোর জন্য), আর custom domain-এ routing rule (জুনে, শুধু REST API-র জন্য: header বা path দেখে কোন API-তে যাবে ঠিক করা, যেমন ধীরে ধীরে v1 থেকে v2-তে সরানোর জন্য)। এগুলো পাশের কথা; পরীক্ষা জিজ্ঞেস করে certificate-এর Region।

Edge-optimized, Regional নাকি private

API সবসময় একটা Region-এই থাকে। Client কীভাবে সেখানে পৌঁছাবে, সেটা ঠিক করে endpoint type: CloudFront edge location হয়ে, সরাসরি Region-এ, নাকি শুধু একটা VPC-র ভেতর থেকে।

পরিস্থিতি

REST API-র default: সারা পৃথিবীর client-দের জন্য।

ap-southeast-1
বিদেশের user
CloudFront edge
কাছের user
API Gateway
HTTPS
ধাপ 1 / 4
1

উপসাগরীয় দেশ আর ইউরোপে থাকা বাংলাদেশি কর্মীরা একটা remittance app ব্যবহার করেন, যার API সিঙ্গাপুরে। Edge-optimized endpoint হলে তাদের request AWS-এ ঢোকে সবচেয়ে কাছের CloudFront edge location দিয়ে।

#Security: API কে call করতে পারবে

Slide-এ user authenticate করার তিনটা উপায় আছে; পুরো তালিকাটা একটু লম্বা।

উপায়কার জন্য মানানসইকীভাবে কাজ করে
IAM authorization (AWS_IAM)ভেতরের caller, যাদের কাছে আগে থেকেই AWS credential আছে: EC2, ECS task, Lambda, অন্য accountCaller প্রতিটা request SigV4 দিয়ে sign করে; API Gateway signature আর execute-api:Invoke-এর জন্য caller-এর IAM policy দেখে। অন্য account থেকে এলে API-র resource policy-ও লাগে
Amazon Cognito user poolবাইরের user: mobile আর web app-এর user, লাখে লাখেUser Cognito-তে sign in করে JWT token পায়; Cognito authorizer (REST) বা JWT authorizer (HTTP API) তোমার কোনো code ছাড়াই token-এর signature আর মেয়াদ যাচাই করে (lesson ১৫.৭)
Lambda authorizer (আগের নাম “custom authorizer”)তোমার নিজের যুক্তি: বাইরের কোনো identity provider, partner-এর দেওয়া bearer token, নিজের database-এ রাখা key, কোনো header যাচাইAPI Gateway তোমার function-কে token (token type) বা header আর context (request type) দিয়ে call করে; function ফেরত দেয় একটা IAM policy (Allow বা Deny) আর একটা principal ID। ফলটা একটা TTL পর্যন্ত cache হয় (default ৩০০ সে, সর্বোচ্চ ৩,৬০০ সে)
Resource policy (REST)উৎস দেখে আটকানো: account, IP range, VPC, VPC endpointAPI-র গায়ে লাগানো একটা JSON policy, বাকি যাচাইয়ের সাথে মিলিয়ে দেখা হয়; private API আর অন্য account থেকে IAM access-এর জন্য লাগবেই
AWS WAF (REST)আক্রমণ: SQL injection, cross-site scripting, খারাপ bot, IP ধরে rate limitStage-এ লাগানো একটা web ACL, সবকিছুর আগে মেলানো হয় (chapter ২১, lesson ২১.৬)
Mutual TLSClient certificate-ওয়ালা partner আর deviceClient-কে এমন certificate দেখাতে হয় যা S3-এ রাখা তোমার truststore বিশ্বাস করে (custom domain লাগবে)

Status code ঠিকমতো পড়তে শেখো। 401 Unauthorized মানে “তুমি কে?”: token নেই, বা ভুল, বা মেয়াদ শেষ। 403 Forbidden মানে “তুমি কে জানি, কিন্তু না”: Lambda authorizer Deny দিয়েছে, IAM execute-api:Invoke দেয়নি, resource policy বা WAF উৎসটা আটকেছে। দুটোই ফেরত আসে তোমার backend চলার আগেই, তাই Lambda-র কোনো সময় খরচ হয় না।

API কে call করতে পারবে?

একটা ride-sharing app-এর API backend চালানোর আগে প্রত্যেক caller-কে যাচাই করে: rider-দের জন্য Cognito user pool, partner-এর নিজের token-এর জন্য Lambda authorizer, ভেতরের service-এর জন্য IAM, আর সাথে resource policy ও WAF।

পরিস্থিতি

Rider login করে; API Gateway নিজেই token যাচাই করে।

Caller
Cognitouser pool
API Gateway
Lambda authorizer
Backendtrips-example
sign in
ধাপ 1 / 6
1

একজন rider app-এ sign in করে। Cognito user pool লাখো বাইরের user রাখে: sign-up, password, MFA, social login (lesson 15.7)।

#Throttling, usage plan আর caching

#Throttling: চার স্তর

Throttling তোমার backend আর bill-কে request-এর বন্যা থেকে বাঁচায়। API Gateway ব্যবহার করে একটা token bucket: একটা স্থির rate (সেকেন্ডে কতটা request) আর একটা burst (bucket-এর আকার, একসাথে কতটা আসতে পারে)। সীমা পেরোলে caller পায় 429 Too Many Requests, আর তার উচিত exponential backoff দিয়ে আবার চেষ্টা করা। সীমাগুলো এই ক্রমে বসে, আর যেটা সবচেয়ে কড়া সেটাই জেতে:

  1. Client ধরে (শুধু REST): সেই client-এর API key-র usage plan-এর সীমা, চাইলে method ধরেও।
  2. Method ধরে: stage-এর method-স্তরের সীমা, যেমন POST /orders সেকেন্ডে ২০০।
  3. Stage ধরে: stage-এর সব method-এর default।
  4. Account আর Region ধরে: default-এ সেকেন্ডে ১০,০০০ request, সাথে ৫,০০০-এর burst bucket, account-এর ওই Region-এর সব REST, HTTP আর WebSocket API মিলিয়ে ভাগাভাগি (কিছু নতুন Region-এ শুরু ২,৫০০ থেকে)। Service Quotas-এ বাড়ানোর আবেদন করা যায়।

Note-এ default বলা আছে সেকেন্ডে ১০,০০০; production-এ যে শব্দটা কামড় দেয় সেটা হলো ভাগাভাগি: একটা API-র হঠাৎ চাপে account-এর বাকি সব API-ও throttle হতে পারে। Stage আর method-এর সীমা বসাও, যাতে কোনো একটা API একাই পুরো account-এর সীমা খেয়ে ফেলতে না পারে।

#Usage plan আর API key

Usage plan (শুধু REST) বলে দেয় একটা client কতটা ব্যবহার করতে পারবে: একটা throttle (rate আর burst) আর একটা quota (দিনে, সপ্তাহে বা মাসে কতটা request)। Client পায় একটা API key, key জোড়া হয় একটা plan-এর সাথে, আর plan জোড়া হয় API-র stage-এর সাথে। যে method-এ key লাগবে সেখানে API key required চালু থাকে। Rate পেরোলে client পায় 429; quota পেরোলে period নতুন না হওয়া পর্যন্ত “Limit Exceeded” সহ 429। Note-এর exam trick: “usage plans”, “API keys” বা “throttling third-party developers” মানে API Gateway (আরও নির্দিষ্ট করে REST API)।

#Response cache করা

Note-এর দ্বিতীয় exam trick: “API-র performance বাড়াও আর backend-এর চাপ কমাও” → API caching চালু করো। একটা REST API-র stage-এ cache রাখা যায়:

  • TTL default-এ ৩০০ সেকেন্ড (৫ মিনিট), ০ (caching বন্ধ) থেকে ৩,৬০০ সেকেন্ড পর্যন্ত বদলানো যায়।
  • Cache key হলো method আর path, সাথে তুমি যে parameter বাছো (query string, header)। সাবধানে বাছো: কোনো parameter বাদ পড়লে একজনের উত্তর আরেকজনকে দেখানো হয়ে যাবে।
  • Cache-এর bill হয় size ধরে ঘণ্টা হিসেবে, ০.৫ GB থেকে ২৩৭ GB, ব্যবহার হোক বা না হোক; একটা cache করা response ১ MB পর্যন্ত হতে পারে।
  • পুরো stage cache flush করা যায়, আর method ধরে caching বদলানো যায়। কোনো client Cache-Control: max-age=0 পাঠিয়ে একটা request-এর জন্য cache এড়াতে পারে, যদি তার IAM permission execute-api:InvalidateCache থাকে; এই permission বাধ্যতামূলক রাখো, নইলে যে কেউ তোমার cache এড়িয়ে যাবে।
  • HTTP আর WebSocket API-তে নিজস্ব cache নেই; লাগলে সামনে CloudFront বসাও।

Caching গতির বদলে টাটকা ভাব কিছুটা ছাড়ে। Flash sale-এর সময় দামের ওপর পাঁচ মিনিটের TTL পুরোনো দাম দেখাতে পারে; data কতটা পুরোনো চলবে সেটা দেখে TTL ঠিক করো, দরকার হলে flush করো।

Throttling, usage plan আর cache

Pathao-র মতো একটা delivery platform তাদের tracking API অন্য company-দের কাছে বিক্রি করে: একটা free plan আর একটা paid plan, প্রত্যেকটা চেনা যায় একটা API key দিয়ে। তারপর account-জোড়া সীমা, আর সেই cache যে Lambda-কে চুপ রাখে।

পরিস্থিতি

Free: সেকেন্ডে ১০টা request, মাসে ১০,০০০। Paid: সেকেন্ডে ৫০০, মাসে ৫০ লাখ।

Free partnerkey A
Paid partnerkey B
API Gatewaystage prod
Stage cache0.5 GB
Lambda
400 req/s x-api-key: B
ধাপ 1 / 6
1

Paid partner x-api-key header-এ নিজের API key দিয়ে সেকেন্ডে ৪০০টা request পাঠায়। তার usage plan সেকেন্ডে ৫০০ পর্যন্ত দেয়।

#যে limit-গুলো design ঠিক করে দেয়

LimitমানDesign-এ এর মানে
Integration timeout, RESTDefault-এ ৫০ ms – ২৯ সে; Regional আর private REST API বেশি চাইতে পারে (জুন ২০২৪), তাতে account-এর throttle quota কমতে পারে; edge-optimized পারে নালম্বা কাজ synchronous call-এ রাখা চলবে না: 202 ফেরত দাও আর কাজটা পেছনে করো (SQS, Step Functions)
Integration timeout, HTTP APIসর্বোচ্চ ৩০ সে, বাড়ানো যায় নাএকই
Payload size (REST আর HTTP)১০ MBFile সরাসরি S3-এ upload করো presigned URL দিয়ে (lesson ১০.১২)
Lambda synchronous payloadRequest আর response ৬ MB১০ MB-র নিচে হলেও Lambda backend ৬ MB-র ওপরে ব্যর্থ হয়
Account throttle১০,০০০ rps, burst ৫,০০০, Region ধরে, ভাগাভাগিStage/method-এর সীমা, quota বাড়ানো, caching
Cache TTLDefault ৩০০ সে, ০ – ৩,৬০০ সে
Lambda authorizer cacheDefault ৩০০ সে, সর্বোচ্চ ৩,৬০০ সেবাতিল করা token cache-এর মেয়াদ শেষ না হওয়া পর্যন্ত পার পেয়ে যেতে পারে
WebSocket connectionসর্বোচ্চ ২ ঘণ্টা, চুপচাপ ১০ মিনিটClient-কে আবার connect করতে হয়

২৯ সেকেন্ডের timeout-টাই পরীক্ষার প্রশ্নে সবচেয়ে বেশি আসে। এর পেছনের ফাঁদ: API Gateway হাল ছেড়ে 504 ফেরত দিলেও Lambda function নিজের timeout (১৫ মিনিট পর্যন্ত) পর্যন্ত চলতেই থাকে আর bill হয়, অথচ তার উত্তর কোথাও পৌঁছায় না। Lambda-র timeout API-র timeout-এর চেয়ে ছোট রাখো।

#যাচাইগুলোর ভেতর দিয়ে একটা request-এর পিছু নাও

এবার সব একসাথে মেলাও। API type, token, client-এর traffic, cache, backend কত সময় নেয় আর body-র size বেছে নাও, তারপর button চাপো আর দেখো কোন যাচাইয়ে request থামে, কোন status code নিয়ে, কত সময় পরে, আর Lambda চলার জন্য টাকা গেল কি না।

API Gateway-এর ভেতর দিয়ে একটা request-এর পিছু নাও

Delivery platform-এর tracking API: Cognito authorizer দিয়ে সুরক্ষিত, usage plan দিয়ে বিক্রি হয়, পেছনে Lambda। Request সাজাও, পাঠাও, তারপর দেখো কোন যাচাইয়ে সেটা থামে আর কেন।

API type

Token

Client-এর traffic

Cache

Backend-এর সময়

Request body

Request-এর পিছু নিতে “Request পাঠাও” চাপো।

#API Gateway বনাম Application Load Balancer

দুটোই client-এর HTTP traffic নেয় আর backend-এ পাঠায়। Note-এর তুলনা, inventory যে সংশোধনগুলো পেয়েছে সেগুলোসহ:

API GatewayApplication Load Balancer
মূল কাজAPI চালানো আর সুরক্ষা দেওয়া, বিশেষ করে serverless (Lambda), তবে HTTP backend আর AWS service-ওEC2 instance, ECS container, IP address, আর Lambda function-এর মধ্যেও traffic ভাগ করা (lesson ৬.৩)
টাকা দেওয়ার ধরনRequest ধরে (সাথে cache-এর ঘণ্টা, বাইরে যাওয়া data); চুপচাপ থাকলে কিছু নাঘণ্টা ধরে, সাথে LCU (load balancer capacity unit); চালু থাকলেই টাকা কাটে, রাতেও
API managementRate limiting, throttling, API key, usage plan, request validation, transformationএর কোনোটাই নেই; এটা একটা load balancer। WAF-এর rate-based rule দিয়ে IP ধরে সীমা দেওয়া যায়
Cachingনিজস্ব (REST)নেই
AuthenticationIAM (SigV4), Cognito, Lambda authorizer, resource policyHTTPS listener-এ Cognito আর যেকোনো OIDC identity provider
Timeout আর size২৯ সে (HTTP API ৩০ সে), ১০ MBIdle timeout default ৬০ সে, ৪,০০০ সে পর্যন্ত; Lambda target-এ request আর response ১ MB
WebSocketWebSocket API (serverless)তোমার server পর্যন্ত WebSocket connection পার করে দেয়
Scaleপুরো managed, account-এ default ১০,০০০ rpsLCU-র সাথে নিজে নিজে বাড়ে, সেকেন্ডে লাখো request

কোন সামনের দরজা মানায়?

একটা scenario বেছে নাও, আন্দাজ করো, তারপর কারণটা পড়ো। Keyword-গুলো খেয়াল করো: plan আর key, সবচেয়ে সস্তা, push, server বা container, private, একটা function, WAF আর cache।

১. একটা scenario বেছে নাও(প্রথমবারেই ঠিক: 0/7)

একটা delivery platform নিজের tracking API অন্য company-দের জন্য খুলে দিচ্ছে: মাসে ১০,০০০ call-এর একটা free plan আর বেশি সীমার একটা paid plan। প্রত্যেক company পায় নিজের key, আর কেউ অন্যদের ভাগ খেয়ে ফেলতে পারবে না।

২. তোমার উত্তর

#কোথায় গোলমাল হয়

লক্ষণসম্ভাব্য কারণসমাধান
২৯ সেকেন্ড পরে 504; Lambda-র log বলছে সে পরে শেষ করেছেকাজটা integration timeout-এর চেয়ে লম্বাAsynchronous বানাও (202 + SQS বা Step Functions + polling বা WebSocket); কাজ দ্রুত করো; Regional/private REST হলে বেশি timeout চাও
502 Bad Gateway “Malformed Lambda proxy response”Function statusCode, headers, string body ছাড়া অন্য কিছু ফেরত দিয়েছে, বা error ছুড়েছেProxy format-এ ফেরত দাও; body-কে JSON.stringify করো; function-এর log পড়ো
500, log-এ “Invalid permissions on Lambda function”apigateway.amazonaws.com-এর জন্য resource-based policy নেইAPI-র source ARN দিয়ে aws lambda add-permission
413 Request Entity Too LargeBody ১০ MB-র বেশি (Lambda হলে ৬ MB-র বেশি)Presigned S3 upload
শুধু একটা client পাচ্ছে 429তার usage plan-এর rate বা quotaBackoff দিয়ে আবার চেষ্টা; plan upgrade
সবাই পাচ্ছে 429, সব API জুড়েএকটা API-র চাপে account-এর সীমা (Region-এ ১০,০০০ rps) ছুঁয়ে গেছেStage আর method-এর throttle; quota বাড়ানো; caching
401Token নেই, বিকৃত, বা মেয়াদ শেষAuthorization header পাঠাও; token refresh করো
দেখতে ঠিক URL-এ 403 “Missing Authentication Token”ভুল path বা stage, বা এমন method যা নেইURL-এর stage-এর নাম আর resource path মিলিয়ে দেখো
বৈধ user পাচ্ছে 403Lambda authorizer-এর Deny, IAM policy, resource policy বা WAFকোন স্তর আটকেছে দেখো (execution log, WAF log)
Browser console-এ CORS error, অথচ curl চলেPreflight-এ বা proxy response-এ Access-Control-Allow-Origin নেইCORS চালু করো; Lambda proxy হলে function-এও header যোগ করো
Console-এ বদল করলাম, কিছুই হলো নাREST API stage-এ আবার deploy করা হয়নিStage-এ deploy করো (HTTP API-তে auto-deploy)
User-রা কয়েক মিনিট ধরে পুরোনো data দেখছেAPI cache-এর TTLওই method-এর TTL কমাও, cache flush করো, cache key ভেবে বাছো
বাতিল করা partner এখনো ঢুকতে পারছেLambda authorizer-এর ফল cache-এসংবেদনশীল API-তে authorizer-এর TTL ছোট রাখো
Custom domain certificate খুঁজে পাচ্ছে নাEdge-optimized domain, অথচ certificate us-east-1-এর বাইরেus-east-1-এ request বা import করো
VPC থেকে private API-তে পৌঁছানো যাচ্ছে নাexecute-api-এর interface endpoint নেই, বা resource policy ওই endpoint-কে অনুমতি দেয় নাEndpoint বানাও, aws:SourceVpce-কে অনুমতি দাও

#System design-এ API Gateway

  • Serverless-এর default সামনের দরজা: client → API Gateway → Lambda → DynamoDB, user-এর জন্য Cognito (lesson ১৫.৮-এর to-do app আর blog-এর design)।
  • Default-এ HTTP API, আর key, plan, caching, validation, WAF বা private endpoint লাগলে REST API। অনেক company দুটোই চালায়: নিজের app-এর জন্য সস্তা HTTP API, আর partner-দের জন্য একটা REST API।
  • Synchronous call ছোট রাখো: কয়েক সেকেন্ডের মধ্যে। এর চেয়ে লম্বা যেকোনো কাজ যায় queue বা workflow দিয়ে, আর client poll করে বা WebSocket-এ কান পেতে থাকে।
  • সরাসরি service integration (SQS, Kinesis, Step Functions, DynamoDB) মাঝের “আঠা” Lambda function বাদ দেয়, তাতে টাকা, latency আর concurrency তিনটাই বাঁচে।
  • স্তরে স্তরে সুরক্ষা: edge-এ WAF, পরিচয়ের জন্য authorizer, client ধরে usage plan, stage আর method-এর throttle, পেছনের function-এ reserved concurrency (lesson ১৫.২), যাতে একটা বন্যা সব শুষে নিতে না পারে।
  • যা অনেকে চায় শুধু সেটাই cache করো; key আর TTL method ধরে বাছো।
  • Environment ধরে stage, stage ধরে Lambda alias, ঝুঁকির পরিবর্তনে canary release; সবকিছু OpenAPI বা infrastructure as code-এ লিখে রাখো।
  • নজর রাখো: 5XXError, Latency আর IntegrationLatency-এর ওপর alarm; access log; ধীর পথ খুঁজতে X-Ray।

#নিজে করে দেখো

একটা function-এর সামনে একটা HTTP API, তারপর usage plan আর cache-ওয়ালা একটা REST API, ap-southeast-1-এ, account 111122223333। Output ছোট করে দেখানো।

# 1. Quick-create an HTTP API with a Lambda proxy integration (one route, $default stage, auto-deploy)
aws apigatewayv2 create-api --name shop-http-example --protocol-type HTTP \
  --target arn:aws:lambda:ap-southeast-1:111122223333:function:products-example
#   { "ApiId": "a1b2c3d4e5", "ApiEndpoint": "https://a1b2c3d4e5.execute-api.ap-southeast-1.amazonaws.com", ... }

# Quick create adds the invoke permission; with a manual setup you must add it yourself:
aws lambda add-permission --function-name products-example \
  --statement-id apigw-invoke --action lambda:InvokeFunction \
  --principal apigateway.amazonaws.com \
  --source-arn "arn:aws:execute-api:ap-southeast-1:111122223333:a1b2c3d4e5/*"

curl -s https://a1b2c3d4e5.execute-api.ap-southeast-1.amazonaws.com/products/42
#   {"id":"42","name":"Panjabi","price":2450}

# 2. A REST API (Regional) for partners: create a usage plan with throttle and quota
aws apigateway create-usage-plan --name free-example \
  --throttle burstLimit=20,rateLimit=10 --quota limit=10000,period=MONTH \
  --api-stages apiId=x9y8z7w6v5,stage=prod
#   { "id": "pl4n1d", "name": "free-example", "throttle": {"burstLimit": 20, "rateLimit": 10.0}, ... }

aws apigateway create-api-key --name shop-a-example --enabled
#   { "id": "k3y1d", "value": "Ab12Cd34Ef56Gh78Ij90Kl12Mn34Op56Qr78St90", ... }
aws apigateway create-usage-plan-key --usage-plan-id pl4n1d --key-id k3y1d --key-type API_KEY

# 40 calls in one second from the free key: some come back 429
for i in $(seq 40); do curl -s -o /dev/null -w "%{http_code} " \
  -H "x-api-key: Ab12Cd34Ef56Gh78Ij90Kl12Mn34Op56Qr78St90" \
  https://x9y8z7w6v5.execute-api.ap-southeast-1.amazonaws.com/prod/track/7781 & done; wait
#   200 200 200 ... 429 429 200 429 ...

# 3. Turn on a 0.5 GB cache on the prod stage, TTL 600 s for all methods
aws apigateway update-stage --rest-api-id x9y8z7w6v5 --stage-name prod --patch-operations \
  op=replace,path=/cacheClusterEnabled,value=true \
  op=replace,path=/cacheClusterSize,value=0.5 \
  op=replace,path=/*/*/caching/enabled,value=true \
  op=replace,path=/*/*/caching/ttlInSeconds,value=600

# Data changed? Flush the stage cache
aws apigateway flush-stage-cache --rest-api-id x9y8z7w6v5 --stage-name prod

# 4. Check the account throttle limits for the Region
aws apigateway get-account --query throttleSettings
#   { "burstLimit": 5000, "rateLimit": 10000.0 }

Loop চলার সময় CloudWatch-এ Count, 4XXError, 5XXError, CacheHitCount আর CacheMissCount metric দেখো। কাজ শেষে cache মুছে দিয়ো: যতক্ষণ থাকে, প্রতি ঘণ্টায় bill হয়।

#সারসংক্ষেপ

মূল কথাগুলো

  • API Gateway হলো একটা API-র managed সামনের দরজা: routing, stage, security, API key আর usage plan, throttling, validation, transformation, caching, OpenAPI import, SDK বানানো, WebSocket, request ধরে টাকা। চেনা serverless API: client → API Gateway → Lambda → DynamoDB। “Expose Lambda as a RESTful API” → API Gateway।
  • তিন রকম API: REST (সব feature: key, usage plan, cache, validation, WAF, private endpoint; প্রতি ১০ লাখে প্রায় $৩.৫০), HTTP (সস্তা, প্রতি ১০ লাখে প্রায় $১.০০, দ্রুত, JWT authorizer, শুধু Regional, ৩০ সে), WebSocket (দুই দিকে, server push, $connect/$disconnect, @connections)।
  • Integration: Lambda proxy (function ফেরত দেয় statusCode, headers, body) বা mapping template-সহ custom; HTTP backend (ALB, অফিসের server, VPC link), যাতে rate limiting, caching, auth আর key যোগ হয়; সরাসরি AWS service-এর API (Kinesis Data Streams → Firehose → S3, SQS, Step Functions), একটা IAM role দিয়ে; mock। Lambda-র apigateway.amazonaws.com-এর জন্য resource policy লাগে।
  • Endpoint: edge-optimized (REST-এর default, CloudFront edge হয়ে, তবু এক Region-এ, edge-এ caching নেই), Regional (একই Region-এর client, বা নিজের CloudFront), private (interface VPC endpoint + resource policy)। Custom domain-এর certificate edge-optimized হলে us-east-1-এ, Regional হলে API-র Region-এ; Route 53 alias বা CNAME।
  • Security: ভেতরের caller-এর জন্য IAM/SigV4, বাইরের user-এর জন্য Cognito user pool (API Gateway নিজেই JWT যাচাই করে), নিজের যুক্তির জন্য Lambda authorizer (IAM policy ফেরত দেয়, default-এ ৩০০ সে cache), উৎস ধরে resource policy আর WAF। 401 = তুমি কে; 403 = অনুমতি নেই। API key authentication না।
  • Throttling: token bucket, account-এ Region ধরে ১০,০০০ rps + ৫,০০০ burst, সব API-র ভাগাভাগি; stage, method আর client ধরে usage plan-এর সীমা; সীমা পেরোলে → 429। Throttling DDoS-এর সুরক্ষা না: WAF আর Shield নাও।
  • Caching (শুধু REST): TTL default ৩০০ সে, ০–৩,৬০০ সে, ০.৫–২৩৭ GB ঘণ্টা ধরে bill, stage ধরে, flush করা যায়; “performance বাড়াও আর backend-এর চাপ কমাও” → caching চালু করো।
  • Limit: ২৯ সে integration timeout (504, function তবু চলতে থাকে; বাড়ানো যায় শুধু Regional/private REST-এ; ২০২৫ থেকে streaming ১৫ মিনিট পর্যন্ত), ১০ MB payload (Lambda-তে ৬ MB), তাই লম্বা কাজ async-এ আর বড় file presigned URL দিয়ে S3-এ। CORS error → CORS চালু করো।
  • API Gateway বনাম ALB: request ধরে দাম + API management + cache + IAM/Cognito/Lambda authorizer, বনাম ঘণ্টা + LCU, EC2/container (আর Lambda)-এর জন্য load balancing, HTTPS listener-এ Cognito/OIDC। “EC2/container-এ monolith” → ALB; “usage plans, API keys, throttle third-party developers” → API Gateway; একটা function, একটা URL → function URL।