সরাসরি পর্বে যান
পর্ব ০৬ · ৮১-এর মধ্যে · মডিউল ১

Cloud ব্যবহারের পথ — console, CLI, API, account আর খরচের নিরাপত্তা

Using the Cloud — Console, CLI, API, Account Safety and Cost Safety

Taught in Bangla, this lesson shows that console, CLI, SDK and IaC all end as signed HTTPS calls to one API, and how resources are addressed by identifier and region. It covers first-day account safety with MFA and budget alerts, cleaning up forgotten resources, long-lived keys versus short-lived credentials, and pagination, rate limits, retries and idempotency tokens, with a simulator. No cloud account is needed.

এই পর্বে যা শিখবেন

  • একটি “Create VM” ক্লিক browser থেকে আসল server পর্যন্ত কোন পথে যায়
  • Signed request কী, আর resource-এর ঠিকানায় region কেন থাকে
  • নিরাপদে account খোলা, আর পরীক্ষার resource ভুলে যাওয়ার বিল ঠেকানো
  • চাবি ফাঁস হলে প্রথম এক ঘণ্টায় কী করবেন, আর short-lived credential কেন ভালো
  • Pagination, rate limit, retry আর idempotency token হাতে-কলমে

১ · সব পথ একই দরজায় — cloud-এ সবকিছুই API

আগের পর্বগুলোতে দেখেছি cloud মানে ভাড়ার কম্পিউটার, আর সেগুলো পৃথিবীর নানা region-এ ছড়ানো। কিন্তু একটি সহজ প্রশ্ন বাকি: আপনি সেই ভাড়ার কম্পিউটারের সাথে কথা বলবেন কীভাবে? আপনি তো data center-এ গিয়ে তার লাগাতে পারবেন না।

নিজের ব্যাংক হিসাবের কথা ভাবুন। টাকা তুলতে পারেন কাউন্টারে, ATM-এ, অথবা মোবাইল অ্যাপে। পথ তিনটি, কিন্তু হিসাব একটাই; সব পথ শেষে ব্যাংকের একই খাতায় এন্ট্রি করে। Cloud-ও তেমন। পথ অনেক, কিন্তু ভেতরের “খাতা” আর তার দরজা একটাই। সেই দরজার নাম API (Application Programming Interface): প্রোগ্রাম দিয়ে একটি সিস্টেমকে কাজ করতে বলার নির্দিষ্ট নিয়ম।

Cloud ব্যবহারের প্রধান পথ চারটি। এদের পার্থক্য শুধু এটুকুই: অনুরোধটি কে আর কীভাবে তৈরি করছে।

পথকী এটিকখন ভালোদুর্বলতা
ConsoleBrowser-এর ওয়েবসাইটশেখা, ঘুরে দেখা, বিল বা log পড়াহাতের কাজ; পুনরাবৃত্তি কঠিন
CLITerminal-এর কমান্ডদ্রুত কাজ, ছোট scriptকমান্ডের ইতিহাসই একমাত্র রেকর্ড
SDKPython, JS, Go ইত্যাদির libraryনিজের অ্যাপ থেকে cloud ব্যবহারকোড লিখতে ও রক্ষণাবেক্ষণ করতে হয়
IaCফাইলে লেখা কাঙ্ক্ষিত অবস্থা (যেমন Terraform)স্থায়ী পরিবেশ, দলগত কাজ, reviewশিখতে সময় লাগে; state সামলাতে হয়

চার পথ, এক API

Console, CLI, SDK and IaC all end as HTTPS requests to the same API

চার পথ, এক API ConsoleCLISDKIaC HTTPS API দরজা (endpoint) পরিচয় · অনুমতি · নিয়ম · quota Control plane সিদ্ধান্ত: কী, কোথায়, কখন VMDiskNetwork Data plane: আসল কাজ এখানে চলে
ছবি ৬.১ — ওপরের চার পথের যেকোনোটি দিয়ে এলে নিচের যাচাই আর কাজ একই থাকে।

এখানে দুটি শব্দ মনে রাখুন। Control plane হলো cloud-এর ব্যবস্থাপনার অংশ: কোন VM কোথায় বসবে, তার রেকর্ড কী। Data plane হলো যেখানে আসল কাজ চলে: VM-এর ভেতরে আপনার প্রোগ্রাম, disk-এ ডেটা পড়া-লেখা। Control plane সাময়িক বিকল হলে নতুন VM বানানো নাও যেতে পারে, অথচ চলতে থাকা VM প্রায়ই চলতেই থাকে। এই ভাগটি পরে Kubernetes-এও ফিরে আসবে (পর্ব ৪২)।

২০০৬ সালে Amazon S3 আর EC2 যখন আসে, তখন এদের ব্যবহারের মূল পথই ছিল web service API আর command-line tool. Web console এসেছে কয়েক বছর পরে। অর্থাৎ cloud-এ API-ই আসল জিনিস, console তার ওপরে বসানো একটি সুন্দর মুখ। ইতিহাসের এই ক্রমটি আজও সত্য: নতুন সুবিধা অনেক সময় আগে API-তে আসে, console-এ পরে।

এবার একটি ক্লিকের পুরো যাত্রা দেখি। নাদিয়া একটি পরীক্ষার VM বানাতে চান। “পরে” চেপে এগোন, আর প্রতিটি ধাপে VM-এর অবস্থা আর বিলের ঘর খেয়াল করুন।

  1. Consolebrowser
  2. APIendpoint
  3. যাচাইপরিচয়, অনুমতি
  4. Control planeরেকর্ড, সিদ্ধান্ত
  5. Data planeআসল VM
অনুরোধ: demo-vm · size small · zone-a
কোথায়
যা ঘটল
VM-এর অবস্থা
বিল চলছে?
  1. ক্লিক। নাদিয়া console-এর ফর্মে নাম, আকার আর zone বেছে Create চাপলেন। Browser-এর কোড ফর্মের মানগুলো দিয়ে একটি API অনুরোধ বানাল। VM এখনো কোথাও নেই।
  2. অনুরোধ রওনা। অনুরোধটি HTTPS-এ region-এর endpoint-এ গেল। CLI-তে একই কাজ করলেও ঠিক এমন একটি অনুরোধই যেত।
  3. দরজায় যাচাই। API জানতে চায়: আপনি কে (authentication), এই কাজের অনুমতি আছে কি (authorization, IAM), আকার আর zone ঠিক আছে কি, আপনার quota বাকি আছে কি। একটিতে আটকালে এখানেই error ফেরে, কোনো resource তৈরি হয় না।
  4. রেকর্ড। Control plane নিজের ডেটাবেসে লিখল: “এই account-এর vm-0007 দরকার।” এটি এখন কাঙ্ক্ষিত অবস্থা, আসল VM এখনো নয়।
  5. আগে উত্তর, পরে কাজ। API অপেক্ষা না করে বলল “নিয়েছি”, সাথে id দিল। সফল উত্তর মানে “VM তৈরি” নয়, মানে “অনুরোধ গৃহীত”। এই ধরনকে asynchronous API বলে। Provider-ভেদে status code আলাদা হতে পারে।
  6. আসল কাজ। Scheduler জায়গা খালি আছে এমন একটি physical host বেছে নিল। Disk তৈরি হলো, network card জুড়ল, hypervisor VM চালু করল। এই সময়েই সাধারণত বিল শুরু হয়, তবে নিয়ম provider-ভেদে আলাদা।
  7. Polling আর রেকর্ড। Console বারবার Describe ডেকে অবস্থা দেখে, আর শেষে দেখায় running. পুরো ঘটনাটি audit log-এ লেখা থাকল: কে, কখন, কোথা থেকে, কী করলেন। এই log-ই পরে ঘটনার তদন্তে কাজে লাগে।

২ · একটি API call-এর ভেতরে — চিঠি, স্বাক্ষর আর ঘড়ি

Cloud API মূলত HTTP অনুরোধ, যার বিস্তারিত আছে HTTP-র পর্বে, আর পথে থাকে TLS-এর সুরক্ষায়। নিচের অনুরোধটি শেখার জন্য বানানো একটি কাল্পনিক provider-এর। কোনো আসল provider-এর ফরম্যাট হুবহু এমন নয়, তবে ধারণা একই।

POST /v1/instances HTTP/1.1
Host: compute.region-a.example-cloud.test
Content-Type: application/json
X-Cloud-Date: 20261030T101500Z
X-Idempotency-Token: demo-0001
Authorization: SIGN-V1 key=AKEXAMPLEKEY, signature=9f2c...e41a

{"name":"demo-vm","size":"small","zone":"zone-a","tags":{"owner":"nadia","env":"test"}}

প্রতিটি লাইনের একটি কাজ আছে। Host-এর ভেতরে region আছে। Body-তে কাঙ্ক্ষিত জিনিস। X-Cloud-Date অনুরোধের সময় জানায়। আর Authorization প্রমাণ করে অনুরোধটি কে পাঠিয়েছে।

ব্যাংকের চেকের কথা ভাবুন। ব্যাংকের কাছে আপনার নমুনা স্বাক্ষর আছে, তাই চেকের স্বাক্ষর মিলিয়ে নিতে পারে। আপনাকে নিজে কাউন্টারে যেতে হয় না। Signed request-এ একই ঘটনা, শুধু একটি পার্থক্যসহ: স্বাক্ষরটি প্রতিটি চেকের লেখার সাথে মিলিয়ে বানানো। অঙ্ক বদলালে স্বাক্ষরও আর মেলে না।

Client আর server দুজনের কাছেই একই secret থাকে। Client অনুরোধের গুরুত্বপূর্ণ অংশগুলো (method, path, সময়, body-র hash) জুড়ে secret দিয়ে HMAC হিসাব করে, আর ফলটি পাঠায়। Server একই হিসাব নিজে করে মিলিয়ে দেখে। Secret নিজে কখনো পথে যায় না। Runnable উদাহরণটি একটি খেলনা scheme, কিন্তু তিনটি মূল গুণ দেখায়।

