Course-এর সূচি

15.7

Step Functions আর Cognito

ধাপে ধাপে সাজানো workflow, user pool বনাম identity pool, আর অ্যাপের user-দের জন্য row-level security।

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

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

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

  • বুঝিয়ে বলতে, কেন কয়েক ধাপের একটা কাজ (একটা order, একটা loan, একটা data job) Lambda function দিয়ে একটা আরেকটাকে ডাকানোর বদলে AWS Step Functions-এর state machine-এ রাখা উচিত।
  • Task, Choice, Wait, Parallel, Map, Pass, Succeed আর Fail state, সাথে Retry আর Catch rule দিয়ে ছোট একটা Amazon States Language definition পড়তে আর লিখতে।
  • Callback pattern (.waitForTaskToken) দিয়ে একজন মানুষের জন্য workflow থামিয়ে রাখতে, আর তিনটা service integration pattern চিনতে।
  • সময়, execution-এর নিশ্চয়তা, history আর দাম দেখে Standard আর Express workflow-এর মধ্যে বেছে নিতে, আর দুটোরই মাসিক bill হিসাব করতে।
  • Cognito user pool কী (sign-up, sign-in, MFA, federation, managed login, JWT, feature plan) সেটা বলতে, আর একে API Gateway আর ALB-র সাথে জুড়তে।
  • Cognito identity pool দিয়ে app-এর user-দের অস্থায়ী AWS credential দিতে, guest access আর DynamoDB-তে row-level security (dynamodb:LeadingKeys) সহ।
  • পরীক্ষার keyword দেখে user pool আর identity pool, আর Cognito আর IAM আলাদা করতে।

#কেন orchestration: function দিয়ে function ডাকার ঝামেলা

Lesson 15.1 থেকে 15.6 পর্যন্ত তুমি যন্ত্রাংশগুলো পেয়েছ: Lambda function, DynamoDB table, সামনে একটা API। কিন্তু বাস্তবের business process খুব কমই একটা function-এ শেষ হয়। এগুলো আসলে ধাপের পর ধাপ, মাঝে সিদ্ধান্ত, অপেক্ষা আর fail।

তুমি চাইলে Payment function থেকে সরাসরি Inventory function ডাকতে পারো, আর Inventory থেকে Shipping। প্রথম দিন কাজ চলবে, তারপর প্রতিদিন ভোগাবে:

  • প্রতিটা function-কে পরেরটা চিনতে হয়। ধাপের ক্রম বদলালে তিনটা function আবার deploy করতে হয়।
  • Error সামলানো তোমার code-এর ঘাড়ে। প্রতিটা function-এ নিজের retry loop, backoff আর “আমি যা করেছি তা উল্টাও” logic লাগে।
  • অপেক্ষার জন্যও টাকা দাও। যে function আরেকটার জন্য synchronous ভাবে অপেক্ষা করে, পুরো অপেক্ষার সময়টার bill তার নামে ওঠে, আর সে Lambda-র ১৫ মিনিটের সীমার বেশি কখনো অপেক্ষা করতে পারে না (lesson 15.2)। Manager-এর জন্য দুই দিন অপেক্ষা? অসম্ভব।
  • কোন order কোথায় আছে কেউ জানে না। অবস্থাটা কয়েকটা function-এর log-এ ছড়িয়ে-ছিটিয়ে থাকে।

Step Functions এই সবকিছু এক জায়গায় নিয়ে আসে: একটা state machine, যে প্রতিটা ধাপ ডাকে, data এগিয়ে দেয়, retry করে, error ধরে, অপেক্ষা করে, আর প্রতিটা execution-এর (workflow-এর একবারের run, যেমন একটা order) history লিখে রাখে।

#AWS Step Functions: state machine

#Amazon States Language আর Workflow Studio

State machine লেখা হয় Amazon States Language (ASL)-এ, এটা একটা JSON document, যেখানে state-গুলোর তালিকা আর কোনটার পর কোনটা, সেটা থাকে। হাতে টাইপ করতে হয় কমই: console-এর drag-and-drop designer Workflow Studio (AWS Toolkit দিয়ে Visual Studio Code-এও আছে) graph আঁকে আর তোমার হয়ে ASL লিখে দেয়। তারপর console-এ প্রতিটা execution তুমি সেই graph হিসেবেই দেখো: প্রতিটা state সবুজ, লাল বা চলছে, সাথে তার input আর output।

ছোট করে order workflow-টা:

{
  "Comment": "Order workflow for the Dhaka shop",
  "StartAt": "Charge payment",
  "States": {
    "Charge payment": {
      "Type": "Task",
      "Resource": "arn:aws:states:::lambda:invoke",
      "Arguments": { "FunctionName": "payment-example", "Payload": "{% $states.input %}" },
      "Output": "{% $states.result.Payload %}",
      "Next": "Paid?"
    },
    "Paid?": {
      "Type": "Choice",
      "Choices": [{ "Condition": "{% $states.input.payment = 'paid' %}", "Next": "Reserve stock" }],
      "Default": "Payment declined"
    },
    "Reserve stock": {
      "Type": "Task",
      "Resource": "arn:aws:states:::lambda:invoke",
      "Arguments": { "FunctionName": "inventory-example", "Payload": "{% $states.input %}" },
      "Retry": [{
        "ErrorEquals": ["Lambda.TooManyRequestsException", "States.TaskFailed"],
        "IntervalSeconds": 2, "BackoffRate": 2, "MaxAttempts": 3
      }],
      "Catch": [{ "ErrorEquals": ["States.ALL"], "Next": "Refund payment" }],
      "Next": "Ship and notify"
    },
    "Ship and notify":  { "Type": "Parallel", "Branches": ["…ship…", "…SNS publish…"], "Next": "Done" },
    "Refund payment":   { "Type": "Task", "Resource": "arn:aws:states:::lambda:invoke", "Arguments": { "FunctionName": "refund-example" }, "Next": "Order failed" },
    "Payment declined": { "Type": "Fail", "Error": "PaymentDeclined", "Cause": "Card declined" },
    "Order failed":     { "Type": "Fail", "Error": "OrderFailed" },
    "Done":             { "Type": "Succeed" }
  },
  "QueryLanguage": "JSONata"
}

#আট রকমের state