# Signing a request: the secret proves identity but never travels.
# Toy scheme for learning; real providers define their own exact format.
import hashlib, hmac

SECRET = b"fake-secret-for-learning-only"      # stays on the client and the server

def sign(method, path, date, body):
    text = "\n".join([method, path, date, hashlib.sha256(body).hexdigest()])
    return hmac.new(SECRET, text.encode(), hashlib.sha256).hexdigest()

def server_accepts(method, path, date, body, signature, now):
    if abs(now - int(date)) > 300:             # allow a 5-minute clock window
        return "rejected: request too old"
    expected = sign(method, path, date, body)
    same = hmac.compare_digest(expected, signature)
    return "accepted" if same else "rejected: signature mismatch"

body = b'{"name":"demo-vm","size":"small"}'
date = "1000"                                  # simulated clock, in seconds
sig = sign("POST", "/v1/instances", date, body)
print("signature :", sig[:16] + "...")

print("honest    :", server_accepts("POST", "/v1/instances", date, body, sig, 1010))
changed = body.replace(b"small", b"large")     # body altered on the way
print("altered   :", server_accepts("POST", "/v1/instances", date, changed, sig, 1010))
print("old replay:", server_accepts("POST", "/v1/instances", date, body, sig, 2000))

আউটপুটের প্রথম লাইনে signature : edaa1a03c962d527... এসেছে। এরপর তিনটি ফল: সৎ অনুরোধে accepted; body-তে small বদলে large করলে rejected: signature mismatch; আর একই অনুরোধ ১,০০০ সেকেন্ড পরে পাঠালে rejected: request too old. অর্থাৎ স্বাক্ষর পরিচয় প্রমাণ করে, পথে বদল ধরে, আর সময়ের জানালা পুরোনো অনুরোধ আবার পাঠানো কঠিন করে। আপনার কম্পিউটারের ঘড়ি বেশি ভুল হলে আসল API-ও অনুরোধ ফিরিয়ে দিতে পারে; তাই “clock skew” error দেখলে আগে ঘড়ি মেলান।

সব provider প্রতিটি অনুরোধে এভাবে স্বাক্ষর করে না। প্রধান ধরন দুটি:

ধরনকীভাবেউদাহরণফাঁস হলে
প্রতি অনুরোধে স্বাক্ষরSecret দিয়ে অনুরোধটি sign করাAWS Signature Version 4একটি অনুরোধ দেখে secret পাওয়া যায় না
Bearer tokenআগে login করে সাময়িক token নেওয়া, তারপর প্রতি অনুরোধে সেটি পাঠানোAzure ও Google Cloud-এর OAuth 2.0 access tokenToken যার হাতে, মেয়াদ পর্যন্ত ক্ষমতা তার; তাই মেয়াদ ছোট রাখা হয়

আপনাকে নিজে এসব হিসাব করতে হবে না। CLI আর SDK credential খুঁজে নেয়, অনুরোধ sign করে, অনেক ক্ষেত্রে retry-ও করে। কিন্তু ভেতরের ছবিটি জানা থাকলে SignatureDoesNotMatch বা token expired ধরনের error দেখে আর ঘাবড়াবেন না।

৩ · ঠিকানা — resource, identifier আর region

Cloud-এ VM, disk, network, bucket, সবই একেকটি resource. প্রতিটি resource-এর একটি অনন্য পরিচয় থাকে, ঠিক ডাকের ঠিকানার মতো: বাড়ি, রোড, থানা, জেলা। পুরো ঠিকানা ছাড়া শুধু “৫ নম্বর বাড়ি” বললে চিঠি হারাবে। নিচের তিনটি একই ধরনের ঠিকানা, তিন provider-এর ভাষায়। সব id ভুয়া।

# AWS: ARN (Amazon Resource Name)
arn:aws:ec2:ap-south-1:123456789012:instance/i-0123456789abcdef0

# Azure: resource ID
/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/demo-rg/providers/Microsoft.Compute/virtualMachines/demo-vm

# Google Cloud: resource URL
https://www.googleapis.com/compute/v1/projects/example-project-123456/zones/asia-south1-a/instances/demo-vm

তিনটির ভেতরেই চারটি অংশ খুঁজে পাবেন: কোন সার্ভিস (ec2, Microsoft.Compute, compute), কার জিনিস (account, subscription, project), কোথায় (region বা zone), আর কোনটি (ধরন ও নাম)। Azure-এর উদাহরণে location নেই, কারণ সেখানে অবস্থান resource-এর একটি বৈশিষ্ট্য, ঠিকানার অংশ নয়।

পরিধিঅর্থসাধারণ উদাহরণ (provider-ভেদে আলাদা)
Globalসব region থেকে একইIdentity, DNS zone, বিল
Regionalএকটি region-এর ভেতরেঅনেক storage ও managed সার্ভিস
Zonalএকটি zone-এর ভেতরেVM, block disk

নতুনদের সবচেয়ে পরিচিত আতঙ্ক: “আমার VM উধাও!” বেশিরভাগ সময় VM ঠিকই আছে; console-এর ওপরে অন্য region বাছাই করা আছে। উল্টো বিপদও আছে। Console অনেক সময় একটি region-এর তালিকাই দেখায়, তাই অন্য region-এ ভুলে রাখা resource চোখে পড়ে না, অথচ বিল আসে। সন্দেহ হলে বিলের পাতায় region অনুযায়ী খরচ ভাগ করে দেখুন, সেখানে কিছু লুকানো থাকে না।

৪ · Account খোলা — প্রথম দিনের নিরাপত্তা

আগে একটি কথা: এই কোর্স শেষ করতে কোনো cloud account লাগবে না। সিমুলেটরগুলো এই পাতাতেই চলে। নিজে account খোলা ঐচ্ছিক, আর আসল cloud ব্যবহারে টাকা খরচ হতে পারে।

যে email দিয়ে account খোলেন, সেটি সাধারণত সর্বোচ্চ ক্ষমতা পায়। এই পরিচয়টিকে বলে root বা owner account. এটি সব resource মুছতে পারে, বিল বদলাতে পারে, এমনকি account বন্ধ করতে পারে। আর এর ঠিক পরেই চলে আসে প্রতিদিনের সবচেয়ে বড় ভুল: সব কাজ এই account দিয়ে করা।

বাড়ির মূল দলিল আপনি ব্যাংকের লকারে রাখেন, রোজ পকেটে নিয়ে বাজারে যান না। Root account সেই দলিল। প্রতিদিনের কাজে লাগে সীমিত ক্ষমতার আলাদা চাবি, যা হারালে ক্ষতি সীমিত থাকে।

Providerসর্বোচ্চ ক্ষমতার পরিচয় (মোটামুটি মিল)দৈনন্দিন কাজের জন্য
AWSRoot userIAM Identity Center বা সীমিত role
AzureTenant-এর Global Administrator, subscription-এর Ownerকম ক্ষমতার Entra ID user ও role
Google CloudOrganization-এর admin বা project-এর Ownerনির্দিষ্ট IAM role দেওয়া Google account

তিনটির গঠন হুবহু এক নয়, তাই টেবিলটিকে মোটামুটি মিল হিসেবে পড়ুন। নতুন account-এ এই ক্রমে এগোন:

  1. আলাদা email আর শক্ত password. Password manager ব্যবহার করুন। মনে রাখবেন, এই email হাতছাড়া হলে account recovery-র পথও হাতছাড়া হয়; তাই email-এও দ্বিতীয় ধাপের যাচাই চালু রাখুন।
  2. Root-এ MFA. MFA (Multi-Factor Authentication) মানে password-এর সাথে আরেকটি প্রমাণ: authenticator app বা hardware key. SMS-এর চেয়ে এগুলো নিরাপদ। অনেক provider ধাপে ধাপে MFA বাধ্যতামূলক করছে, তবে নিয়মের অপেক্ষায় না থেকে নিজে চালু করুন। Recovery code কাগজে লিখে নিরাপদ জায়গায় রাখুন।
  3. Budget alert, প্রথম resource-এর আগেই। পরের অংশে বিস্তারিত।
  4. দৈনন্দিন কাজের আলাদা identity. সীমিত অনুমতি দিন, এটিই least privilege. Root দিয়ে access key বানাবেন না। আসল IAM আসবে পর্ব ৩১-এ।
  5. Root বন্ধ করে রাখা। এরপর শুধু সেই কাজে root-এ ঢুকুন, যা অন্য কেউ পারে না, যেমন account বন্ধ করা।

Payment card নিয়ে সতর্কতা (বাংলাদেশের পাঠকদের জন্য): Cloud-এর বিল সাধারণত বৈদেশিক মুদ্রায় আসে, আর অনেক provider account খুলতেই একটি card চায়। আন্তর্জাতিক লেনদেনের নিয়ম, সীমা আর ফি ব্যাংক ও সময়ভেদে বদলায়, তাই নিজের ব্যাংক থেকে বর্তমান নিয়ম জেনে নিন। সাধারণ সতর্কতা হিসেবে: সম্ভব হলে কম সীমার আলাদা card ব্যবহার করুন। অন্যের card বা অপরিচিত দালালের কাছে কেনা “রেডি account” ব্যবহার করবেন না; এতে account বন্ধ হওয়া আর আইনি ঝুঁকি দুটোই থাকে। Card নম্বর, CVV বা OTP কাউকে দেবেন না। মাসের শেষে নয়, প্রতি সপ্তাহে বিল দেখুন। Card সরিয়ে দিলে বা account ফেলে রাখলেই বকেয়া বিল মাফ হয় না; আগে resource মুছুন, তারপর account-এর সিদ্ধান্ত নিন।

৫ · খরচের নিরাপত্তা — budget alert, free tier আর পরিচ্ছন্নতা

Cloud-এর বিল বিদ্যুৎ বিলের মতো: যতক্ষণ চলবে, ততক্ষণ মিটার ঘুরবে। পার্থক্য হলো ঘরের বাতি জ্বললে চোখে পড়ে, আর region-এর এক কোণে চলতে থাকা একটি VM চোখে পড়ে না।