Stateকী করেরোজকার উদাহরণ
Taskএকটা কাজ করে: Lambda function ডাকে, কোনো AWS service ডাকে, ECS task চালায়, HTTPS API ডাকে, বা activity worker-এর অপেক্ষা করেCard থেকে টাকা কাটা
ChoiceData দেখে শাখা বাছে, if / switch-এর মতো; সবসময় একটা Default দিয়োPaid? Declined?
Waitকয়েক সেকেন্ড বা একটা নির্দিষ্ট সময় পর্যন্ত থামে, কোনো compute খরচ ছাড়াDelivery-র ৭ দিন পর review চাওয়া
Parallelকয়েকটা branch একসাথে চালায়, সবগুলো শেষ হলে এগোয়; একটা branch fail করলে পুরো state failপাঠানো আর জানানো একসাথে
Mapএকটা array-র প্রতিটা item-এর জন্য (inline), বা S3-এর বিশাল data-র জন্য (distributed) একই ধাপ চালায়Order-এর প্রতিটা item আটকে রাখা
PassInput-কে output-এ পাঠিয়ে দেয়, চাইলে data যোগ করে বা নতুন আকারে সাজায়; default বসাতে আর test-এ কাজে লাগে"currency": "BDT" যোগ করা
SucceedExecution (বা একটা branch) সফলভাবে শেষ করেOrder সম্পূর্ণ
FailExecution-টা failed হিসেবে শেষ করে, error-এর নাম আর কারণ তুমিই দাওPayment declined

Slide-এর feature তালিকা এক লাইনে: sequence, parallel, condition (Choice), timeout, error handling, সবই configuration।

একটা order, একটা state machine: ধাপগুলো চালায় Step Functions

ঢাকার একটা e-commerce shop প্রতিটা order তিন ধাপে সামলায়: payment কাটো, stock আটকে রাখো, পাঠিয়ে দাও। প্রতিটা ধাপ একটা ছোট Lambda function। এরপর কোনটা চলবে সেটা ঠিক করে Step Functions, যেটা fail করে সেটা আবার চালায়, আর প্রতিটা order কোথায় আছে মনে রাখে।

পরিস্থিতি

Start → Task (payment) → Choice → Task (stock) → Parallel (পাঠানো + খবর দেওয়া) → Succeed।

Lambda task
Checkout API
Step Functionsorder-example
Customer-কে খবর
Payment
Inventory
Shipping
Refund
start-execution

Execution order-5501

state

Start

orderId

5501

amount

২,৪৫০ টাকা

status

চলছে

ধাপ 1 / 6
1

Checkout API প্রতিটা order-এর জন্য state machine-এর একটা execution চালু করে, আর order-টা JSON input হিসেবে দিয়ে দেয়। এখান থেকে API-র ছুটি: সে অপেক্ষা করে না, ধাপগুলো কী কী সেটাও তার জানার দরকার নেই।

#Retry আর Catch

যেকোনো Task, Parallel বা Map state-এ error সামলানোর দুটো অংশ থাকতে পারে।

  • Retry: কয়েকটা rule-এর তালিকা, প্রতিটায় ErrorEquals (কোন error), IntervalSeconds (প্রথম অপেক্ষা, default ১), BackoffRate (গুণক, default ২.০), MaxAttempts (default ৩; ০ মানে কখনো retry না), আর চাইলে MaxDelaySeconds আর retry ছড়িয়ে দিতে JitterStrategy: FULL। Interval ২ আর backoff ২ হলে অপেক্ষা হয় ২, ৪ আর ৮ সেকেন্ড।
  • Catch: Retry শেষ হয়ে গেলে (বা যে error-এর কোনো retry rule নেই তার জন্য), মিলে যাওয়া একটা catcher execution-কে একটা উদ্ধারের state-এ পাঠায়, error-টা data-র ভেতরে রেখে। কোনো catcher না মিললে পুরো execution fail করে।

যে error-এর নাম চিনে রাখা দরকার: States.ALL (সব error-এর সাথে মেলে), States.TaskFailed, States.Timeout (কোনো state তার TimeoutSeconds-এর বেশি চলেছে, বা execution সর্বোচ্চ সীমায় পৌঁছেছে), States.HeartbeatTimeout, States.Permissions, States.NoChoiceMatched, আর service-এর error যেমন Lambda.TooManyRequestsException বা Lambda.ServiceException, সাথে তোমার function-এর ছোড়া যেকোনো নিজস্ব error।

Order animation-এর “Catch আর refund” scenario-টা হলো saga pattern: পরের কোনো ধাপ fail করলে compensating action চালাও, যা আগের ধাপগুলো উল্টে দেয় (payment ফেরত, stock ছেড়ে দেওয়া)। AWS-এ saga বানানোর চেনা উপায় Step Functions, কারণ Catch rule উল্টানোর পথটা চোখের সামনে আর নির্ভরযোগ্য করে রাখে।

Fail করা একটা Standard execution ১৪ দিনের মধ্যে redrive করা যায়: কারণটা ঠিক করার পর এটা শুরু থেকে না, যে state-এ fail করেছিল সেখান থেকে আবার চলে, তাই customer-এর টাকা দ্বিতীয়বার কাটে না।

#মানুষের জন্য অপেক্ষা: callback pattern

Slide-এ আছে human approval feature, আর notes পরীক্ষার কৌশলটা দিয়ে দিয়েছে: কোনো process শেষ হতে কয়েক ঘণ্টা বা কয়েক দিন লাগতে পারলে, যেমন manual approval-এর অপেক্ষা, উত্তর হবে Standard workflow সহ Step Functions।

Service ডাকা প্রতিটা Task তিনটা service integration pattern-এর কোনো একটা ব্যবহার করে:

PatternARN-এর suffixStep Functions…উদাহরণ
Request Response(নেই)Service ডাকে, HTTP response পায়, সাথে সাথে এগিয়ে যায়SNS-এ publish, DynamoDB-তে item রাখা
Run a job.syncJob চালু করে আর শেষ না হওয়া পর্যন্ত অপেক্ষা করেECS task, Glue job, Batch job, একটা child workflow চালাও, শেষ হলে এগোও
Wait for callback.waitForTaskTokenকারও কাছে একটা task token পাঠায় আর token ফেরত না আসা পর্যন্ত থেমে থাকেManager-কে email, বাইরের কোনো system বা মানুষের জন্য অপেক্ষা