Budget alert হলো একটি নিয়ম: খরচ বা পূর্বাভাস একটি সীমা ছাড়ালে email বা বার্তা যাবে। দুটি কথা জেনে রাখুন। এক, এটি সাধারণত শুধু সতর্ক করে, খরচ থামায় না। দুই, বিলের তথ্য আসতে কয়েক ঘণ্টা বা তার বেশি দেরি হতে পারে, তাই alert বাস্তবের একটু পেছনে থাকে। সেজন্য প্রকৃত খরচের alert-এর সাথে পূর্বাভাসের alert-ও রাখুন।

Free tier-এর ফাঁদ

Free tier মানে নির্দিষ্ট সীমা পর্যন্ত বিনা খরচে ব্যবহার। শর্তগুলো provider-ভেদে আলাদা, আর সময়ের সাথে বদলায়; লেখার সময়ে যা ঠিক, পরে নাও থাকতে পারে। তাই সবসময় provider-এর বর্তমান পাতা দেখুন। সাধারণ ফাঁদগুলো হলো:

  • সীমার বাইরে গেলে সাধারণ দর। একটি নির্দিষ্ট আকারের VM বিনা খরচে হলেও পরের আকারটি নাও হতে পারে।
  • মেয়াদ শেষ। কিছু সুবিধা বা credit নির্দিষ্ট সময় পরে ফুরায়। মেয়াদ শেষে resource মুছে যায় না, হয় বিল আসে নয়তো সেটি বন্ধ হয়; provider-এর নিয়ম দেখে নিন।
  • লুকানো সঙ্গী। VM-এর সাথে disk, public IP, snapshot, log, NAT gateway বা load balancer-এর খরচ থাকতে পারে।
  • Data transfer. Cloud থেকে বাইরে ডেটা পাঠানোর খরচ অনেকের হিসাবে থাকে না (পর্ব ৭২)।

Stop করা আর Delete করা এক নয়

কাজVM-এর computeDiskPublic IP
Stopসাধারণত বিল বন্ধবিল চলেবিল চলতে পারে
Delete VMবিল বন্ধকনফিগারেশন-ভেদে থেকে যেতে পারেআলাদা হলে থেকে যেতে পারে
পুরো group মুছে দেওয়াবিল বন্ধমুছে যায়মুছে যায়

এবার একটি ভুলের পুরো মাস দেখি। রাফি মাসে প্রায় $১২ খরচের একটি ছোট lab চালান, budget $৩০। এখানে সব দর ধরে নেওয়া গোল সংখ্যা, আসল নয়: VM ঘণ্টায় $০.১০, ৯০ GB disk প্রতি GB-মাসে $০.১০, public IP ঘণ্টায় $০.০০৫। অর্থাৎ VM দিনে $২.৪০, disk দিনে $০.৩০, IP দিনে $০.১২; মোট দিনে $২.৮২ বাড়তি।

রাফির lab · budget $30 · ৩০ দিনের মাস
দিন
দিনের খরচ
মোট খরচ
চলছে
Alert
  1. দিন ১. Lab চলছে, দিনে $০.৪০। সব স্বাভাবিক।
  2. দিন ৮. মোট $৩.২০। এই গতিতে মাস শেষে $১২ হবে, budget-এর অনেক নিচে।
  3. দিন ৯: ভুলটি। রাফি “দুই ঘণ্টার জন্য” একটি পরীক্ষার VM খুললেন, কাজ শেষে ভুলে গেলেন। দিনের খরচ এক লাফে $৩.২২। সেদিন শেষে মোট $৬.৪২। কোনো alert নেই, কারণ পূর্বাভাস তখনো $২৩.২৮।
  4. দিন ১০: প্রথম সতর্কতা। মোট মাত্র $৯.৬৪, budget-এর এক-তৃতীয়াংশও নয়। কিন্তু গত ৭ দিনের গড়ে পূর্বাভাস $৩৩.৭৫, তাই পূর্বাভাসের alert বাজল। প্রকৃত খরচের alert থাকলে এখনো কিছুই বাজত না। রাফি email-টি দেখলেন না।
  5. দিন ১২. প্রকৃত খরচ ৫০% ছাড়াল ($১৬.০৮)।
  6. দিন ১৫. ৮০% ছাড়াল ($২৫.৭৪)। Alert আসছে, কিন্তু কিছুই থামছে না।
  7. দিন ১৭. Budget পার ($৩২.১৮)। লক্ষ করুন, ১০০% পার হওয়ার পরও VM চলছে; budget alert কোনো দেয়াল নয়।
  8. দিন ১৮: অর্ধেক সমাধান। রাফি VM Stop করলেন। কিন্তু দিনের খরচ শূন্যের দিকে না গিয়ে হলো $০.৮২: lab $০.৪০, disk $০.৩০, IP $০.১২। Disk আর IP নীরবে চলছে। মোট $৩৩.০০।
  9. দিন ১৯: পরিষ্কার। বিলের পাতায় নতুন লাইন দেখে রাফি VM, disk আর IP সব মুছলেন। দিনের খরচ আবার $০.৪০। মোট $৩৩.৪০।
  10. দিন ৩০. মাস শেষে $৩৭.৮০, পরিকল্পনার চেয়ে $২৫.৮০ বেশি। দিন ৯-এর ভুল কখনো না ধরা পড়লে হতো $৭৪.০৪। দিন ১০-এর alert শুনলেই ক্ষতি হতো মাত্র কয়েক ডলার।

মাসের মোট খরচ, তিনটি সম্ভাব্য গল্প

Cumulative spend in dollars, day 0 to day 30 (assumed prices)

মাসের মোট খরচ $80$60$40$20$0 ০১০২০৩০ মাসের দিন Budget $30 দিন ১০: পূর্বাভাসের alert ভুলে থাকলে $৭৪.০৪ দিন ১৯-এ পরিষ্কার $৩৭.৮০ পরিকল্পনা $১২
ছবি ৬.২ — ধূসর: পরিকল্পিত খরচ। লাল: ভুল ধরা না পড়লে। নীল: দিন ১৯-এ পরিষ্কার করলে। হলুদ ড্যাশ: budget. প্রতিটি রেখার নাম চিত্রের ভেতরেই লেখা আছে।

এই হিসাবটি নিজে চালিয়ে দেখুন। প্রতিদিনের খরচ থেকে প্রোগ্রামটি মোট খরচ, গত ৭ দিনের গড় আর মাস-শেষের পূর্বাভাস বের করে। সূত্রটি সরল: পূর্বাভাস = এ পর্যন্ত খরচ + (গত ৭ দিনের গড় × বাকি দিন)।

// Budget alerts from daily spend. All prices are assumed round numbers, not real ones.
const BUDGET = 30, MONTH = 30;
const NORMAL = 0.40;                      // $ per day, the planned small lab
const LEAK = 2.40 + 0.30 + 0.12;          // forgotten VM + disk + public IP, from day 9
const daily = Array.from({ length: MONTH }, (_, i) => NORMAL + (i + 1 >= 9 ? LEAK : 0));

const fired = new Set();
function alarm(day, key, text) {
  if (fired.has(key)) return;
  fired.add(key);
  console.log(`  >> day ${day}: ALERT ${text}`);
}

let spent = 0;
console.log('day  spent  avg7  forecast');
for (let day = 1; day <= MONTH; day++) {
  spent += daily[day - 1];
  const last7 = daily.slice(Math.max(0, day - 7), day);
  const avg7 = last7.reduce((a, b) => a + b, 0) / last7.length;
  const forecast = spent + avg7 * (MONTH - day);        // spent so far + remaining days
  if ([8, 9, 10, 12, 15, 17, 30].includes(day))
    console.log(String(day).padStart(3), spent.toFixed(2).padStart(6),
      avg7.toFixed(2).padStart(5), forecast.toFixed(2).padStart(8));
  if (forecast > BUDGET) alarm(day, 'forecast', `forecast $${forecast.toFixed(2)} > budget $${BUDGET}`);
  for (const pct of [50, 80, 100])
    if (spent >= BUDGET * pct / 100) alarm(day, pct, `actual spend reached ${pct}% ($${spent.toFixed(2)})`);
}
console.log(`planned month: $${(NORMAL * MONTH).toFixed(2)} | with the leak: $${spent.toFixed(2)}`);

দিন ৯-এ পূর্বাভাস 23.28, তাই নীরবতা। দিন ১০-এ ALERT forecast $33.75 > budget $30. প্রকৃত খরচের সতর্কতা আসে অনেক পরে: day 12-তে ৫০%, day 15-তে ৮০%, day 17-তে ১০০%. অর্থাৎ পূর্বাভাসের alert প্রকৃত ১০০%-এর ৭ দিন আগে বেজেছে। শেষ লাইন: planned month: $12.00 | with the leak: $74.04. দিন ১৫-র পরে পূর্বাভাস 74.04-এ স্থির, কারণ গত ৭ দিনের সবকটিই তখন বাড়তি খরচের দিন। মাঝের একটি বড় একদিনের খরচ এই গড়কে কিছুদিন ফুলিয়ে রাখতে পারে, তাই পূর্বাভাস একটি ইঙ্গিত, নিশ্চিত হিসাব নয়।

প্রথম দিন থেকেই tag

Tag হলো resource-এর গায়ে লাগানো key-value লেবেল, যেমন owner=rafi, env=test, expires=2026-11-05. গুদামঘরে প্রতিটি বস্তায় মালিকের নাম লেখা থাকলে যেমন পরে খুঁজতে সহজ হয়, এটিও তেমন। Tag থাকলে আপনি “এই resource কার, আদৌ দরকার কি না” এক কমান্ডে বের করতে পারেন, আর বিল ভাগ করে দেখতে পারেন। ছোট্ট একটি নিয়ম রাখুন: owner আর env ছাড়া কিছু বানাবেন না, আর পরীক্ষার resource-এ expires তারিখ দিন। পরে tag বসানো অনেক কঠিন, কারণ তখন কেউ মনে রাখে না কোনটি কার। Google Cloud-এ এই লেবেলের নাম সাধারণত label; সেখানে “tag” শব্দটির অন্য অর্থও আছে। Governance আর FinOps-এ এর বিস্তার দেখবেন পর্ব ৩৫ ও ৭৩-এ।

পরিচ্ছন্নতার অভ্যাস: পরীক্ষা শুরু করার আগেই ঠিক করুন কীভাবে শেষ করবেন। একটি group বা project-এর ভেতরে সব বানান, যাতে এক কাজে সব মোছা যায়। শেষে তিনটি জায়গা মিলিয়ে দেখুন: resource-এর তালিকা, সব region, আর পরদিনের বিল।

৬ · চাবি — long-lived key বনাম short-lived credential

CLI বা script চালাতে একটি প্রমাণ লাগে। ধরন দুটি। এখানে শুধু প্রথম পরিচয়; গভীর আলোচনা পর্ব ৩১-এ।

🔑 Long-lived key

Access key বা service account key একটি স্থায়ী secret. আপনি না মুছলে চলতেই থাকে। ঠিক আলমারির স্থায়ী চাবির মতো: একবার কপি হলে আপনি জানতেও পারবেন না।

ফাঁস হলে: মুছে না ফেলা পর্যন্ত ঝুঁকি

⏳ Short-lived credential

Temporary credential login-এর পরে তৈরি হয়, মিনিট বা ঘণ্টায় মেয়াদ ফুরায়, তারপর নিজে থেকেই অকেজো। হোটেলের card চাবির মতো: checkout-এর পরে আর দরজা খোলে না।

ফাঁস হলে: ঝুঁকির সময় ছোট

তাই সাধারণ নিয়ম: মানুষের কাজে SSO বা aws sso login, az login, gcloud auth login ধরনের login-ভিত্তিক সাময়িক credential; cloud-এর ভেতরের VM বা function-এ attached role বা managed identity; আর pipeline-এ OIDC (পর্ব ৬১)। স্থায়ী key একেবারে না পারলে তবেই, আর তখনো কম অনুমতি দিয়ে। Secret সংরক্ষণের সঠিক পথ পর্ব ৩৩-এ।

Key সবচেয়ে বেশি ফাঁস হয় খুব সাধারণ ভুলে: Git-এ commit করা .env ফাইল, screenshot, ব্লগের উদাহরণ, chat-এর বার্তা, বা AI-কে পেস্ট করা কোড। এর প্রতিরোধ আছে Git-এর নিরাপত্তার পর্বে। ফাঁস হয়ে গেলে কী করবেন, সেটি শান্ত মাথায় আগেই জেনে রাখুন। নিচের ঘটনাটি কাল্পনিক, আর পুরোটাই প্রতিরক্ষার দিক থেকে।

কাল্পনিক দল · একটি অনলাইন বাজার অ্যাপ · key AKEXAMPLEKEY
সময়
Key-এর অবস্থা
কাজ
অচেনা resource
ঝুঁকি
  1. ভুল। একজন ডেভেলপার তাড়াহুড়ায় .env ফাইলসহ কোড public repository-তে push করলেন। ধরে নিন, push-এর মুহূর্ত থেকেই key অন্যের হাতে গেছে; স্বয়ংক্রিয় bot-রা public repository সবসময় খুঁজছে।
  2. সতর্কতা। Secret scanning ধরে ফেলল আর দলকে জানাল। এমন সেবা Git platform বা provider দিতে পারে, তবে এর ওপর পুরো ভরসা করবেন না; নিজে ধরলেও একই পথ।
  3. আগে key বন্ধ। প্রথম কাজ ক্ষতির পথ বন্ধ করা, দোষী খোঁজা নয়। Key-টি disable করা হলো, তখনই মুছে ফেলা হলো না, কারণ তদন্তে তার পরিচয় লাগে। Production এই key-এর ওপর নির্ভর করলে আগে থেকে ঠিক করা বিকল্প চাবিতে সরান; তবে দেরি করবেন না।
  4. Audit log. এই key দিয়ে কখন, কোন region-এ, কী করা হয়েছে তা দেখা হলো, সব region মিলিয়ে। অচেনা ৩টি resource পাওয়া গেল। মনে রাখবেন, অনুমতি বেশি থাকলে নতুন user বা নতুন key-ও তৈরি হয়ে থাকতে পারে; সেগুলোও খুঁজতে হবে।
  5. পরিষ্কার। অচেনা resource প্রমাণ হিসেবে নথিভুক্ত করে সরানো হলো। নতুন তৈরি অচেনা identity আর অনুমতিও মোছা হলো। Data-তে অনধিকার প্রবেশের চিহ্ন আছে কি না দেখা হলো; থাকলে আইন ও গ্রাহক জানানোর প্রশ্ন আসে।
  6. সব বদলানো। ওই repository-তে থাকা অন্য সব secret-ও ফাঁস ধরা হলো আর বদলানো হলো। পুরোনো key মুছে দেওয়া হলো। Git history পরিষ্কার করা ভালো, কিন্তু সেটিই সমাধান নয়: একবার public হওয়া secret পোড়া secret.
  7. বিল আর support. অস্বাভাবিক খরচ দেখা হলো, আর provider-এর support-এ জানানো হলো। অননুমোদিত ব্যবহারের বিল নিয়ে provider কী করবে তা তাদের নীতির ওপর নির্ভর করে; নিশ্চিত ধরে নেবেন না।
  8. দোষারোপহীন পর্যালোচনা। প্রশ্ন “কে করল” নয়, “সিস্টেম কীভাবে এটি হতে দিল”। ফল: commit-এর আগে secret scan, স্থায়ী key-এর বদলে সাময়িক credential, কম অনুমতি, আর এই ঘটনার একটি runbook (পর্ব ৬৭)।

৭ · API-র সাথে ভদ্র ব্যবহার — pagination, rate limit, retry আর idempotency

Script লিখলে আপনি আর ক্লিক করা মানুষ নন, একটি দ্রুত প্রোগ্রাম। তখন চারটি বিষয় না জানলে এমন bug হয়, যা ছোট পরীক্ষায় ধরা পড়ে না কিন্তু production-এ ঠিকই কামড়ায়।

Pagination: প্রথম পাতাই সব নয়

List API একবারে সব ফেরত দেয় না, এক “পাতা” দেয়, সাথে পরের পাতার চিহ্ন (nextToken বা তার মতো কিছু)। একে বলে pagination. রেলের লম্বা সময়সূচির বইয়ের মতো: প্রথম পাতায় ট্রেন না পেলে ট্রেনটি নেই, তা নয়। Token খালি হওয়া পর্যন্ত পড়ে যেতে হয়। CLI অনেক ক্ষেত্রে নিজে সব পাতা পড়ে, কিন্তু SDK-তে আপনাকে paginator ব্যবহার করতে হতে পারে। প্রথম পাতা গুনে “মোট ১০০০টি resource” বলা একটি ক্লাসিক bug.

Rate limit: দরজায় ভিড়

একজন গ্রাহক যেন অন্যদের আটকে না দেন, তাই API একটি সীমা রাখে; একে rate limit বা throttling বলে। সীমা ছাড়ালে সাধারণত HTTP 429 Too Many Requests বা provider-এর নিজের throttling error আসে, কখনো Retry-After header সহ। সীমার সংখ্যা provider আর API-ভেদে আলাদা।

Retry: কখন আবার চেষ্টা করবেন

Network-এ ব্যর্থতা স্বাভাবিক ঘটনা। তবে সব ব্যর্থতা retry-র যোগ্য নয়।

ফলRetry?কারণ
429, 503, timeoutহ্যাঁ, অপেক্ষা করেসাময়িক সমস্যা
400, 403, 404নাঅনুরোধটি নিজেই ভুল; আবার পাঠালেও একই ফল
Timeout (তৈরির অনুরোধে)শুধু idempotency token থাকলেআগের অনুরোধ হয়তো সফল হয়েছিল

অপেক্ষার সঠিক নিয়ম exponential backoff: প্রতিবার অপেক্ষা দ্বিগুণ, একটি সর্বোচ্চ সীমা পর্যন্ত। সাথে jitter: সেই অপেক্ষায় এলোমেলোভাবে কম-বেশি করা। সূত্র (full jitter): wait = random(0, min(cap, base × 2^n)). Jitter কেন লাগে? ঈদের আগে টিকিট কাউন্টার ১০টায় খুললে সবাই একসাথে ঝাঁপিয়ে পড়ে। সবাইকে ১০:১০-এ আবার আসতে বললে ভিড় শুধু সরে যায়, কমে না। এই একসাথে হামলাকে thundering herd বলে। নিচের সিমুলেটরে ৩০টি client একসাথে সীমায় ধাক্কা খায়; server প্রতি slot-এ (১০০ ms) মাত্র ৪টি অনুরোধ নিতে পারে।

// 30 clients all hit a rate limit together. Server: 4 requests per slot (1 slot = 100 ms).
function mulberry32(a) {
  return () => { a |= 0; a = a + 0x6D2B79F5 | 0;
    let t = Math.imul(a ^ a >>> 15, 1 | a);
    t = t + Math.imul(t ^ t >>> 7, 61 | t) ^ t;
    return ((t ^ t >>> 14) >>> 0) / 4294967296; };
}
const CLIENTS = 30, CAP = 4, BASE = 4, MAX_WAIT = 64;   // BASE, MAX_WAIT in slots
const expWait = n => Math.min(MAX_WAIT, BASE * 2 ** n);

function simulate(name, waitFor) {
  const rng = mulberry32(42);
  let queue = Array.from({ length: CLIENTS }, () => ({ at: 0, tries: 0 }));
  let calls = 0, retryPeak = 0, rejected = 0, finish = 0;
  for (let t = 0; queue.length > 0; t++) {
    const now = queue.filter(c => c.at === t);
    queue = queue.filter(c => c.at !== t);
    calls += now.length;
    if (t > 0) retryPeak = Math.max(retryPeak, now.length);
    now.forEach((c, i) => {
      if (i < CAP) { finish = t; return; }        // served
      rejected++;                                 // HTTP 429, try again later
      c.at = t + Math.max(1, waitFor(c.tries++, rng));
      queue.push(c);
    });
  }
  console.log(name.padEnd(26), String(calls).padStart(5), String(rejected).padStart(8),
    String(retryPeak).padStart(9), String(finish).padStart(7));
}
console.log('strategy                   calls rejected retryPeak  finish');
simulate('fixed wait, 4 slots', () => 4);
simulate('exponential', n => expWait(n));
simulate('exponential + full jitter', (n, rng) => Math.floor(rng() * (expWait(n) + 1)));