Callback pattern-এ Step Functions যে message পাঠায় (একটা SNS email, একটা SQS message, একটা Lambda payload) তার ভেতরে একটা অনন্য task token রেখে দেয়। কাজ যে শেষ করে, সে token-টা ফেরত দিয়ে SendTaskSuccess (output সহ) বা SendTaskFailure (error সহ) ডাকে। লম্বা সময় চলা worker SendTaskHeartbeat-ও ডাকতে পারে; থেমে গেলে HeartbeatSeconds task-টাকে fail করায়। Callback Task-এ সবসময় TimeoutSeconds দিয়ো, নইলে সেটা এক বছরের সর্বোচ্চ সীমা পর্যন্ত অপেক্ষা করতে পারে।

মানুষের জন্য অপেক্ষা: task token দিয়ে callback

একটা microfinance প্রতিষ্ঠান ছোট loan নিজে থেকেই অনুমোদন করে, কিন্তু credit score সীমানায় থাকলে একজন loan officer-কে অনুমোদন দিতে হয়। Workflow কিছু না চালিয়ে দিনের পর দিন থেমে থাকে, তারপর officer click করা মাত্র আবার চলতে শুরু করে।

পরিস্থিতি

Loan app
Step FunctionsStandardচলছে
Notifyemail
Loan officer
Approve link+ Lambda
শুরু: ৫ লাখ টাকার loan
ধাপ 1 / 8
1

নারায়ণগঞ্জের এক দোকান মালিক ৫ লাখ টাকার loan চাইলেন। App আবেদনটা input হিসেবে দিয়ে একটা Standard workflow execution চালু করে।

#Step Functions কাকে কাকে ডাকতে পারে

Slide বলছে Step Functions EC2, ECS, on-premises server, API Gateway, SQS আর আরও অনেকের সাথে জোড়া লাগে। আজ এর তিনটা স্তর:

  • Optimized integration, বিশেষ সুবিধা সহ (.sync, callback, সহজ parameter): Lambda, ECS আর Fargate, AWS Batch, DynamoDB, SNS, SQS, Glue, SageMaker, EventBridge, API Gateway, Athena, EMR, Bedrock, আর অন্য Step Functions workflow (nested workflow)।
  • AWS SDK integration: একটা Task থেকেই ২২০-এর বেশি AWS service-এর প্রায় যেকোনো API সরাসরি ডাকো (arn:aws:states:::aws-sdk:s3:copyObject), মাঝে কোনো Lambda function ছাড়া। পুরোনো material-এ লেখা “২০০+ service”; দুটোর মানেই “প্রায় সবকিছু”।
  • HTTP Task: যেকোনো public HTTPS API ডাকো (একটা payment gateway, Salesforce), credential রাখা থাকে একটা EventBridge connection-এ।

AWS-এর managed service-এর বাইরে চলা code-এর জন্য, যেমন একটা EC2 instance বা অফিসের server-এর program, ব্যবহার করো activity: worker GetActivityTask দিয়ে কাজ টেনে আনে, কাজ করে, আর task token দিয়ে ফল ফেরত দেয়। Activity শুধু Standard-এ চলে।

Execution চালু করা যায় console থেকে, SDK বা CLI দিয়ে (StartExecution), API Gateway থেকে, একটা EventBridge rule বা schedule থেকে (lesson 19.5), একটা Lambda function থেকে, বা আরেকটা state machine থেকে। Slide-এর use case: order fulfilment, data processing, web application, যেকোনো workflow।

“জোড়া লাগানোর” Lambda function-এর বদলে service সরাসরি ডাকলে খরচ কম, চলমান অংশও কম: একটা dynamodb:putItem Task-এর কোনো cold start নেই, patch করার code নেই, Lambda-র bill-ও নেই।

#Standard বনাম Express workflow

State machine বানানোর সময় তুমি এর type বেছে নাও, আর পরে আর বদলানো যায় না। মূল কথাটা notes-এ: Standard চলতে পারে ১ বছর পর্যন্ত (লম্বা process), Express সর্বোচ্চ ৫ মিনিট (বিপুল সংখ্যায়, দ্রুত কাজ)। বাকিগুলোও সমান জরুরি:

StandardExpress
সর্বোচ্চ সময়১ বছর৫ মিনিট
Execution-এর নিশ্চয়তাExactly-once: Retry না দিলে প্রতিটা state একবারই চলেAsynchronous: at-least-once; synchronous: at-most-once
কোথায় মানায়লম্বা, টেকসই, হিসাব রাখার মতো, non-idempotent ধাপ (payment, EMR cluster চালু করা)ছোট, বিপুল সংখ্যায়, idempotent event processing (IoT ingestion, streaming transform, mobile আর API backend)
দামপ্রতি state transition: প্রতি ১,০০০-এ ০.০২৫ USD (মাসে ৪,০০০টা ফ্রি, চিরকাল)প্রতি execution + সময় × memory: প্রতি ১০ লাখে ১.০০ USD, সাথে প্রথম ১,০০০ GB-ঘণ্টা প্রতি GB-ঘণ্টায় ০.০৬ USD (ওপরে কম দাম)
Execution historyStep Functions ৯০ দিন রাখে, console-এ ছবি দেখে debugরাখে না: CloudWatch Logs চালু করো
Callback (.waitForTaskToken) আর .syncআছেনেই
Distributed Map, activity, redriveআছেনেই
চালুর হার (default)বড় Region-গুলোতে সেকেন্ডে প্রায় ৩০০ (token bucket, বাড়ানো যায়)সেকেন্ডে প্রায় ৬,০০০; state transition-এ কোনো সীমা নেই
কীভাবে চালু হয়Asynchronous (StartExecution)Asynchronous (StartExecution) বা synchronous (StartSyncExecution, ফল ফেরত দেয়, যেমন API Gateway-র পেছনে)

দাম US East (N. Virginia)-এর list price, অক্টোবর ২০২৬-এ যাচাই করা। Workflow যে Lambda function বা অন্য service ডাকে, তার bill আলাদা।