আউটপুটের তিন সারি: fixed wait, 4 slots 128 98 26 28, exponential 128 98 26 252, আর exponential + full jitter 71 41 10 22. কলামগুলো হলো মোট call, প্রত্যাখ্যাত call, প্রথম slot-এর পরে সর্বোচ্চ ভিড়, আর শেষ client-এর slot. Jitter ছাড়া দুই নিয়মেই ২৬টি client একই মুহূর্তে ফেরে; তাই একই ৯৮টি প্রত্যাখ্যান। শুধু exponential-এর শেষ slot ২৫২, কারণ পুরো দল একসাথে ঘুমায়, মাঝের খালি সময় নষ্ট হয়। Jitter ভিড়কে ছড়িয়ে দেয়: প্রত্যাখ্যান ৪১, সর্বোচ্চ ভিড় ১০, শেষ ২২ slot-এ। এই সংখ্যা seed 42-এর; অন্য seed-এ অল্প বদলাবে, তবে ছবিটি একই থাকে। আসল server অসুস্থ থাকলে fixed wait-এর বারবার ধাক্কা তাকে সেরে উঠতেও দেয় না।

Idempotency: একবার চাইলে একটিই

সবচেয়ে সূক্ষ্ম সমস্যাটি এখানে। আপনি VM তৈরির অনুরোধ পাঠালেন, উত্তর এলো না। VM কি তৈরি হয়েছে? জানেন না। অনুরোধ হারিয়ে থাকতে পারে, আবার উত্তর-ও হারিয়ে থাকতে পারে। আবার পাঠালে দুটি VM আর দ্বিগুণ বিল হতে পারে। না পাঠালে হয়তো একটিও নেই।

সমাধান idempotency: একই কাজ বারবার করলেও ফল একবার করার সমান। কীভাবে? Client একটি অনন্য idempotency token বানিয়ে অনুরোধে পাঠায়, আর retry-তে একই token পাঠায়। Server token চিনে আগের ফলটিই ফেরত দেয়। মোবাইল ওয়ালেটে টাকা পাঠাতে গিয়ে নেটওয়ার্ক চলে গেলে কি আবার পাঠাবেন? ব্যবস্থাটি যদি প্রতিটি লেনদেনের একটি নম্বর মনে রাখে, তবে একই নম্বরে দ্বিতীয়বার টাকা কাটা হবে না; ধারণাটি এমনই।

নিচের খেলনা API-তে create, list আর delete আছে, memory-তেই চলে। Token-এর কাজ আর pagination দুটোই এখানে দেখা যাবে।

// Toy in-memory cloud API: Create, List (pagination), Delete, idempotency token.
const db = new Map();      // id -> resource
const seen = new Map();    // token -> id it already created
let nextId = 1;
function api(action, p = {}) {
  if (action === 'Create') {
    if (p.token && seen.has(p.token)) return { id: seen.get(p.token), replay: true };
    const id = 'vm-' + String(nextId++).padStart(4, '0');
    db.set(id, { id, name: p.name });
    if (p.token) seen.set(p.token, id);
    return { id, replay: false };
  }
  if (action === 'List') {
    const ids = [...db.keys()].sort().filter(i => !p.after || i > p.after);
    const page = ids.slice(0, p.limit);
    return { items: page, next: ids.length > p.limit ? page[page.length - 1] : null };
  }
  if (action === 'Delete') return db.delete(p.id) ? { ok: true } : { error: 'NotFound' };
}
// 1) The first reply was lost; the client sends the same request again.
const a = api('Create', { name: 'web', token: 'tok-A' }), b = api('Create', { name: 'web', token: 'tok-A' });
console.log('with token   :', a.id, '| retry ->', b.id, 'replay =', b.replay);
const c = api('Create', { name: 'web' }), d = api('Create', { name: 'web' });
console.log('without token:', c.id, '| retry ->', d.id, '(a duplicate VM!)');
// 2) Five more VMs, then read everything, 3 per page.
for (let i = 0; i < 5; i++) api('Create', { name: 'batch' + i });
let after = null, pageNo = 0, total = 0;
do {
  const r = api('List', { limit: 3, after });
  console.log('page', ++pageNo, r.items.join(' '), '| next =', r.next);
  total += r.items.length; after = r.next;
} while (after);
console.log('total VMs =', total, '| first page alone showed only 3');
// 3) Delete twice: the end state is the same, the second reply differs.
console.log(api('Delete', { id: 'vm-0002' }), api('Delete', { id: 'vm-0002' }));

প্রথম লাইন: with token : vm-0001 | retry -> vm-0001 replay = true, অর্থাৎ VM একটিই। দ্বিতীয় লাইন: without token: vm-0002 | retry -> vm-0003 (a duplicate VM!), অর্থাৎ এক কাজে দুটি VM. এরপর তিনটি পাতা আসে, শেষে total VMs = 8 | first page alone showed only 3. শেষ লাইনে { ok: true } { error: 'NotFound' }: দ্বিতীয় delete-এর পরে resource-এর অবস্থা একই, শুধু উত্তর আলাদা। তাই delete-এর idempotency মানে “শেষ অবস্থা একই”, “উত্তর একই” নয়। Retry কোডে তাই delete-এর NotFound-কে সফল ধরা যায়। এই খেলনায় token চিরদিন মনে থাকে; আসল API-তে সাধারণত নির্দিষ্ট সময় পরে ভুলে যায়, আর একই token-এ ভিন্ন body পাঠালে error দিতে পারে।

HTTP-তে GET, PUT, DELETE সংজ্ঞায় idempotent, POST নয়। তাই নতুন কিছু বানানোর POST-এ token সবচেয়ে জরুরি। একই ধারণা পর্ব ৫১-তে IaC-তে আর পর্ব ৭১-এ serverless-এ ফিরে আসবে। Retry-র ঝুঁকির গভীর আলোচনা আছে System Design-এর resilience patterns পর্বে।

৮ · তিন provider-এ একই কাজ — CLI পাশাপাশি

ধারণা একই, শুধু ভাষা আলাদা। নিচের উদাহরণগুলো চালানোর জন্য নয়, পড়ে তুলনা করার জন্য। সব id ভুয়া। সত্যিই চালালে টাকা খরচ হতে পারে, আর region, image, size-এর নাম সময়ের সাথে বদলায়; provider-এর বর্তমান ডকুমেন্টেশন দেখে নিন। প্রতিটি ট্যাবে তিনটি কাজ আছে: tag-সহ VM তৈরি, tag দিয়ে তালিকা, আর পরিষ্কার।

# Create (client-token makes a retry safe)
aws ec2 run-instances \
  --region ap-south-1 \
  --image-id ami-0123456789abcdef0 \
  --instance-type t3.micro \
  --subnet-id subnet-0123456789abcdef0 \
  --client-token demo-0001 \
  --tag-specifications 'ResourceType=instance,Tags=[{Key=owner,Value=nadia},{Key=env,Value=test}]'

# List by tag
aws ec2 describe-instances --region ap-south-1 \
  --filters "Name=tag:env,Values=test" \
  --query "Reservations[].Instances[].[InstanceId,State.Name]" \
  --output table

# Clean up
aws ec2 terminate-instances --region ap-south-1 \
  --instance-ids i-0123456789abcdef0
# Everything goes into one resource group
az group create --name demo-rg --location centralindia

# Create
az vm create \
  --resource-group demo-rg \
  --name demo-vm \
  --image Ubuntu2204 \
  --size Standard_B1s \
  --admin-username azureuser \
  --generate-ssh-keys \
  --tags owner=nadia env=test

# List
az vm list --resource-group demo-rg --output table

# Clean up: the whole group, with its disk, NIC and IP
az group delete --name demo-rg --yes
# Create (Google Cloud calls these labels)
gcloud compute instances create demo-vm \
  --project=example-project-123456 \
  --zone=asia-south1-a \
  --machine-type=e2-micro \
  --image-family=ubuntu-2204-lts \
  --image-project=ubuntu-os-cloud \
  --labels=owner=nadia,env=test

# List by label
gcloud compute instances list \
  --project=example-project-123456 \
  --filter="labels.env=test"

# Clean up
gcloud compute instances delete demo-vm \
  --project=example-project-123456 \
  --zone=asia-south1-a --quiet

লক্ষ করুন, AWS-এর উদাহরণে --client-token সরাসরি আছে। Azure-এ VM-এর নামই পরিচয়, একই নামে একই অনুরোধ আবার পাঠালে নতুন VM হওয়ার বদলে আগেরটিকেই মিলিয়ে দেখা হয়। Google Cloud Compute API-তে এর সমতুল্য একটি requestId আছে। Provider তিনটি, সমস্যা একটিই।

ধারণাAWSAzureGoogle Cloud
CLIawsazgcloud
Python SDKboto3azure-sdk-for-pythongoogle-cloud-python
মালিকানা ও বিলের সীমাAccountSubscriptionProject
একসাথে রাখার দলTag দিয়ে, বা আলাদা accountResource groupProject
লেবেলTagTagLabel
খরচের সতর্কতাAWS BudgetsCost Management budgetsCloud Billing budgets
Audit logCloudTrailActivity LogCloud Audit Logs

আরও গভীরে: অনেক cloud API “eventually consistent”: AWS-এর ডকুমেন্টেশন অনুযায়ী EC2-তে তৈরির ঠিক পরেই Describe ডাকলে resource “নেই” বলতে পারে, তাই script-এ waiter বা backoff লাগে। Full jitter-এর তুলনা Marc Brooker-এর ২০১৫ সালের AWS Architecture Blog লেখায় আছে; Retry-র ঝুঁকি Google-এর Site Reliability Engineering (২০১৬) বইয়ে আলোচিত। 429 এসেছে RFC 6585 (২০১২) থেকে, HTTP-র idempotent method-এর সংজ্ঞা RFC 9110 (২০২২)-এ। AWS Signature Version 4 মূল secret থেকে তারিখ, region আর service দিয়ে আলাদা signing key বানায়, ফলে একটি derived key ফাঁস হলেও ক্ষতি সেই পরিধিতে সীমিত থাকে।

পরীক্ষা ও ইন্টারভিউতে:

  • Console আর CLI-এর পার্থক্য কী? দুটোই একই API ডাকে; পার্থক্য শুধু ব্যবহারের ধরনে, ক্ষমতায় নয়।
  • Control plane আর data plane কী? প্রথমটি ব্যবস্থাপনা ও সিদ্ধান্ত, দ্বিতীয়টি আসল কাজের পথ।
  • Exponential backoff-এ jitter কেন? সব client একসাথে ফিরে আসা ঠেকাতে।
  • Idempotency token কেন? Timeout-এর পর retry করলে যাতে duplicate resource না হয়।
  • Key ফাঁস হলে প্রথম কাজ? Key disable করা, তারপর audit log, পরিষ্কার, সব secret বদল আর পর্যালোচনা।

৯ · AI-এর যুগে cloud কমান্ড — যাচাই না করে চালাবেন না

AI খুব দ্রুত CLI কমান্ড আর script লিখে দেয়। কিন্তু cloud-এ একটি ভুল কমান্ড শুধু error দেয় না; টাকা খরচ করে, ডেটা মোছে, বা দরজা খোলা রেখে দেয়। আর AI জানে না আপনার account-এ কী আছে।

AI-এর সাধারণ ভুলবিপদযাচাই
* অনুমতি বা AdministratorAccessফাঁস হলে পুরো accountঠিক কোন action লাগবে তা লিখুন
0.0.0.0/0 খোলা portসারা internet থেকে প্রবেশনিজের IP বা bastion-এ সীমিত করুন
Bucket public করাডেটা ফাঁসPublic access block চালু আছে কি না দেখুন
কোডে key বসানোGit-এ ফাঁসLogin-ভিত্তিক credential ব্যবহার করুন
বানানো flag বা পুরোনো API versionError, বা ভুল আচরণ--help আর সরকারি ডকুমেন্ট
latest tag বা পুরোনো imageআজ চলে, কাল ভাঙেVersion নির্দিষ্ট করুন
বড় instance, NAT, খরচের উল্লেখ নেইবিল বাড়েPricing পাতা, budget alert
terraform destroy, kubectl delete, rm -rfসতর্কতা ছাড়া ধ্বংসআগে --dry-run বা plan, তারপর পড়ে সিদ্ধান্ত
Retry আছে, token নেই; প্রথম পাতাই পড়াDuplicate, অসম্পূর্ণ ফলPagination আর idempotency খুঁজুন

AI-কে কমান্ড চাইলে প্রসঙ্গ দিন, আর ঝুঁকিও লিখিয়ে নিন। Prompt-এ কখনো আসল key, account id বা গ্রাহকের তথ্য দেবেন না।

আমি শেখার জন্য একটি পরীক্ষার account ব্যবহার করছি। [provider]-এর CLI দিয়ে একটি ছোট VM বানাতে চাই, region [region]. এই শর্তগুলো মেনে উত্তর দাও: ১. প্রতিটি flag-এর কাজ বাংলায় বলো, আর কোন flag-টি সরকারি ডকুমেন্টে আছে তা আমি কোথায় যাচাই করব বলো। ২. owner ও env tag রাখো। ৩. ন্যূনতম অনুমতি কী লাগবে বলো, * ব্যবহার করবে না। ৪. VM-এর সাথে আর কোন কোন resource তৈরি হবে, আর কোনটির খরচ হতে পারে, তালিকা দাও। দাম অনুমান করবে না। ৫. dry-run থাকলে সেটি আগে দেখাও। ৬. সব মুছে ফেলার কমান্ড দাও, আর কীভাবে নিশ্চিত হব যে কিছু বাকি নেই সেটিও বলো। আমার account-এর কোনো secret আমি তোমাকে দেব না।

AI-এর দেওয়া cloud কমান্ড চালানোর আগে — চেকলিস্ট

ভাবনার প্রশ্ন

প্রতিটি প্রশ্ন নিয়ে নিজে কিছুক্ষণ ভাবুন — তারপর “→ উত্তর” চাপুন।

প্র ০১Console এত সহজ, তবু পেশাদাররা কেন CLI, API আর IaC-র কথা বলেন? Console কি তবে খারাপ?

Console খারাপ নয়, এর ক্ষেত্র আলাদা। সমস্যা হয় যখন স্থায়ী পরিবেশ হাতে ক্লিক করে বানানো হয়; এই অভ্যাসের ঠাট্টার নাম ClickOps. হাতে বানানো জিনিসে তিনটি দুর্বলতা থাকে:

  • পুনরাবৃত্তি: staging-এ যা ৪০টি ক্লিকে হয়েছিল, production-এ হুবহু একই হবে কি না কেউ বলতে পারে না। একটি ঘর ভুলে গেলেই দুই পরিবেশ আলাদা হয়ে যায়।
  • পর্যালোচনা: ক্লিকের কোনো code review নেই। কেউ আগে থেকে দেখতে পারে না কী বদলাবে।
  • স্মৃতি: audit log “কী হয়েছে” বলে, কিন্তু “কেন হয়েছে” বলে না। যিনি বানিয়েছিলেন তিনি চলে গেলে জ্ঞানটিও চলে যায়।

“API আগে” চিন্তার পেছনে একটি বিখ্যাত গল্প আছে। Steve Yegge-র ২০১১ সালের একটি লেখা অনুযায়ী, ২০০০-এর দশকের শুরুতে Amazon-এর ভেতরে নির্দেশ দেওয়া হয়েছিল যে দলগুলো একে অন্যের সাথে শুধু service interface দিয়ে কথা বলবে। লেখাটি একজন সাবেক কর্মীর স্মৃতি, কোনো আনুষ্ঠানিক নথি নয়, তাই খুঁটিনাটি সাবধানে পড়ুন। তবে শিক্ষাটি সুপরিচিত: যা API দিয়ে করা যায়, তা স্বয়ংক্রিয় করা যায়, আর যা স্বয়ংক্রিয় করা যায়, তা বড় করা যায়।

তবু console-এর জায়গা আছে। নতুন সার্ভিস ঘুরে দেখা, বিলের গ্রাফ পড়া, ঘটনার সময় অবস্থা দেখা, এসবে ছবি অনেক সাহায্য করে। অনেক দল production-এ console-কে read-only রাখে: দেখা যাবে, বদলানো যাবে Git আর pipeline দিয়ে।

মূল উপলব্ধি: প্রশ্নটি “console না CLI” নয়। প্রশ্ন হলো, এই কাজটি একবারের, নাকি বারবার হবে এবং অন্যদের বোঝার মতো হতে হবে? উত্তর দ্বিতীয়টি হলে তাকে কোডে আনুন।

প্র ০২একটিমাত্র root account হাতছাড়া হলে ঠিক কতটা ক্ষতি হতে পারে? Backup থাকলেই কি আমরা নিরাপদ?

Root-এর হাতে সবকিছু: resource, backup, বিল, এমনকি অন্য সব identity. তাই নিরাপত্তায় একে বলে সবচেয়ে বড় blast radius, অর্থাৎ একটি ভুলে ক্ষতির সর্বোচ্চ পরিধি।

একটি বহুল আলোচিত ঘটনা Code Spaces (২০১৪)। প্রকাশিত বিবরণ অনুযায়ী, এই code-hosting কোম্পানির cloud নিয়ন্ত্রণ-পাতায় একজন অনুপ্রবেশকারী ঢুকে পড়েন, টাকা দাবি করেন, আর দল নিয়ন্ত্রণ ফেরাতে চাইলে অনেক ডেটা ও backup মুছে যায়। কিছুদিনের মধ্যে কোম্পানিটি কার্যক্রম বন্ধ করার ঘোষণা দেয়। সব খুঁটিনাটি বাইরে থেকে যাচাই করা কঠিন, তবে মূল শিক্ষা স্পষ্ট: Backup যদি একই account-এ, একই চাবির নাগালে থাকে, তবে সেটি স্বাধীন backup নয়।

এ থেকে কয়েকটি বাস্তব নিয়ম আসে:

  • দুর্গের দেয়াল: root-এ MFA, দৈনন্দিন ব্যবহার বন্ধ, আর root-এ ঢোকার ঘটনায় alert. কিছু প্রতিষ্ঠান একে “break-glass” পরিচয় হিসেবে রাখে: শুধু জরুরি মুহূর্তের জন্য।
  • আলাদা ঘর: backup আলাদা account বা subscription-এ, যেখানে production-এর চাবি মুছতে পারে না (পর্ব ২৪ ও ৩৫)।
  • Email-ই চাবি: root-এর email দখল হলে password reset দিয়েই account চলে যেতে পারে। তাই ব্যক্তিগত email-এর বদলে সুরক্ষিত দলীয় ঠিকানা, আর সেখানেও MFA.
  • মানুষের নির্ভরতা: একজনের ফোনে একমাত্র MFA থাকলে তিনি চলে গেলে দল আটকে যাবে। Recovery-র পথ আগেই লিখে রাখুন।

মূল উপলব্ধি: নিরাপত্তা শুধু “ঢুকতে না দেওয়া” নয়, “ঢুকে গেলেও ক্ষতি সীমিত রাখা”। প্রতিটি ক্ষমতাকে এমনভাবে ভাগ করুন, যাতে একটি চাবি হারালে পুরো বাড়ি না যায়।

প্র ০৩“Key সাবধানে রাখুন” বলে সমস্যা মেটে না কেন? Short-lived credential আসল সমাধান হয় কীভাবে?