একটা হিসাব করে দেখি: একটা API backend মাসে ১০ লাখ execution চালায়, প্রতিটায় ১০টা state transition, প্রতিটা চলে ২ সেকেন্ড, ৬৪ MB-তে।

  • Standard: ১,০০,০০,০০০ transition − ৪,০০০ ফ্রি = ৯৯,৯৬,০০০ × ০.০০০০২৫ = প্রায় ২৪৯.৯০ USD।
  • Express: request বাবদ ১০,০০,০০০ × ১.০০ / ১০,০০,০০০ = ১.০০ USD; সময় বাবদ ১০,০০,০০০ × ২ সেকেন্ড × ০.০৬২৫ GB = ১,২৫,০০০ GB-second = ৩৪.৭ GB-ঘণ্টা × ০.০৬ = ২.০৮ USD; মোট প্রায় ৩.০৮ USD।

একই workflow Express-এ ৮০ গুণ সস্তা, যদি সেটা ছোট আর idempotent হয়। উল্টোটাও দেখো: একটা loan approval মাসে ৩,০০০ বার চলে, প্রতিবার ১২টা transition, মোট ৩৬,০০০ transition, Standard-এ ০.৮০ USD, আর Express এটা পারেই না (কয়েক দিন অপেক্ষা করে, callback লাগে)।

Standard নাকি Express: একটা workflow-এর খরচ কত?

বেছে নাও workflow কত ঘনঘন চলে, প্রতিবার কয়টা state পেরোয়, একবার চলতে কত সময় লাগে আর কত memory লাগে। বলে দাও এটা কোনো মানুষ বা লম্বা কাজের জন্য অপেক্ষা করে কিনা, আর কোনো ধাপ দুবার চললে বিপদ কিনা। তারপর দুই ভাবেই এক মাসের হিসাব করো।

মাসে কয়টা execution

প্রতি execution-এ state transition

গড় সময়

Memory (৬৪ MB ধাপে bill)

কোনো মানুষ বা লম্বা কাজের অপেক্ষা?

কোনো ধাপ দুবার চলা চলবে না (payment)?

ফল দেখতে “হিসাব করো” চাপো।

#বড় মাপের Map: Distributed Map

Inline Map একটা execution-এর ভেতরেই iteration চালায় (একসাথে সর্বোচ্চ ৪০টা, আর প্রতিটা iteration-এর event ওই execution-এর ২৫,০০০ entry-র history-তেই জমা হয়), তাই পুরো array-টা একটা state-এর input আর output-এর ২৫৬ KiB সীমার মধ্যে আঁটতে হবে। Distributed Map (শুধু Standard) item-গুলো সরাসরি S3 থেকে পড়ে (একটা CSV, একটা JSON array, বা একটা prefix-এর নিচের সব object) আর একসাথে ১০,০০০ পর্যন্ত child workflow execution চালু করে, যেগুলোর প্রতিটা Express হতে পারে। “লাখ লাখ S3 object process করো”, retry আর fail-এর report সহ, নিজে fan-out না লিখে: উত্তর এটাই।

#Amazon Cognito: তোমার app-এর user-দের পরিচয়

IAM (chapter 2) তাদের জন্য, যে মানুষ আর workload AWS চালায়। তোমার দোকানের customer, তোমার app-এর যাত্রী, তোমার বিশ্ববিদ্যালয়ের student, এরা AWS user না, আর সংখ্যায় লাখো হতে পারে। Amazon Cognito তোমার web আর mobile app-এর user-দের একটা পরিচয় দেয়: sign-up, sign-in আর access control। Notes জোর দিয়ে বলেছে, এর দুটো অংশ, আর পরীক্ষার সবচেয়ে গোলমেলে প্রশ্নগুলো আসে এখান থেকেই:

User pool (CUP)Identity pool (CIP, “federated identities”)
Notes-এর ছবিপরিচয়পত্র বা ID card: তুমি কে, প্রমাণ করেঅফিসের access card: নির্দিষ্ট দরজা খোলে
কাজAuthentication (“তুমি কে?”): sign-up, sign-in, password reset, MFA সহ একটা user directoryAWS-এ authorization (“AWS-এ তুমি কী করতে পারবে?”): অস্থায়ী AWS credential
App-কে দেয়JWT (ID, access আর refresh token)STS থেকে একটা access key, secret key আর session token
কার সাথেতোমার API (API Gateway, ALB), তোমার backendসরাসরি AWS service: S3, DynamoDB, IoT, Kinesis…
Guestনা (শুধু sign in করা user)হ্যাঁ, চাইলে একটা unauthenticated role

দুটো প্রায়ই একসাথে ব্যবহার হয়: user sign in করে user pool-এ, আর identity pool user pool-এর token বিশ্বাস করে সেটাকে AWS credential-এ বদলে দেয়।

#Cognito user pool

User pool হলো তোমার web আর mobile app-এর জন্য একটা serverless user directory। Slide-এর feature-গুলো, আজকের service-এর সাথে মিলিয়ে:

  • Username বা email (বা phone) আর password দিয়ে sign-up আর sign-in, তোমার ঠিক করা password policy সহ।
  • Code দিয়ে email আর phone number যাচাই, আর যাচাই করা ঠিকানা দিয়ে password reset (“forgot password”)।
  • MFA: authenticator app (TOTP), SMS, আর email-এ one-time code; ঐচ্ছিক বা বাধ্যতামূলক। Passkey বা one-time code দিয়ে passwordless sign-in-ও আছে।
  • Federation: user-রা Google, Facebook, Apple, Login with Amazon, বা company-র একটা SAML 2.0 বা OIDC identity provider দিয়ে sign in করুক, তবুও তোমার pool থেকে একই token পাবে।
  • Managed login: Cognito তোমার domain-এ তৈরি sign-in, sign-up আর reset page host করে দেয় (পুরোনো version-এর নাম hosted UI)। এটা একটা OAuth 2.0 / OIDC authorization server-ও।
  • প্রতিটা ধাপ নিজের মতো করতে Lambda trigger: pre sign-up (disposable email আটকাও), post confirmation (profile row বানাও, স্বাগত message পাঠাও), pre token generation (claim যোগ করো), custom auth challenge, পুরোনো database থেকে user migration।
  • Group, চাইলে identity pool-এর জন্য IAM role সহ, আর CSV থেকে user import।
  • Compromised-credential যাচাই আর adaptive authentication (Plus plan-এর threat protection): ফাঁস হওয়া password দিয়ে, বা অচেনা device বা জায়গা থেকে আসা sign-in আটকাও বা বাড়তি প্রমাণ চাও।