কারণ এটি মানুষের নিখুঁত থাকার ওপর নির্ভর করে, আর মানুষ ক্লান্ত হয়, তাড়াহুড়া করে। ২০১৯ সালে NDSS সম্মেলনে North Carolina State University-র গবেষকদের “How Bad Can It Git?” পত্রে দেখানো হয়, public GitHub-এ এক লাখের বেশি repository-তে API key বা cryptographic key-এর মতো secret ছড়িয়ে আছে, আর অনেক secret ধরা পড়ার পরেও দীর্ঘদিন সেখানে থেকে যায়। এটি বিচ্ছিন্ন অসাবধানতা নয়, একটি নিয়মিত ঘটনা।

ক্ষতিও বাস্তব। মার্কিন FTC-র প্রকাশিত অভিযোগ অনুযায়ী, Uber-এর একটি ডেটা ফাঁসের ঘটনায় (২০১৬) একটি code repository-তে থাকা cloud access key ব্যবহার করে storage-এর ডেটায় প্রবেশ করা হয়েছিল। লক্ষ করুন, private repository-ও সেখানে রক্ষা করেনি, কারণ সেই repository-তে ঢোকার পথেই দুর্বলতা ছিল।

স্থায়ী key-এর মূল সমস্যা গণিতের মতো সরল: ঝুঁকি = ক্ষমতা × সময়। Key যত বেশি দিন টেকে, তার কপি তত বেশি জায়গায় জমে: ল্যাপটপ, backup, log, পুরোনো কর্মীর ফাইল। Short-lived credential সময়ের ঘরটি প্রায় শূন্যে নামায়। আর least privilege কমায় ক্ষমতার ঘরটি।

আসল সুবিধাটি আরও গভীর: এতে রাখার মতো কিছু থাকেই না। VM-এ attached role বা pipeline-এর OIDC-তে কোনো secret ফাইলে লিখতে হয় না, তাই commit করার মতো কিছু নেই। এটি মানুষকে সতর্ক করার বদলে ভুলের সুযোগ সরিয়ে দেয়।

তবে সীমাও আছে। সাময়িক token-ও মেয়াদের ভেতরে চুরি হতে পারে, আর OIDC-র ভুল কনফিগারেশনে ভুল repository ক্ষমতা পেতে পারে। তাই audit log, scan আর দ্রুত প্রতিক্রিয়া তখনো লাগে।

মূল উপলব্ধি: ভালো নিরাপত্তা নকশা মানুষকে শুধু “আরও সাবধান হোন” বলে না। সে এমন ব্যবস্থা বানায়, যেখানে ভুল করা কঠিন, আর ভুল হলেও ক্ষতি ছোট ও সময়সীমিত।

প্র ০৪Budget ছাড়ালে provider নিজে থেকে সব বন্ধ করে দেয় না কেন? এটি কি শুধু বেশি বিল তোলার কৌশল?

এই অভিযোগ খুব পরিচিত, আর এর পেছনে সত্যিকারের কষ্টের গল্পও আছে: শিক্ষার্থীর হাতে হঠাৎ বড় বিল। তবে কারিগরি দিক থেকে সমস্যাটি সত্যিই জটিল। একটি বোতামে “সীমা পার হলে সব বন্ধ” বানাতে গেলে কয়েকটি প্রশ্নের উত্তর দিতে হয়:

  • “বন্ধ” মানে কী? VM থামানো সহজ। কিন্তু disk, database আর object storage-এও খরচ চলে। সেগুলো বন্ধ করা মানে ডেটা মুছে ফেলা। $২ বাঁচাতে গ্রাহকের ডেটা মুছে দেওয়া বেশিরভাগ ব্যবসার কাছে অনেক বড় বিপর্যয়।
  • Production-এ কী হবে? ঈদের আগে বিক্রি বেড়ে খরচ budget ছাড়ালে সাইট বন্ধ হওয়া নিশ্চয়ই কেউ চান না। ব্যবসার কাছে অনেক সময় বিল বেশি আসাই সাইট পড়ে যাওয়ার চেয়ে ভালো।
  • দেরি: বিলের তথ্য নানা সিস্টেম থেকে জমা হতে সময় নেয়। তাই “ঠিক $৫০-এ থামা” প্রকৌশলের দিক থেকে কঠিন; ততক্ষণে মিটার এগিয়ে গেছে।

তাই provider-গুলো সাধারণত alert দেয়, আর সাথে কিছু কর্মপথ: budget থেকে প্রোগ্রাম চালিয়ে resource বন্ধ করা, অনুমতি সীমিত করা। কিছু credit-ভিত্তিক বা শিক্ষার্থী offer-এ spending limit থাকে; AWS Budgets-এ action, Azure-এর কিছু offer-এ spending limit, আর Google Cloud-এ budget notification থেকে প্রোগ্রাম করে billing বন্ধ করার পদ্ধতি দেখা যায়। এগুলোর শর্ত provider-ভেদে আলাদা আর সময়ের সাথে বদলায়, তাই বর্তমান ডকুমেন্টেশন দেখে নিন।

একই সাথে সমালোচনাটিও উড়িয়ে দেওয়ার মতো নয়। শেখার জন্য ছোট account-এ একটি পরিষ্কার “hard cap” বিকল্প থাকলে অনেক শিক্ষার্থী নিরাপদ বোধ করতেন। এটি প্রযুক্তির সীমা যতটা, পণ্যের সিদ্ধান্তও ততটাই।

আপনার করণীয়: alert রাখুন, সন্দেহজনক হলে স্বয়ংক্রিয় ব্যবস্থা বানান, আর সন্দেহজনক বড় বিল পেলে সাথে সাথে provider-এর support-এ যোগাযোগ করুন। মাফ পাওয়া যাবে কি না তা নিশ্চিত নয়।

মূল উপলব্ধি: Cloud-এ খরচের দায়িত্ব shared responsibility-র মতোই আপনার দিকে। Budget alert দেয়াল নয়, ধোঁয়ার সংকেত; আগুন নেভানোর কাজ আপনার।

প্র ০৫Retry তো নির্ভরযোগ্যতা বাড়ায়। তাহলে retry থেকেই কেন অনেক সময় পুরো সিস্টেম পড়ে যায়?

কারণ retry হলো বাড়তি কাজ, আর সেটি আসে ঠিক তখনই, যখন সিস্টেম সবচেয়ে দুর্বল। ধরুন একটি service ধারণক্ষমতার কাছাকাছি চলছে, হঠাৎ কিছুটা ধীর হলো। কিছু অনুরোধ timeout হলো। Client-রা retry করল, ফলে লোড বাড়ল, আরও ধীর হলো, আরও timeout, আরও retry. মূল সমস্যা চলে গেলেও এই চক্র নিজে থেকেই চলতে থাকতে পারে। Bronson ও সহকর্মীরা (HotOS ২০২১) এমন অবস্থাকে বলেছেন metastable failure: কারণ সরে গেলেও সিস্টেম খারাপ অবস্থায় আটকে থাকে।

স্তর থাকলে ক্ষতি গুণ হয়। ধরুন ডাকের পথ browser → gateway → API → database, আর ডাকার সময় ব্যর্থ হলে প্রতিটি ডাকা-স্তর (browser, gateway, API) মোট ৩ বার চেষ্টা করে। তবে তলার database একটি অনুরোধের জন্য পেতে পারে ৩ × ৩ × ৩ = ২৭টি চেষ্টা। ছোট সংখ্যা, কিন্তু ভিড়ের সময় ২৭ গুণ লোড মানে পতন। Google-এর Site Reliability Engineering বইয়ে এজন্যই বলা হয়েছে এক স্তরে retry রাখতে আর একটি retry budget ব্যবহার করতে।

ভালো অভ্যাসগুলো হলো:

  • Backoff আর jitter: সবাই একসাথে না ফিরে সময়ে ছড়িয়ে পড়ে। Marc Brooker-এর ২০১৫ সালের লেখায় simulation-এ দেখা যায়, jitter ছাড়া exponential backoff ভিড় কমায় না, শুধু দেরিতে ফেরে।
  • সীমা: সর্বোচ্চ চেষ্টার সংখ্যা আর মোট সময়সীমা (deadline) রাখুন।
  • Retry budget: যেমন, মোট অনুরোধের নির্দিষ্ট শতাংশের বেশি retry নয়।
  • Circuit breaker: অপর পক্ষ অসুস্থ বুঝলে কিছুক্ষণ চেষ্টাই বন্ধ।
  • Retry-After মানা: Server যা বলছে, তা শোনা।
  • Idempotency: নইলে retry নিরাপদই নয়। “Exactly once” পাঠানো বাস্তবে নিশ্চিত করা যায় না; at-least-once পাঠানো আর idempotent গ্রহণ মিলে কার্যত “একবার” ফল দেয়।

মূল উপলব্ধি: Retry একটি ধারালো হাতিয়ার। ছোট, ক্ষণিকের সমস্যায় এটি অদৃশ্য বীর। দীর্ঘ সমস্যায় এটি আগুনে ঘি। তাই শুধু “retry আছে” নয়, “কতবার, কত দেরিতে, কোন error-এ, কোন স্তরে” — এই চারটি প্রশ্নের উত্তর জানাই নকশা।

অনুশীলন