Sign in-এর পর pool তিনটা token ফেরত দেয়:

Tokenধরনকী বলেDefault মেয়াদ
ID tokenJWTUser কে: sub, email, নাম, group১ ঘণ্টা (৫ মিনিট থেকে ১ দিন)
Access tokenJWTApp কী ডাকতে পারবে: scope, group১ ঘণ্টা (৫ মিনিট থেকে ১ দিন)
Refresh tokenOpaquePassword ছাড়াই নতুন ID আর access token আনে৩০ দিন (১ ঘণ্টা থেকে ১০ বছর)

JWT-গুলো pool-এর private key দিয়ে sign করা। Pool-এর public key (JWKS URL) দিয়ে যে কেউ এগুলো যাচাই করতে পারে, Cognito-কে না ডেকেই, এ কারণেই API Gateway আর ALB পলকে এগুলো যাচাই করতে পারে।

#দুটো সামনের দরজা: API Gateway আর ALB

Slide দেখায়, user pool ঠিক দুটো AWS সামনের দরজার সাথে জোড়া লাগে:

  • API Gateway: app sign in করে token পায়, আর Authorization header-এ পাঠায়। একটা Cognito user pool authorizer (REST API) বা JWT authorizer (HTTP API) signature, মেয়াদ, issuer আর audience যাচাই করে claim-গুলো backend-কে দেয়; অচল token তোমার code ছোঁয়ার আগেই 401 পায় (lesson 15.6)।
  • Application Load Balancer: HTTPS listener rule-এ একটা authenticate-cognito action, session ছাড়া browser-কে managed login page-এ পাঠায়, নিজেই code দিয়ে token আনে, session cookie বসায়, আর x-amzn-oidc-* header-এ user-এর পরিচয় দিয়ে request এগিয়ে দেয় (lesson 6.3)। পেছনের application-এ login-এর কোনো code-ই লাগে না।

Cognito user pool: sign-up, sign-in আর token

একটা ride-sharing app তার যাত্রীদের রাখে একটা Cognito user pool-এ। Pool user আর তাদের password জমা রাখে, sign-in-এর সময় যাচাই করে, আর JWT token দেয়, যেটা API Gateway বা ALB আবার Cognito-কে জিজ্ঞেস না করেই যাচাই করতে পারে।

পরিস্থিতি

Clientapp বা browser
User poolriders-example
API Gateway
ALB
Backend
sign up: email + password
ধাপ 1 / 5
1

রাফি app install করে email আর একটা password দিয়ে sign up করে। App সরাসরি user pool-কে ডাকে; তোমার নিজের code-এ কোনো user table বা password hashing নেই।

ছোট একটা যোগ: একটা ride-sharing app-এর মাসে ৬০,০০০ সক্রিয় যাত্রী, Essentials-এ খরচ (৬০,০০০ − ১০,০০০) × ০.০১৫ = মাসে ৭৫০ USD; Plus-এ ৬০,০০০ × ০.০২০ = ১,২০০ USD, এটাই নিজে থেকে breach আর ঝুঁকি যাচাইয়ের দাম।

#Cognito identity pool

Identity pool user-দের একটা পরিচয় দেয়, যাতে তারা অস্থায়ী AWS credential পায় আর AWS service সরাসরি ডাকতে পারে (বা IAM authorization সহ API Gateway দিয়ে)। এটা কোনো user বা password রাখে না; অন্য identity provider-দের বিশ্বাস করে:

  • একটা Cognito user pool,
  • social login (Google, Facebook, Apple, Login with Amazon),
  • যেকোনো SAML বা OIDC provider,
  • developer-authenticated identity (তোমার আগে থেকে চলা নিজের login system),
  • আর তুমি অনুমতি দিলে, কোনো provider ছাড়াই: guest (unauthenticated) user।

কীভাবে চলে (slide-এর diagram): app provider থেকে login করে token পায় → identity pool-এ token বদলায় → pool token যাচাই করে, user-কে একটা স্থায়ী identity ID দেয়, একটা IAM role বাছে আর STS ডাকে (AssumeRoleWithWebIdentity, lesson 2.4-এর federation call) → app পায় অস্থায়ী credential (প্রায় এক ঘণ্টা; SDK নিজে নবায়ন করে) → private S3 bucket আর DynamoDB table-এ সরাসরি access।

কোন role? Default-এ sign in করা user-দের জন্য একটা role, guest-দের জন্য আরেকটা। চাইলে rule দিয়েও user-কে role-এ মেলাতে পারো (যেমন claim department = finance), বা token-এর ভেতরের user pool group থেকে role নিতে পারো। প্রতিটা role-এর trust policy-তে cognito-identity.amazonaws.com আর identity pool ID লেখা থাকে, তাই আর কেউ সেটা assume করতে পারে না।

#Policy variable দিয়ে row-level security

একটা role-ই সব user-কে সামলায়, অথচ প্রত্যেকে যেন শুধু নিজের data-তেই পৌঁছায়। কৌশলটা হলো policy variable ${cognito-identity.amazonaws.com:sub}, যার জায়গায় request-এর সময় IAM বসিয়ে দেয় caller-এর identity ID (lesson 2.1-এর ${aws:username}-এর মতো একই ভাবনা)।

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "OwnPhotosOnly",
      "Effect": "Allow",
      "Action": ["s3:GetObject", "s3:PutObject"],
      "Resource": "arn:aws:s3:::student-photos-example/${cognito-identity.amazonaws.com:sub}/*"
    },
    {
      "Sid": "OwnGradesOnly",
      "Effect": "Allow",
      "Action": ["dynamodb:GetItem", "dynamodb:Query", "dynamodb:PutItem", "dynamodb:UpdateItem"],
      "Resource": "arn:aws:dynamodb:ap-southeast-1:111122223333:table/grades-example",
      "Condition": {
        "ForAllValues:StringEquals": {
          "dynamodb:LeadingKeys": ["${cognito-identity.amazonaws.com:sub}"]
        }
      }
    }
  ]
}

dynamodb:LeadingKeys হলো একটা request যে item-গুলো ছোঁয়, তাদের partition key-এর মান (lesson 15.4)। Condition-টা বলছে “শুধু সেই item, যাদের partition key তোমার নিজের identity ID”। এটাই DynamoDB-তে row-level security (slide-এর শিরোনাম), authorization-এর এক লাইন code ছাড়াই। দুটো জিনিসে লোকে ভুল করে: table-এর partition key-তে রাখতে হবে identity pool-এর identity ID (যেমন ap-southeast-1:7c1e…), user pool-এর sub না; আর Scan-কে এভাবে সীমিত করা যায় না, তাই policy-তে ওটা রেখো না।

Cognito identity pool: app user-দের জন্য AWS credential

একটা বিশ্ববিদ্যালয়ের app প্রতিটা student-কে S3-এ profile photo upload করতে আর DynamoDB থেকে নিজের grade পড়তে দেয়, সরাসরি phone থেকে, মাঝে কোনো API ছাড়া। Identity pool একটা login-কে অস্থায়ী AWS credential-এ বদলে দেয়, যা শুধু ওই student-এর নিজের data পর্যন্ত পৌঁছায়।

পরিস্থিতি

User pool-এ login → identity pool-এ token বদল → STS-এর credential → student-এর নিজের S3 folder-এ সরাসরি PUT।

Student app
User poollogin
Identity poolcredential
STS
Photos bucketphotos-example
Grades table
sign inID token

App-এর হাতে কী

ID token

user pool থেকে

AWS credential

এখনো নেই

ধাপ 1 / 5
1

নুসরাত বিশ্ববিদ্যালয়ের user pool-এ sign in করে একটা ID token পায়। Token প্রমাণ করে সে কে, কিন্তু S3 এটা নেয় না: S3-এর প্রতিটা request AWS credential দিয়ে sign করা থাকতে হয়।

#User pool নাকি identity pool: পরীক্ষার keyword

Notes-এর cheat sheet:

  • “Sign-up”, “sign-in”, “JWT tokens”, “user directory”, “আমার app-এর social login”, “hosted login page”, “API Gateway / ALB-এর user authenticate করা” → Cognito user pool।
  • “Temporary AWS credentials”, “give access to S3 / DynamoDB directly from a mobile app”, “unauthenticated / guest access”, “S3-এ user-প্রতি folder”, “DynamoDB item-এ সূক্ষ্ম access” → Cognito identity pool।
  • দুটোই, যখন app user-দের sign in করায় আবার সরাসরি AWS-ও ডাকে।

Notes-এর মনে রাখার উপায়: User pool = authentication (তুমি কে?); identity pool = authorization (AWS-এ তুমি কী করতে পারবে?)।

#Cognito নাকি IAM?

IAM-এর বদলে Cognito বাছার জন্য slide-এর keyword: “hundreds of users” (বা হাজার, লাখ), “mobile users”, একটা application-এর জন্য “authenticate with SAML”। IAM user হলো অল্প কয়েকজন মানুষের জন্য, যারা AWS চালায়; AWS account-এ sign in করা একদল কর্মীর জন্য আজকের উত্তর IAM Identity Center (lesson 20.3)। App-এর প্রতিটা customer-এর জন্য একটা IAM user বানানো, বা mobile app-এর ভেতরে একটা IAM user-এর access key রেখে দেওয়া, সবসময়ই ভুল: key দীর্ঘমেয়াদি, আর app খুলে দেখলেই যে কেউ পেয়ে যায়।

#যা ভুল হতে পারে

লক্ষণকারণসমাধান
Execution States.NoChoiceMatched দিয়ে failChoice state-এ কোনো rule মেলেনি, Default-ও নেইসবসময় Default দাও
Customer-এর টাকা কাটা, জিনিস নেই, execution “failed”পরের একটা ধাপ fail করেছে, Catch ছিল নাCompensating ধাপ সহ Catch (saga), তারপর redrive
টাকা দুবার কাটাNon-idempotent ধাপে retry, বা async Express (at-least-once)Idempotency key; non-idempotent ধাপের জন্য Standard
Execution চিরকাল অপেক্ষা করছেTimeoutSeconds ছাড়া callback Task; token হারিয়ে গেছেTimeout আর States.Timeout-এর ওপর Catch; লম্বা worker-এ heartbeat
State machine বানানো যাচ্ছে নাExpress workflow-এ .waitForTaskToken, .sync বা Distributed MapStandard (বা Standard parent) ব্যবহার করো
৫ মিনিটে Express run বন্ধকাজ Express-এর সীমার চেয়ে লম্বাStandard, বা কাজটা ভাগ করো
“Execution history exceeded” দিয়ে failএকটা Standard execution ২৫,০০০ history event-এ পৌঁছেছে (লম্বা loop)Loop-টা child workflow বা Distributed Map-এ সরাও
States.DataLimitExceededState-এর input বা output ২৫৬ KiB-এর বেশিData S3-এ রাখো, শুধু key পাঠাও
Express-এর fail চোখে পড়ে নাExpress কোনো history রাখে নাCloudWatch Logs (আর X-Ray) চালু করো
Task States.Permissions / AccessDenied দিয়ে failState machine-এর execution role-এ permission নেইRole-এ action যোগ করো (যেমন lambda:InvokeFunction)
প্রতি সকালে API 401 দেয়১ ঘণ্টা পর access token-এর মেয়াদ শেষRefresh token ব্যবহার করো; SDK নিজেই করে
Sign in করা user-কে S3 403 দেয়App user pool-এর JWT S3-এ পাঠিয়েছেIdentity pool, বা তোমার API / presigned URL
ঠিক user-কেও DynamoDB AccessDeniedTable-এর key user pool-এর sub, policy-তে identity IDItem-এর key রাখো identity pool-এর identity ID দিয়ে
Guest-রা data লিখতে পারছেUnauthenticated role খুব চওড়াGuest role-কে শুধু public data পড়তে দাও
ফাঁস হওয়া password আটকাচ্ছে নাLite বা Essentials planPlus plan-এর threat protection, বা MFA বাধ্যতামূলক