আগে নিজে চেষ্টা করুন, তারপর উত্তর মিলিয়ে দেখুন।

  1. হিসাব (ধরে নেওয়া দর): একটি VM ঘণ্টায় $০.০৫, ৫০ GB disk প্রতি GB-মাসে $০.০৮, public IP ঘণ্টায় $০.০০৪। ৩০ দিনের মাস। (ক) সব পুরো মাস চললে বিল কত? (খ) ১০ দিন পরে শুধু VM stop করলে, আর disk ও IP চলতে থাকলে? (গ) ১০ দিন পরে সব delete করলে? (ঘ) Base ০.৫ সেকেন্ড, cap ৮ সেকেন্ড; full jitter-এ প্রথম ৬টি retry-তে সর্বোচ্চ মোট কত অপেক্ষা হতে পারে?

    (ক) VM: ০.০৫ × ৭২০ = $৩৬। Disk: ৫০ × ০.০৮ = $৪। IP: ০.০০৪ × ৭২০ = $২.৮৮। মোট $৪২.৮৮.

    (খ) VM ২৪০ ঘণ্টা: $১২। Disk আর IP পুরো মাস: $৬.৮৮। মোট $১৮.৮৮. Stop করে $২৪ বাঁচল, তবু $৬.৮৮ চলল।

    (গ) VM $১২, disk ৪ × (১০/৩০) ≈ $১.৩৩, IP ০.০০৪ × ২৪০ = $০.৯৬। মোট প্রায় $১৪.২৯.

    (ঘ) সর্বোচ্চ অপেক্ষা: ০.৫, ১, ২, ৪, ৮, ৮ (শেষটি cap-এ আটকে গেছে, নইলে ১৬ হতো)। যোগফল ২৩.৫ সেকেন্ড. Full jitter-এ প্রতিটি অপেক্ষা ০ থেকে এই মানের মধ্যে এলোমেলো, তাই গড়ে অর্ধেক, প্রায় ১১.৭৫ সেকেন্ড।

  2. ফল অনুমান করুন: খেলনা API-র নিয়ম: নতুন id ক্রমে vm-0001, vm-0002…; একই token দেখলে আগের id ফেরত, আর token চিরদিন মনে থাকে। ক্রমে চলল: Create(T1), Create(T1), Create(token নেই), Create(T2), Delete(vm-0001), Create(T1), List(limit 2). প্রতিটি কাজের ফল কী? শেষে কয়টি VM আছে?

    Create(T1) → vm-0001, নতুন। Create(T1) → vm-0001, replay. Token ছাড়া → vm-0002. Create(T2) → vm-0003. Delete → ok. Create(T1) → vm-0001, replay! List → vm-0002 vm-0003, next = null.

    শেষে ২টি VM. কৌতূহলের জায়গা হলো ষষ্ঠ কাজ: API বলছে vm-0001 আছে, অথচ সেটি মুছে গেছে। Token মনে রাখার এটি এক পার্শ্বপ্রতিক্রিয়া। নতুন কাজের জন্য তাই নতুন token লাগে; একই token শুধু একই কাজের retry-র জন্য। আসল API-র আচরণ provider-ভেদে আলাদা।

  3. নকশা সমালোচনা: একটি ছোট দল এভাবে চলে: সবাই একই root email আর password ব্যবহার করে; স্থায়ী key config.js-এ Git-এ আছে; resource-এ কোনো tag নেই; budget alert নেই, মাস শেষে বিল দেখা হয়; backup একই account-এ। অন্তত পাঁচটি সমস্যা আর তার প্রতিকার লিখুন।
    • শেয়ার করা root: কে কী করল বোঝা যায় না, MFA কার্যত অচল। প্রতিকার: root লকারে রেখে MFA, প্রত্যেকের আলাদা identity.
    • Git-এ key: ধরে নিন ফাঁস হয়েছে। Key বন্ধ করে বদলান, সাময়িক credential আর secret manager-এ যান, commit-এর আগে scan বসান।
    • Tag নেই: Resource-এর মালিক অজানা, মুছতে সবাই ভয় পায়। প্রতিকার: owner, env বাধ্যতামূলক।
    • Budget alert নেই: ভুল ধরা পড়ে এক মাস পরে। প্রকৃত ও পূর্বাভাস দুটি alert রাখুন।
    • একই account-এ backup: এক চাবিতেই সব যেতে পারে। Backup আলাদা account-এ, মোছা-সুরক্ষাসহ রাখুন।
    • Audit log দেখার ব্যবস্থা নেই: ঘটনা হলে তদন্ত কঠিন। চালু করে সুরক্ষিত জায়গায় রাখুন।
  4. ঐচ্ছিক, হাতে-কলমে (আসল cloud ব্যবহারে টাকা খরচ হতে পারে): আপনার যদি ইতিমধ্যে একটি শেখার account থাকে, তবে নিচের চারটি মিলিয়ে দেখুন, কোনো resource না বানিয়ে: root-এ MFA আছে? Budget alert আছে? সব region-এ কোনো অচেনা resource আছে? কোনো পুরোনো access key আছে? Account না থাকলে শুধু একটি লিখিত “প্রথম দিনের চেকলিস্ট” বানান।

    কাজটি শুধু পড়া ও দেখার, তাই সাধারণত খরচের প্রশ্ন আসে না। বিলের পাতায় service আর region অনুযায়ী খরচ ভাগ করে দেখা সবচেয়ে সহজ পথ, কারণ সেখানে সব region একসাথে আসে। পুরোনো key পেলে আগে দেখুন কোথায় ব্যবহার হচ্ছে, তারপর disable করে কিছুদিন লক্ষ রাখুন, শেষে মুছুন। অচেনা resource পেলে হঠাৎ মুছে না দিয়ে আগে audit log-এ দেখুন কে বানিয়েছে; সম্ভব হলে তবেই সিদ্ধান্ত নিন। কোনো স্ক্রিনশট শেয়ার করার আগে account id আর key ঢেকে দিন।

নিজেকে যাচাই করুন

ভুল হলে কারণসহ ব্যাখ্যা পাবেন, আবার চেষ্টাও করতে পারবেন।

ক্রমনতুন cloud account-এর নিরাপদ শুরুর ধাপগুলো সঠিক ক্রমে সাজান (▲▼ চেপে সরান)

  1. 🔐 শক্ত password দিয়ে root/owner account খোলা
  2. 📱 Root-এ MFA চালু করা
  3. 🔔 Budget alert বসানো
  4. 👤 দৈনন্দিন কাজের সীমিত identity বানানো
  5. 🏷️ Tag-সহ পরীক্ষার resource বানানো
  6. 🧹 কাজ শেষে delete করে তালিকা ও বিল মিলিয়ে দেখা

Cloud-এর console, CLI, SDK আর IaC tool-এর মধ্যে মিল কোনটি?

  • সবার ক্ষমতা সবসময় root-এর সমান
  • সবাই শেষে একই ধরনের API অনুরোধ পাঠায়
  • সবাই সরাসরি physical server-এ লগইন করে
  • সবাইকে একই ভাষায় কোড লিখতে হয়

VM তৈরির অনুরোধে timeout হলো, উত্তর আসেনি। Client একই idempotency token দিয়ে আবার পাঠাল, আর আগের অনুরোধটি আসলে সফল হয়েছিল। ঠিকভাবে বানানো API কী করবে?

  • আরেকটি নতুন VM বানাবে
  • অনুরোধকে নিরাপত্তা-ঝুঁকি ভেবে account বন্ধ করবে
  • নতুন VM না বানিয়ে আগের VM-এর ফল ফেরত দেবে
  • আগের VM মুছে নতুন একটি বানাবে

Full jitter backoff-এ base = 1 সেকেন্ড, cap = 16 সেকেন্ড, n = 6 (wait = random(0, min(cap, base × 2^n))). অপেক্ষা কোন পরিসরে হবে?

  • ০ থেকে ৬৪ সেকেন্ড
  • ০ থেকে ৬ সেকেন্ড
  • ঠিক ১৬ সেকেন্ড
  • ০ থেকে ১৬ সেকেন্ড

৩০ দিনের মাসের ১২তম দিন শেষে মোট খরচ $18, খরচের গতি সমান ধরে নিন। Budget $40 হলে সরল পূর্বাভাস কী বলে?

  • মাস শেষে প্রায় $45; budget পার হবে
  • মাস শেষে $18; কোনো সমস্যা নেই
  • মাস শেষে $30; budget-এর নিচে
  • মাস শেষে $540; budget অনেক পার

একটি script List API ডেকে 100টি VM পেল, আর উত্তরে একটি next token-ও আছে। Script বলল, “মোট 100টি VM”. সমস্যা কোথায়?

  • 100 সংখ্যাটি API-র জন্য খুব বেশি
  • মাত্র প্রথম পাতা পড়া হয়েছে; আরও VM থাকতে পারে
  • Rate limit-এ পড়েছে, তাই আবার পুরোটা চালাতে হবে
  • Idempotency token না থাকায় VM duplicate হয়েছে

একটি cloud access key ভুলে public repository-তে push হয়ে গেছে। প্রথম কাজ কোনটি?

  • শুধু Git history থেকে ফাইলটি মুছে ফেলা
  • কে ভুল করেছেন তা খুঁজে বের করা
  • Key-টি অবিলম্বে নিষ্ক্রিয় করা
  • মাসের বিল আসা পর্যন্ত অপেক্ষা করে দেখা

শব্দকোষ

লেখার মধ্যে ডটেড দাগ দেওয়া শব্দে মাউস রাখুন বা চাপুন — অর্থ দেখাবে। এই পর্বের সব নতুন শব্দ এখানে একসাথে:

মনে রাখুন

  1. Console, CLI, SDK আর IaC সবাই শেষে একই API ডাকে; অনুরোধ আগে যাচাই হয়, তারপর control plane আর data plane-এ যায়।
  2. Signed request-এ secret পথে যায় না; resource-এর ঠিকানায় account আর region থাকে।
  3. Root-এ MFA, দৈনন্দিন কাজে আলাদা identity, প্রথম দিনেই budget alert আর tag.
  4. Budget alert থামায় না, Stop মানে Delete নয়; key ফাঁস হলে আগে বন্ধ করুন।
  5. সব page পড়ুন, backoff + jitter দিয়ে retry করুন, আর তৈরির অনুরোধে idempotency token দিন।

পরের পর্বে: এতক্ষণ দেখলেন cloud-এর সাথে কথা বলার পথ। কিন্তু দলগুলো একসাথে কীভাবে কাজ করলে এই ক্ষমতা সত্যিই কাজে লাগে? সেখান থেকেই আসে DevOps, SRE আর তাদের সংস্কৃতি।

আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ

এই পর্বটি শেয়ার করুন:
এই পর্বে ভুল পেয়েছেন? জানান