#System design-এ Step Functions আর Cognito

  • Order আর payment pipeline: Standard workflow, compensation সহ Catch (saga), idempotency key, SNS notification, ঠিক করার পর redrive।
  • মাঝে মানুষ: loan approval, content moderation, customer-এর পরিচয় যাচাই: timeout আর escalation-এর পথ সহ .waitForTaskToken।
  • Data processing: S3-এর ওপর Distributed Map, .sync দিয়ে একটা Glue বা EMR job, SDK integration Task হিসেবে Athena query; প্রতিটা record-এর কাজের জন্য Express child।
  • বিপুল সংখ্যার event processing: Kinesis বা SQS → Lambda → asynchronous Express workflow, বা কয়েকটা service ডাকা একটা API-র জন্য API Gateway → synchronous Express workflow।
  • App-এর পরিচয়: API-র জন্য user pool + API Gateway authorizer; সরাসরি S3 upload আর DynamoDB পড়ার জন্য identity pool; user pool আর API-র ওপর WAF (chapter 21); DAX আর caching সহ পুরো mobile app architecture আসছে lesson 15.8-এ।

Step Functions বনাম SQS: SQS buffer করে আর আলাদা করে রাখে (producer-এর মাথাব্যথা নেই message কে, কখন process করবে); Step Functions একটা জানা ক্রম সমন্বয় করে আর অবস্থার হিসাব রাখে। দুটো একসাথে ভালো চলে: একটা Task task token সহ SQS-এ message পাঠিয়ে consumer-এর উত্তরের অপেক্ষা করতে পারে।

কোনটা মানায়?

একটা scenario বেছে নাও, keyword-গুলো পড়ো, তারপর বেছে নাও: Standard নাকি Express workflow, Cognito user pool নাকি identity pool, নাকি সাধারণ IAM। তারপর কারণটা পড়ো।

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

একটা microfinance প্রতিষ্ঠান প্রতিটা loan আবেদন নিজে থেকে score করে, কিন্তু সীমানায় থাকা আবেদনগুলোকে একজন loan officer-এর অনুমোদনের জন্য অপেক্ষা করতে হয়, যাতে তিন দিন পর্যন্ত লাগতে পারে।

Keyword:manual approvalকয়েক দিনcallback

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

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

Region ap-southeast-1, account 111122223333; output ছোট করে দেখানো। Function আর role আগে থেকেই থাকতে হবে।

# 1. ওপরের ASL file থেকে order state machine (Standard) বানাও
aws stepfunctions create-state-machine --name order-example --type STANDARD \
  --definition file://order.asl.json \
  --role-arn arn:aws:iam::111122223333:role/sfn-order-example
#   { "stateMachineArn": "arn:aws:states:ap-southeast-1:111122223333:stateMachine:order-example",
#     "creationDate": "2026-10-28T10:02:11.402000+06:00" }

# 2. প্রতিটা order-এ একটা execution; নাম দিলে start করাটা idempotent হয়
aws stepfunctions start-execution \
  --state-machine-arn arn:aws:states:ap-southeast-1:111122223333:stateMachine:order-example \
  --name order-5501 --input '{"orderId":"5501","amount":2450,"items":["T-shirt","Panjabi"]}'
#   { "executionArn": "arn:aws:states:ap-southeast-1:111122223333:execution:order-example:order-5501",
#     "startDate": "2026-10-28T10:03:40.118000+06:00" }

aws stepfunctions describe-execution \
  --execution-arn arn:aws:states:ap-southeast-1:111122223333:execution:order-example:order-5501 \
  --query '{status:status,output:output}'
#   { "status": "SUCCEEDED", "output": "{\"orderId\":\"5501\",\"payment\":\"paid\",\"reservation\":\"R-77\"}" }

aws stepfunctions get-execution-history \
  --execution-arn arn:aws:states:ap-southeast-1:111122223333:execution:order-example:order-5501 \
  --query 'events[].type' --output text
#   ExecutionStarted TaskStateEntered TaskScheduled TaskStarted TaskSucceeded TaskStateExited
#   ChoiceStateEntered ChoiceStateExited … ParallelStateSucceeded SucceedStateEntered ExecutionSucceeded

# 3. অপেক্ষারত approval task-কে উত্তর দাও (token এসেছিল officer-এর email-এ)
aws stepfunctions send-task-success --task-token "$TASK_TOKEN" --task-output '{"approved":true}'
aws stepfunctions send-task-failure --task-token "$TASK_TOKEN" --error Rejected --cause "Trade licence expired"

# 4. Warehouse-এর database ঠিক করার পর fail করা order-টা fail করা state থেকে আবার চালাও
aws stepfunctions redrive-execution \
  --execution-arn arn:aws:states:ap-southeast-1:111122223333:execution:order-example:order-5504
#   { "redriveDate": "2026-10-28T11:20:05.771000+06:00" }

# 5. Synchronous ভাবে ডাকা একটা Express workflow (API Gateway-র pattern)
aws stepfunctions start-sync-execution \
  --state-machine-arn arn:aws:states:ap-southeast-1:111122223333:stateMachine:quote-express-example \
  --input '{"restaurant":"R-12","area":"Dhanmondi"}'
#   { "status": "SUCCEEDED", "output": "{\"price\":540,\"etaMinutes\":32}",
#     "billingDetails": { "billedMemoryUsedInMB": 64, "billedDurationInMilliseconds": 300 } }

# 6. Essentials plan-এ একটা user pool, email দিয়ে sign in
aws cognito-idp create-user-pool --pool-name riders-example --user-pool-tier ESSENTIALS \
  --username-attributes email --auto-verified-attributes email --mfa-configuration OFF
#   { "UserPool": { "Id": "ap-southeast-1_Ab12Cd34E", "UserPoolTier": "ESSENTIALS", … } }

aws cognito-idp create-user-pool-client --user-pool-id ap-southeast-1_Ab12Cd34E \
  --client-name rider-app --no-generate-secret \
  --explicit-auth-flows ALLOW_USER_SRP_AUTH ALLOW_USER_PASSWORD_AUTH ALLOW_REFRESH_TOKEN_AUTH
#   { "UserPoolClient": { "ClientId": "4exampleclientid0000000000", … } }

aws cognito-idp sign-up --client-id 4exampleclientid0000000000 \
  --username rafi@example.com --password 'Long-Passphrase-2026!'
#   { "UserConfirmed": false, "CodeDeliveryDetails": { "Destination": "r***@e***", "DeliveryMedium": "EMAIL" },
#     "UserSub": "d1b2c3d4-5678-90ab-cdef-EXAMPLE11111" }

aws cognito-idp confirm-sign-up --client-id 4exampleclientid0000000000 \
  --username rafi@example.com --confirmation-code 482913

# Password flow শুধু এই CLI test-এর জন্য; app ব্যবহার করে SRP বা managed login
aws cognito-idp initiate-auth --client-id 4exampleclientid0000000000 --auth-flow USER_PASSWORD_AUTH \
  --auth-parameters USERNAME=rafi@example.com,PASSWORD='Long-Passphrase-2026!'
#   { "AuthenticationResult": { "AccessToken": "eyJraWQiOi…", "ExpiresIn": 3600, "TokenType": "Bearer",
#     "RefreshToken": "eyJjdHkiOi…", "IdToken": "eyJraWQiOi…" } }

# 7. User pool-কে বিশ্বাস করা একটা identity pool, guest access ছাড়া
aws cognito-identity create-identity-pool --identity-pool-name students_example \
  --no-allow-unauthenticated-identities \
  --cognito-identity-providers ProviderName=cognito-idp.ap-southeast-1.amazonaws.com/ap-southeast-1_Ab12Cd34E,ClientId=4exampleclientid0000000000
#   { "IdentityPoolId": "ap-southeast-1:0a1b2c3d-1111-2222-3333-EXAMPLE44444", … }

aws cognito-identity set-identity-pool-roles \
  --identity-pool-id ap-southeast-1:0a1b2c3d-1111-2222-3333-EXAMPLE44444 \
  --roles authenticated=arn:aws:iam::111122223333:role/student-auth-example

# 8. ID token দিয়ে identity ID নাও, তারপর AWS credential
aws cognito-identity get-id --identity-pool-id ap-southeast-1:0a1b2c3d-1111-2222-3333-EXAMPLE44444 \
  --logins cognito-idp.ap-southeast-1.amazonaws.com/ap-southeast-1_Ab12Cd34E=$ID_TOKEN
#   { "IdentityId": "ap-southeast-1:7c1e5f2a-aaaa-bbbb-cccc-EXAMPLE55555" }

aws cognito-identity get-credentials-for-identity \
  --identity-id ap-southeast-1:7c1e5f2a-aaaa-bbbb-cccc-EXAMPLE55555 \
  --logins cognito-idp.ap-southeast-1.amazonaws.com/ap-southeast-1_Ab12Cd34E=$ID_TOKEN
#   { "IdentityId": "ap-southeast-1:7c1e5f2a-…",
#     "Credentials": { "AccessKeyId": "ASIAEXAMPLE7Q2K", "SecretKey": "…", "SessionToken": "…",
#                      "Expiration": "2026-10-28T12:15:02+06:00" } }

তিনটা মান AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY আর AWS_SESSION_TOKEN-এ বসাও, তারপর চালাও aws s3 cp avatar.jpg s3://student-photos-example/ap-southeast-1:7c1e5f2a-aaaa-bbbb-cccc-EXAMPLE55555/avatar.jpg (অনুমতি আছে), আর একই command অন্য এক student-এর folder দিয়ে (AccessDenied)।

#সারসংক্ষেপ

মূল কথা

  • Step Functions ধাপগুলোকে একটা state machine হিসেবে সাজায়, যা লেখা Amazon States Language (ASL)-এ, আর ছবি এঁকে বানানো যায় Workflow Studio-তে। পরীক্ষার বাক্য: “orchestrate multiple Lambda functions”, “coordinate microservices”, “state machine”।
  • State: Task, Choice (সবসময় Default), Wait, Parallel, Map (inline, বা S3-এর ওপর Distributed), Pass, Succeed, Fail। Retry (interval, backoff, max attempts) আর Catch (উদ্ধারের state-এ) configuration, code না; compensation মিলে হয় saga; fail করা Standard execution ১৪ দিনের মধ্যে redrive করা যায়।
  • Integration pattern: Request Response, Run a job (.sync), human approval-এর জন্য Wait for callback (.waitForTaskToken), সাথে SendTaskSuccess / SendTaskFailure, timeout আর heartbeat। Optimized integration (Lambda, ECS, Batch, DynamoDB, SNS, SQS, Glue, SageMaker…), ২২০-এর বেশি service-এর সাথে SDK integration, HTTP Task, EC2 আর অফিসের worker-এর জন্য activity।
  • Standard: ১ বছর পর্যন্ত, exactly-once, ৯০ দিনের history, callback আর .sync, দাম প্রতি state transition (প্রতি ১,০০০-এ ০.০২৫ USD)। Express: ৫ মিনিট পর্যন্ত, at-least-once (async) বা at-most-once (sync), শুধু CloudWatch Logs, দাম প্রতি execution + GB-second; ছোট, বিপুল সংখ্যার কাজে অনেক সস্তা। কয়েক ঘণ্টা বা কয়েক দিন, বা manual approval → Standard।
  • Cognito user pool = authentication: user directory, sign-up / sign-in, যাচাই, password reset, MFA, social / SAML / OIDC federation, managed login, Lambda trigger, JWT (ID আর access ১ ঘণ্টা, refresh ৩০ দিন)। জোড়া লাগে API Gateway-র authorizer আর ALB-র authenticate-cognito action-এর সাথে। Feature plan Lite / Essentials (default) / Plus (threat protection, compromised credential)।
  • Cognito identity pool = STS দিয়ে অস্থায়ী AWS credential, সরাসরি S3 / DynamoDB access-এর জন্য; উৎস: user pool, social, SAML, OIDC, developer identity; authenticated আর guest role; ${cognito-identity.amazonaws.com:sub} আর dynamodb:LeadingKeys দেয় user-প্রতি folder আর row-level security।
  • Cognito বনাম IAM: একটা app-এর জন্য “hundreds of users”, “mobile users”, “authenticate with SAML” → Cognito। IAM (Identity Center) তাদের জন্য, যারা AWS চালায়; app-এর ভেতরে কখনো IAM key রেখো না।