এই পর্বে যা শিখবেন
- Bucket-এর নাম ও region বাছা, key সাজানো, আর prefix দিয়ে তালিকা আনা
- Metadata, ETag, multipart upload আর read-after-write consistency-র আসল আচরণ
- Versioned bucket-এ PUT, DELETE আর restore-এর সঠিক ফল আগে থেকে বলতে পারা
- Lifecycle rule লেখা, আর retrieval ও ন্যূনতম সময়ের খরচসহ ১২ মাসের বিল হিসাব করা
- Public access বন্ধ রাখা, presigned URL দিয়ে সরাসরি upload, আর ransomware-এর বিরুদ্ধে immutable backup
১ · Bucket, region আর key — “folder” আসলে নেই
পর্ব ২০-এ (Object, block আর file storage) দেখা হয়েছে কোন কাজে object storage মানায়। এবার প্রশ্ন বদলাল: এটি চালাবেন কীভাবে? ধরুন একটি কাল্পনিক অনলাইন বাজার অ্যাপ। তাতে পণ্যের ছবি, ক্রেতার invoice, প্রতিদিনের log আর database backup জমে। ভুল setting দিলে হয় বিল ফুলে ওঠে, নয় ডেটা ফাঁস হয়, নয় ফাইল চিরতরে হারায়। এই পর্ব সেই তিন বিপদের হাত থেকে বাঁচার হাতের কাজ।
গঠনের দিক থেকে object storage সরল। একটি bucket হলো ডেটা রাখার বড় পাত্র। প্রতিটি ফাইল একটি object, আর তার ঠিকানা একটি key. সব কাজ হয় HTTP API-তে: PUT, GET, DELETE, LIST.
একটি বিশাল গুদামঘর ভাবুন, যেখানে কোনো ঘর বা তাক ভাগ করা নেই। প্রতিটি বস্তার গায়ে লম্বা লেবেল: “ঢাকা/মিরপুর/মে/চাল-০৭”। লেবেল দেখে মনে হয় ঢাকা নামের ঘরের ভেতর মিরপুর নামের ঘর আছে। আসলে একটিই খোলা মেঝে। গুদাম-রক্ষক শুধু বলতে পারেন, “ঢাকা/মিরপুর/ দিয়ে শুরু হওয়া সব লেবেল দেখান।” Object storage-এ “folder” ঠিক এই লেবেলের শুরুর অংশ।
Bucket-এর নাম আর region
- নামটি সাধারণত সবার মধ্যে একক। S3-তে সাধারণ bucket-এর নাম ঐতিহ্যগতভাবে পুরো provider জুড়ে একক, ৩ থেকে ৬৩ অক্ষরের, ছোট হাতের অক্ষর, সংখ্যা আর হাইফেনে তৈরি। নামটি URL-এ বসে, তাই গোপন কিছু নামে রাখবেন না। ডট ব্যবহার করলে TLS certificate মেলাতে ঝামেলা হয়, তাই এড়ানো ভালো। নিয়ম provider-ভেদে আলাদা ও বদলায়।
- Azure-এ এক ধাপ বেশি। সেখানে storage account-এর ভেতরে container, তার ভেতরে blob. Account-এর নামটি একক হতে হয়।
- Region পরে বদলানো যায় না। Bucket একটি region-এ তৈরি হয় (কোথাও dual-region বা multi-region বিকল্পও আছে)। অন্য region-এ নিতে চাইলে নতুন bucket বানিয়ে কপি করতে হয়। তাই ব্যবহারকারী, compute আর আইনের দিক দেখে শুরুতেই বাছুন। পর্ব ৫-এর data residency-র কথা এখানে খাটে।
# উদাহরণ: চালানোর জন্য নয়। আসল cloud-এ চালালে খরচ হতে পারে।
aws s3 mb s3://example-bucket --region ap-southeast-1
aws s3 cp app.log s3://example-bucket/logs/2026/05/app.log
aws s3 ls s3://example-bucket/logs/2026/
aws s3api list-objects-v2 --bucket example-bucket \
--prefix logs/2026/ --delimiter /# নমুনা আউটপুট — version-ভেদে আলাদা হতে পারে
$ aws s3 ls s3://example-bucket/logs/2026/
PRE 04/
PRE 05/
PRE 05/ কোনো আসল folder নয়। এর নাম prefix. আপনি --prefix দিয়ে বললেন কোন লেখা দিয়ে শুরু হওয়া key চান, আর --delimiter / দিয়ে বললেন পরের / পর্যন্ত অংশকে এক দলে গুটিয়ে দেখাতে। Object না থাকলে “folder”-ও থাকে না। Key-র নিচের ব্যবহারিক ফলগুলো মনে রাখুন:
- Rename নেই: সাধারণ bucket-এ “নাম বদল” মানে নতুন key-তে কপি, তারপর পুরোনোটি মোছা। লাখো object-এর “folder rename” তাই লাখো অনুরোধ।
- তালিকা পাতায় পাতায় আসে: S3-তে এক পাতায় সর্বোচ্চ ১,০০০ key, ক্রম key-র বাইট অনুসারে। কোটি object-এর পুরো LIST ধীর ও খরচের, তাই তারিখভিত্তিক prefix রাখা ভালো:
logs/2026/05/. - Key-তে গোপন তথ্য নয়: ফোন নম্বর বা জাতীয় পরিচয়পত্রের নম্বর key-তে বসালে তা log আর URL-এ ছড়ায়।
uploads/u42/9f3a.jpg-এর মতো অর্থহীন নাম নিরাপদ।
S3-compatible মানে কতটা compatible?
Amazon S3 (২০০৬)-এর API এত ছড়িয়েছে যে অনেকে একই API দেন। একে বলে S3-compatible storage: নিজের server-এ চালানোর জন্য MinIO বা Ceph RGW, আর সেবা হিসেবে Cloudflare R2, Backblaze B2 ইত্যাদি। একই CLI বা SDK-তে শুধু endpoint বদলালেই অনেক কাজ চলে: aws s3 ls --endpoint-url https://storage.example.com. তবে “compatible” মানে সব feature নয়। Lifecycle, object lock, event বা replication-এর আচরণ আলাদা হতে পারে, আর লাইসেন্স ও দামের শর্তও বদলায়। ব্যবহারের আগে নিজের দরকারি প্রতিটি কাজ পরীক্ষা করে দেখুন।
২ · Object-এর ভেতরে — metadata, ETag আর multipart upload
একটি object মানে শুধু বাইট নয়। সাথে থাকে metadata: আকার, শেষ বদলের সময়, Content-Type, Cache-Control আর আপনার নিজের দেওয়া key-value. Metadata আলাদা করে বদলানো যায় না; object নিজের ওপর কপি করে নতুন metadata বসাতে হয়।
{
"LastModified": "2026-05-01T00:10:12+00:00",
"ContentLength": 1024,
"ETag": "\"9b2cf535f27731c974343645a3985328\"",
"ContentType": "text/plain",
"Metadata": { "app": "bazar-api" }
}এটি নমুনা উত্তর, version-ভেদে আলাদা হতে পারে। Content-Type ভুল হলে browser ছবি না দেখিয়ে ডাউনলোড করতে পারে, আর user-এর পাঠানো ফাইলকে HTML হিসেবে দেখালে নিরাপত্তার ঝুঁকি তৈরি হয়। তাই upload-এর সময় এটি নিজে ঠিক করে দিন।
ETag হলো object-এর একটি পরিচয়-চিহ্ন, যা বিষয়বস্তু বদলালে বদলায়। Cache যাচাই আর “মাঝখানে কেউ বদলেছে কি না” ধরার কাজে লাগে। সাবধান: একে সবসময় MD5 ভাববেন না। S3-তে সাধারণ একক PUT-এ প্রায়ই এটি MD5, কিন্তু KMS encryption বা multipart upload-এ নয়। Multipart-এর ETag-এর শেষে -3-এর মতো part-সংখ্যা থাকে। অখণ্ডতা যাচাইয়ের জন্য আলাদা checksum feature ব্যবহার করুন।
Multipart upload: বড় ফাইল ভেঙে পাঠানো
৫০ GB-র একটি backup একবারে পাঠাচ্ছেন। ৪৯ GB যাওয়ার পর সংযোগ কাটল। একক PUT-এ আবার শূন্য থেকে শুরু। Multipart upload-এ ফাইল টুকরো হয়, টুকরোগুলো একসাথেও যেতে পারে, আর ব্যর্থ টুকরোটিই শুধু আবার পাঠাতে হয়। বিয়েবাড়ির ক্যাটারিংয়ের মতো: সব খাবার এক ডেকচিতে না এনে আলাদা হাঁড়িতে আনা হয়, এক হাঁড়ি পড়ে গেলে শুধু সেটিই আবার রাঁধতে হয়।
লেখার সময়ে S3-তে part সর্বনিম্ন 5 MiB (শেষটি বাদে), আর part-সংখ্যা সর্বোচ্চ ১০,০০০. একক PUT-এর সীমা 5 GiB. সীমাগুলো provider-ভেদে আলাদা ও বদলায়। নিচে 250 MiB-র একটি ফাইল, part-এর আকার 100 MiB.
| অনুরোধ | |
| Part 1 | |
| Part 2 | |
| Part 3 | |
| জমা, বিলযোগ্য (MiB) | |
| মোট পাঠানো (MiB) | |
| GET backup.tar |
- শুরু। Client upload শুরু করতে চাইল, আর উত্তরে পেল একটি
UploadId. এখনো কিছু জমা হয়নি, তাই GET দিলে 404. - Part 1 সফল। 100 MiB জমা হলো। উত্তরে এই part-এর ETag এসেছে, client সেটি লিখে রাখল। Object এখনো দৃশ্যমান নয়, কিন্তু 100 MiB-র ভাড়া শুরু হয়ে গেছে।
- Part 2 ব্যর্থ। 60 MiB যাওয়ার পর সংযোগ কাটল। মোট পাঠানো হলো 160 MiB, কিন্তু জমা রইল 100 MiB. Part 1-এর কোনো ক্ষতি হয়নি।
- Part 3 এগিয়ে গেল। Part-গুলোর ক্রম মানতে হয় না, শুধু নম্বর ঠিক থাকলেই হলো। 50 MiB যোগ হয়ে জমা হলো 150 MiB, আর মোট পাঠানো 210 MiB.
- শুধু part 2 আবার। একই part নম্বরে আবার 100 MiB পাঠানো হলো। জমা 250 MiB, মোট পাঠানো 310 MiB. বাকি দুটি টুকরো ছোঁয়া হয়নি।
- Complete. Client তিনটি part-এর নম্বর আর ETag-এর তালিকা পাঠাল। এই মুহূর্তে object একবারে দৃশ্যমান হলো, আধা-লেখা অবস্থায় কেউ পড়তে পারেনি। একক PUT 160 MiB-তে ব্যর্থ হলে মোট যেত 160 + 250 = 410 MiB, এখানে গেছে 310 MiB.
লুকানো বিল: Complete বা Abort না করলে জমে থাকা part-গুলো ভাড়া টানতেই থাকে, অথচ সাধারণ তালিকায় দেখা যায় না। Crash করা upload থেকে এভাবে অদৃশ্য খরচ জমে। সমাধান একটি lifecycle নিয়ম, যা পরের অংশে আছে।
লিখেই কি পড়া যায়? Consistency
S3 ২০২০ সালের ডিসেম্বর থেকে সব PUT, DELETE আর LIST-এ শক্তিশালী read-after-write consistency দেয়, বাড়তি খরচ ছাড়া। অর্থাৎ PUT সফল হওয়ার পর যেকোনো client GET বা LIST করলে নতুন অবস্থাই পায়। Azure Blob আর Google Cloud Storage-ও object-এর ক্ষেত্রে শক্তিশালী consistency-র কথা বলে। অন্য S3-compatible সেবায় নিজে নিশ্চিত হোন। তিনটি সীমা মনে রাখুন: একই key-তে একসাথে দুটি PUT হলে শেষেরটি জেতে; CDN-এর cache পুরোনো কপি দেখাতে পারে; আর bucket-এর setting বদলের প্রভাব ছড়াতে কিছু সময় লাগতে পারে।
৩ · Versioning — মুছলেও মোছে না
রান্নাঘরের রেসিপি খাতার কথা ভাবুন। কেউ পুরোনো রেসিপি ছিঁড়ে ফেললে আর ফেরত আসে না। ভালো নিয়ম হলো পাতা না ছিঁড়ে নতুন পাতায় নতুন রেসিপি লেখা, আর বাতিল করতে হলে পাতার ওপর “বাতিল” স্টিকার লাগানো। স্টিকার তুললেই রেসিপি ফেরত। Versioning ঠিক এই নিয়ম, আর সেই স্টিকারের নাম delete marker.
S3-তে bucket-এর তিন অবস্থা: unversioned, enabled আর suspended. একবার চালু করলে আর unversioned-এ ফেরা যায় না, শুধু suspend করা যায়। চালু থাকলে প্রতিটি PUT একটি নতুন version বানায়। আগেরটি হয়ে যায় noncurrent version. আর version ID ছাড়া DELETE কিছুই মোছে না, শুধু সবার ওপরে একটি marker বসায়।
# উদাহরণ: চালানোর জন্য নয়
aws s3api put-bucket-versioning --bucket example-bucket \
--versioning-configuration Status=Enabled
aws s3api list-object-versions --bucket example-bucket \
--prefix reports/may.csv
aws s3api delete-object --bucket example-bucket \
--key reports/may.csv --version-id EXAMPLEVERSIONID| অনুরোধ | |
| Version (নতুন আগে) | |
| GET-এর ফল | |
| সাধারণ LIST | |
| বিলযোগ্য MB |
- প্রথম PUT. 10 MB-র রিপোর্ট জমা হলো, version
v1. এটিই current, GET দিলে এটিই আসে। - দ্বিতীয় PUT. 12 MB-র নতুন ফাইল এলো,
v2.v1মোছেনি, noncurrent হয়েছে। তাই বিল 10 + 12 = 22 MB-র। - সাধারণ DELETE. Version ID ছাড়া অনুরোধে সবার ওপরে marker
DM3বসল। GET এখন 404 দেয়, সাধারণ LIST-এ ফাইল নেই। কিন্তু বিল আগের মতোই 22 MB, কারণ কোনো বাইট মোছেনি। - Version তালিকা দেখা।
list-object-versionsতিনটি সারি দেখায়: marker আর দুটি version. কিছুই বদলায়নি। “ফাইল নেই” মনে হলে এই কমান্ডটিই সত্য বলে। - Marker মোছা মানে restore. Version ID দিয়ে
DM3মুছলেv2আবার current. ফাইল ফিরে এলো, GET দিচ্ছে 200. - Version ID দিয়ে DELETE.
v1এবার সত্যিই মুছল, বিল নেমে এলো 12 MB-তে। এই কাজের কোনো undo নেই। তাই এই অনুমতি খুব কম identity-কে দিন।
নিচের সিমুলেটরে আরও একটি পরিস্থিতি আছে: ভুল ফাইল ওপরে বসেছে, তাই marker তুললেও ভালো ফাইল ফেরে না। তখন পুরোনো version-কে ওপরে কপি করতে হয়।
// A versioned bucket: PUT, DELETE with a delete marker, and two ways to restore.
class Bucket {
constructor() { this.rows = []; this.n = 0; } // rows[0] = newest
put(key, mb) { const id = "v" + ++this.n;
this.rows.unshift({ key, id, mb }); return "PUT -> " + id; }
del(key, id) {
if (id) { this.rows = this.rows.filter(r => r.id !== id);
return "DELETE version " + id + " (permanent)"; }
const dm = "DM" + ++this.n;
this.rows.unshift({ key, id: dm, mb: 0, marker: true });
return "DELETE -> marker " + dm; }
copyBack(key, id) { const old = this.rows.find(r => r.id === id);
return "COPY " + id + " on top: " + this.put(key, old.mb); }
get(key) { const cur = this.rows.find(r => r.key === key);
return !cur || cur.marker ? "404" : "200 " + cur.id; }
mb() { return this.rows.reduce((s, r) => s + r.mb, 0); }
show(key, msg) { const ids = this.rows.map(r => r.id).join(" ");
console.log(msg.padEnd(32) + " | GET " + this.get(key).padEnd(6) +
" | " + String(this.mb()).padStart(2) + " MB | " + ids); }
}
const b = new Bucket(), k = "reports/may.csv";
b.show(k, b.put(k, 10)); // good report
b.show(k, b.put(k, 12)); // a wrong file overwrites it
b.show(k, b.del(k)); // someone deletes it
b.show(k, b.del(k, "DM3")); // restore 1: remove the marker
b.show(k, b.copyBack(k, "v1")); // restore 2: copy the good version on top
b.show(k, b.del(k, "v2")); // really remove the wrong fileআসল আউটপুট:
PUT -> v1 | GET 200 v1 | 10 MB | v1
PUT -> v2 | GET 200 v2 | 22 MB | v2 v1
DELETE -> marker DM3 | GET 404 | 22 MB | DM3 v2 v1
DELETE version DM3 (permanent) | GET 200 v2 | 22 MB | v2 v1
COPY v1 on top: PUT -> v4 | GET 200 v4 | 32 MB | v4 v2 v1
DELETE version v2 (permanent) | GET 200 v4 | 20 MB | v4 v1
চতুর্থ সারিতে marker উঠে গেলেও ভুল ফাইল v2 ফিরেছে। পঞ্চম সারিতে v1 কপি হয়ে নতুন v4 হলো, আর বিল বেড়ে 32 MB, কারণ একই বিষয়বস্তু এখন দুবার জমা। শেষে v2 মোছায় 20 MB থাকল। শিক্ষা: restore-ও খরচের হিসাবে আসে। Versioning-এর সাথে পুরোনো version মোছার নিয়ম না রাখলে বিল শুধু বাড়ে।
সব provider এক রকম নয়: Delete marker ধারণাটি মূলত S3-র। Google Cloud Storage-এ object versioning আর soft delete, আর Azure-এ blob versioning আর soft delete আলাদা নিয়মে চলে। ধারণা এক, কমান্ড আর ফল মিলিয়ে দেখবেন। নিজে চেষ্টা করতে চাইলে মনে রাখুন, আসল cloud-এ খরচ হতে পারে। শেষে সব version আর marker মুছে তারপর bucket মুছুন, নইলে bucket খালি নয় বলে মোছা যাবে না।
৪ · Storage class — গরম তাক থেকে দূরের গুদাম
মুদি দোকানে যা রোজ বিক্রি হয়, তা হাতের কাছের তাকে থাকে। মাসে একবার লাগে এমন মাল থাকে পেছনের ঘরে। আর বছরের পুরোনো হিসাবের খাতা চলে যায় দূরের গুদামে। ভাড়া কমে, কিন্তু আনতে সময় আর লোক লাগে। Storage class এই একই হিসাব। ডেটা যত ঠান্ডা ধাপে যায়, জমার দাম তত কমে, কিন্তু পড়ার খরচ আর শর্ত তত বাড়ে।
Storage tier-এর সিঁড়ি
Lower rungs store cheaper, but reading gets costlier (সব দাম ধরে নেওয়া)
| ধাপ | Amazon S3 | Azure Blob | Google Cloud Storage |
|---|---|---|---|
| গরম | Standard | Hot | Standard |
| ঠান্ডা (প্রায় ৩০ দিন) | Standard-IA, One Zone-IA | Cool | Nearline |
| আরও ঠান্ডা (প্রায় ৯০ দিন) | Glacier Instant Retrieval | Cold | Coldline |
| Archive | Glacier Flexible Retrieval (৯০ দিন), Deep Archive (১৮০ দিন) | Archive (১৮০ দিন) | Archive (৩৬৫ দিন) |
| Archive থেকে পড়া | আগে restore: মিনিট থেকে ঘণ্টা, Deep Archive-এ অনেক ঘণ্টা | আগে rehydration: ঘণ্টার হিসাবে | ms-এ পড়া যায়, তবে পড়ার ফি বেশি |
এটি লেখার সময়ের সাধারণ চিত্র, এবং class আর সীমা বদলায়। শেষ সারিটি খেয়াল করুন: একই “archive” নামে অপেক্ষা ঘণ্টাও হতে পারে, ms-ও হতে পারে। তাই নাম নয়, শর্ত পড়ুন। S3-র Intelligent-Tiering-এর মতো স্বয়ংক্রিয় class-ও আছে, যা ব্যবহার দেখে নিজেই ধাপ বদলায়, বিনিময়ে object-প্রতি নজরদারি ফি নেয়।
তিনটি ফি, যা সস্তা দামের আড়ালে থাকে
- Retrieval fee: পড়ার সময় প্রতি GB-তে retrieval fee. এর ওপরে cloud-এর বাইরে পাঠালে egress আলাদা।
- Minimum duration: ন্যূনতম জমার সময়-এর আগে মুছলে বা সরালে বাকি দিনের ভাড়াও দিতে হয়।
- Request fee: ধাপ বদলানো প্রতি object-এর একটি অনুরোধ। আকার নয়, সংখ্যাই এখানে দাম ঠিক করে। কিছু class ছোট object-কেও একটি ন্যূনতম আকার ধরে বিল করে, যেমন S3 Standard-IA-তে 128 KB.
হিসাব ১, ন্যূনতম সময়ের ফাঁদ: 1,000 GB cool ধাপে রেখে ১০ দিন পরে মুছলেন। ৩০ দিনের ভাড়া দিতে হবে: 1,000 × $0.010 = $10.00. Hot-এ ১০ দিনের ভাড়া হতো 1,000 × $0.020 × 10/30 = $6.67. অর্থাৎ “সস্তা” ধাপ এখানে বেশি দামি। সমতা আসে d দিনে, যেখানে 1,000 × 0.020 × d/30 = 10, অর্থাৎ d = ১৫ দিন। ডেটা ১৫ দিনের কম থাকলে এই দামে hot-ই সস্তা।
হিসাব ২, কতটা পড়লে লাভ নেই: প্রতি মাসে ডেটার f অংশ পড়লে প্রতি GB-র মাসিক খরচ হয় জমার দাম + f × পড়ার দাম। Hot-এর সাথে সমান ধরলে cool-এ 0.020 = 0.010 + 0.01f, তাই f = ১ (১০০%). Cold-এ 0.020 = 0.004 + 0.03f, তাই f ≈ ০.৫৩৩. Archive-এ 0.020 = 0.001 + 0.06f, তাই f ≈ ০.৩১৭. মাসে ডেটার প্রায় এক-তৃতীয়াংশ পড়লেই archive-এর সুবিধা শেষ। এই হিসাবে অপেক্ষার সময়, request আর egress ধরা হয়নি।
৫ · Lifecycle rule — নিজে নিজে নামানো আর মোছা
লক্ষ লক্ষ object হাতে সরানো সম্ভব নয়। Lifecycle rule হলো bucket-এর ওপর লেখা নিয়ম: এই prefix-এর object এত দিন পরে ওই ধাপে যাবে, এত দিন পরে মুছবে। নিচের JSON একটি সম্পূর্ণ নিয়ম। প্রতিটি অংশের কাজ আলাদা।
{
"Rules": [
{
"ID": "logs-tiering",
"Filter": {
"Prefix": "logs/"
},
"Status": "Enabled",
"Transitions": [
{
"Days": 30,
"StorageClass": "STANDARD_IA"
},
{
"Days": 90,
"StorageClass": "GLACIER"
}
],
"Expiration": {
"Days": 365
},
"NoncurrentVersionExpiration": {
"NoncurrentDays": 30
},
"AbortIncompleteMultipartUpload": {
"DaysAfterInitiation": 7
}
}
]
}# উদাহরণ: চালানোর জন্য নয়
aws s3api put-bucket-lifecycle-configuration --bucket example-bucket \
--lifecycle-configuration file://lifecycle.json| অংশ | যা করে |
|---|---|
Filter.Prefix | নিয়মটি শুধু logs/-এর ওপর। Invoice এতে ছোঁয়া পড়ে না। |
Transitions | ৩০ দিনে Standard-IA, ৯০ দিনে GLACIER (Flexible Retrieval). |
Expiration | ৩৬৫ দিনে current version-এর মেয়াদ শেষ। Versioned bucket-এ এতে শুধু delete marker বসে। |
Noncurrent | Noncurrent হওয়ার ৩০ দিন পরে পুরোনো version সত্যিই মুছবে। এটি ছাড়া জায়গা ফেরে না। |
Abort | ৭ দিন পরেও শেষ না হওয়া upload-এর part ফেলে দেয়। সেই লুকানো বিলের সমাধান। |
Lifecycle তাৎক্ষণিক নয়। নিয়ম সাধারণত দিনে একবারের মতো ঘুরে কাজ করে, তাই কয়েক ঘণ্টা বা দিনের দেরি স্বাভাবিক। মুছে ফেলার নিয়ম প্রথমে একটি ছোট prefix-এ পরীক্ষা করুন, কারণ ভুল prefix মানে চুপচাপ ডেটা হারানো।
১২ মাসের বিল: তিনটি পরিকল্পনা
ধরুন প্রতি মাসে 100 GB log আসে, আর ৭ মাস বয়সে মুছে যায়। দশম মাসে একটি অডিটে পঞ্চম মাসের ব্যাচ থেকে 20 GB পড়তে হলো। তিন পরিকল্পনা তুলনা করি। Log ছোট ফাইলে থাকলে কী হয়, সেটিও দেখুন। সব দাম ধরে নেওয়া, মাস ৩০ দিনের।
// 12 months of logs: 100 GB arrives each month and is deleted at age 7 months.
// ALL prices are ASSUMED: $/GB-month, $/GB read, $/1000 objects moved in.
const T = {
hot: { store: 0.020, read: 0.00, move: 0.00, min: 0 },
cool: { store: 0.010, read: 0.01, move: 0.01, min: 1 },
cold: { store: 0.004, read: 0.03, move: 0.03, min: 3 },
archive: { store: 0.001, read: 0.06, move: 0.05, min: 6 } };
const GB = 100, OBJ_MB = 1, AUDIT = { month: 10, batch: 5, gb: 20 };
const objects = GB * 1000 / OBJ_MB; // objects in one month of logs
function bill(plan) { // plan = [[tier, months], ...]
const c = { store: 0, move: 0, read: 0, early: 0 }, byMonth = [];
const sum = () => c.store + c.move + c.read + c.early;
for (let m = 1; m <= 12; m++) {
const before = sum();
for (let k = 1; k <= m; k++) { // k = month this batch arrived
const age = m - k; let from = 0;
for (const [name, stay] of plan) {
const t = T[name];
if (age === from && from > 0) c.move += objects / 1000 * t.move;
if (age >= from && age < from + stay) {
c.store += GB * t.store;
if (m === AUDIT.month && k === AUDIT.batch) c.read += AUDIT.gb * t.read; }
if (age === from + stay) c.early += GB * t.store * Math.max(0, t.min - stay);
from += stay; } }
byMonth.push((sum() - before).toFixed(1)); }
console.log(` store ${c.store.toFixed(2)}, move ${c.move.toFixed(2)}, read ${c.read.toFixed(2)}, early ${c.early.toFixed(2)} = $${sum().toFixed(2)}`);
console.log(" monthly: " + byMonth.join(" ")); }
console.log(`${objects} objects a month, ${OBJ_MB} MB each`);
for (const [name, plan] of [["A all hot", [["hot", 7]]],
["B hot-cool-cold", [["hot", 1], ["cool", 2], ["cold", 4]]],
["C hot-cool-archive", [["hot", 1], ["cool", 2], ["archive", 4]]]]) {
console.log(name); bill(plan); }আসল আউটপুট:
100000 objects a month, 1 MB each
A all hot
store 126.00, move 0.00, read 0.00, early 0.00 = $126.00
monthly: 2.0 4.0 6.0 8.0 10.0 12.0 14.0 14.0 14.0 14.0 14.0 14.0
B hot-cool-cold
store 57.00, move 38.00, read 0.60, early 0.00 = $95.60
monthly: 2.0 4.0 5.0 8.4 8.8 9.2 9.6 9.6 9.6 10.2 9.6 9.6
C hot-cool-archive
store 48.00, move 56.00, read 1.20, early 1.00 = $106.20
monthly: 2.0 4.0 5.0 10.1 10.2 10.3 10.4 10.6 10.6 11.8 10.6 10.6
A-র store: প্রথম ৭ মাসে ব্যাচ বাড়ে (১ থেকে ৭ ব্যাচ), পরে ৭-এ স্থির। মোট ৬৩ ব্যাচ-মাস × $2 = $126. C-র জমার খরচ সবচেয়ে কম ($48), তবু মোট B-র চেয়ে বেশি। কারণ দুটি। প্রথমত, 1 MB-র ১ লাখ object সরাতে cool-এ যেতে $1 আর archive-এ যেতে $5 লাগে। ৯টি ব্যাচ archive-এ গেছে, তাই move $56. দ্বিতীয়ত, archive-এ ৪ মাস থেকেই মুছে যাওয়ায় বাকি ২ মাসের ভাড়া দিতে হয়েছে: ৫টি ব্যাচ × 100 GB × $0.001 × 2 = $1.00. অডিটের পড়ার ফি তৃতীয় ছোট আঘাত।
এবার কোডে OBJ_MB = 100 করে Run চাপুন। Object হবে মাসে ১,০০০টি, আর ফল উল্টে যাবে: B হবে $57.98, C হবে $50.76. আগে log ছোট ছোট ফাইল জুড়ে বড় ফাইল বানালে সরানোর ফি প্রায় মিলিয়ে যায়। সিদ্ধান্ত তাই শুধু class-এর দামে নয়, object-এর সংখ্যাতেও নির্ভর করে।
৬ · কে ঢুকতে পারে — block public access, policy আর ACL
Object storage-এর সবচেয়ে পরিচিত দুর্ঘটনা হলো ভুলে public হয়ে থাকা bucket. প্রতিরক্ষার প্রথম স্তর একটি সুইচ। Block public access অন্য সব setting-এর ওপরে বসে, আর public করে এমন policy বা ACL-কে আটকে বা উপেক্ষা করে। S3-তে এটি ২০১৮ সালে আসে, আর ২০২৩ সালের এপ্রিল থেকে নতুন bucket-এ এটি ডিফল্টভাবে চালু, ACL-ও ডিফল্টভাবে বন্ধ। Azure-এ storage account-স্তরে public access বন্ধ রাখার setting, আর Google Cloud Storage-এ public access prevention একই কাজ করে। Account বা organization স্তরে চালু রাখলে একটি ভুল bucket setting ডেটা ফাঁস করতে পারে না।
| পথ | কোথায় লেখা | কখন ব্যবহার |
|---|---|---|
| IAM policy | User বা role-এর সাথে | “এই identity কী করতে পারে।” নিজের account-এর সার্ভিসের জন্য প্রথম পছন্দ। |
| Bucket policy | Bucket-এর সাথে | “এই bucket-এ কে কী করতে পারে।” অন্য account, CDN বা TLS বাধ্য করার জন্য। |
| ACL (পুরোনো) | প্রতিটি object বা bucket-এ | উত্তরাধিকার সূত্রে পাওয়া ব্যবস্থা। নতুন কাজে বন্ধই রাখুন। |
একই account-এ IAM বা bucket policy-র যেকোনো একটিতে allow থাকলেই সাধারণত যথেষ্ট, কিন্তু কোথাও স্পষ্ট deny থাকলে সেটিই জেতে। অন্য account থেকে এলে দুই দিকেই allow লাগে। পুরো মূল্যায়নের ক্রম পর্ব ৩২-এ আসবে। নিচের policy-টি TLS ছাড়া সব অনুরোধ নাকচ করে। Deny এখানে নিরাপদ, কারণ এটি কাউকে নতুন অনুমতি দেয় না।
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DenyWithoutTLS",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::example-bucket",
"arn:aws:s3:::example-bucket/*"
],
"Condition": {
"Bool": {
"aws:SecureTransport": "false"
}
}
}
]
}একটি সাধারণ ঘটনা (কাল্পনিক, কোনো প্রতিষ্ঠানের নাম ছাড়া): একজন developer demo-র জন্য একটি bucket public করলেন, ভাবলেন পরে বন্ধ করবেন। মাসখানেক পরে অন্য দল সেই bucket-এই ক্রেতার তথ্যসহ CSV backup রাখল। ইন্টারনেট-জুড়ে খোলা bucket খোঁজার স্বয়ংক্রিয় scanner আগে থেকেই চলে। একজন নিরাপত্তা-গবেষক তাদের জানালে তবেই বিষয়টি ধরা পড়ল। এমন ঘটনা বাস্তবে নানা প্রতিষ্ঠানে বহুবার ঘটেছে।
যা আটকাত: Organization-স্তরে block public access; একেক কাজের জন্য আলাদা bucket; public দরকার হলে CDN বা presigned URL; bucket setting বদলালেই alert; নিয়মিত configuration audit; access log চালু রাখা। ফাঁস হলে আগে public পথ বন্ধ, তারপর log দেখে কী বেরিয়েছে তা নির্ণয়, credential বদল, আর দরকারমতো ক্ষতিগ্রস্তদের জানানো। বিস্তারিত পর্ব ৩৪-এ।
ডিফল্ট encryption-ও মনে রাখুন। S3 ২০২৩ সালের জানুয়ারি থেকে নতুন object নিজে থেকেই encrypt করে, তবে এটি public access ঠেকায় না: অনুমতি থাকলে ডেটা decrypt হয়েই আসে। কার হাতে key থাকবে, সেই আলোচনা পর্ব ৩৩-এ।
৭ · Presigned URL — চাবি না দিয়ে একটি টিকিট
ক্রেতা নিজের invoice ডাউনলোড করবেন। Bucket public করা যাবে না। আবার অ্যাপ server দিয়ে ফাইল টানলে তার memory, network আর সময় আটকে থাকে। সমাধান presigned URL: আপনার server নিজের credential দিয়ে একটি URL সই করে দেয়, যা একটি নির্দিষ্ট কাজ একটি নির্দিষ্ট সময় পর্যন্ত করতে পারে।
লঞ্চের টিকিটের মতো। লঞ্চের মালিক প্রত্যেক যাত্রীকে কেবিনের চাবি দেন না। কাউন্টার থেকে একটি টিকিট দেওয়া হয়: কোন লঞ্চ, কোন তারিখ, কোন কেবিন, সিলমোহরসহ। তারিখ পার হলে টিকিট অচল। কেউ হাতে লিখে কেবিন নম্বর বদলালে সিলমোহর মেলে না। আর টিকিট যাঁর হাতে, তিনিই যেতে পারেন, পরিচয়পত্র দেখা হয় না। শেষ কথাটিই সবচেয়ে জরুরি।
কৌশলটি পর্ব ৬-এর signed request-এর মতোই। URL-এর ভেতরেই স্বাক্ষর আর মেয়াদ থাকে। Storage একই হিসাব আবার করে মিলিয়ে দেখে। নিচের toy model-এ আসল format নেই, কিন্তু HMAC-এর যুক্তিটি আসল। ঘড়ি আর key দুটোই নকল।
# A toy presigned URL. Real formats differ (AWS SigV4, Azure SAS, Google V4).
import hashlib, hmac
from urllib.parse import urlsplit, parse_qs
KEY = b"fake-signing-key-for-learning" # never leaves the app server
NOW = 1_000_000 # simulated clock, in seconds
def sig(method, path, expires):
text = f"{method}\n{path}\n{expires}"
return hmac.new(KEY, text.encode(), hashlib.sha256).hexdigest()
def presign(method, path, ttl, now):
exp = now + ttl
return f"https://storage.example.com{path}?exp={exp}&sig={sig(method, path, exp)}"
def storage_check(method, url, now): # the storage side knows KEY too
u = urlsplit(url)
q = parse_qs(u.query)
exp, given = int(q["exp"][0]), q["sig"][0]
if not hmac.compare_digest(sig(method, u.path, exp), given):
return "403 SignatureDoesNotMatch"
return "200 OK" if now <= exp else "403 Request has expired"
url = presign("GET", "/example-bucket/reports/may.csv", 300, NOW)
print(url.split("?")[0])
print("?" + url.split("?")[1][:34] + "...")
print("in time :", storage_check("GET", url, NOW + 10))
print("too late :", storage_check("GET", url, NOW + 301))
print("other verb:", storage_check("DELETE", url, NOW + 10))
print("other file:", storage_check("GET", url.replace("may", "june"), NOW + 10))
print("longer exp:", storage_check("GET", url.replace("exp=1000300", "exp=1999999"), NOW + 10))আসল আউটপুট:
https://storage.example.com/example-bucket/reports/may.csv
?exp=1000300&sig=f47efa9fda62b93f07...
in time : 200 OK
too late : 403 Request has expired
other verb: 403 SignatureDoesNotMatch
other file: 403 SignatureDoesNotMatch
longer exp: 403 SignatureDoesNotMatch
স্বাক্ষরের ভেতরে method, path আর মেয়াদ তিনটিই ঢুকেছে। তাই GET-এর URL দিয়ে DELETE চলে না, অন্য ফাইলে চলে না। URL-এর exp বাড়িয়ে নিলেও স্বাক্ষর মেলে না, তাই মেয়াদ জাল করা যায় না। লক্ষ করুন, ক্রম আগে স্বাক্ষর, পরে মেয়াদ। Key কখনো URL-এ যায়নি।
# উদাহরণ: চালানোর জন্য নয় (boto3 লাগে, আর আসল credential)
import boto3
s3 = boto3.client("s3")
url = s3.generate_presigned_url(
"put_object",
Params={"Bucket": "example-bucket", "Key": "uploads/u42/9f3a.jpg",
"ContentType": "image/jpeg"},
ExpiresIn=300,
)ডাউনলোডের জন্য CLI-তে আছে aws s3 presign s3://example-bucket/. Azure-এ একই ধারণার নাম SAS, Google-এ signed URL. Browser থেকে সরাসরি upload হলে bucket-এ CORS নিয়মও লাগে, কারণ অন্য domain-এর দিকে browser অনুরোধ পাঠাতে অনুমতি চায়:
{
"CORSRules": [
{
"AllowedOrigins": [
"https://app.example.com"
],
"AllowedMethods": [
"PUT"
],
"AllowedHeaders": [
"Content-Type"
],
"MaxAgeSeconds": 300
}
]
}- Browser
photo.jpg2 MB - App server
signশুধু অনুমতি দেয় - Bucket
PUTস্বাক্ষর যাচাই - Worker
eventফাইল যাচাই
| ঘড়ি | |
| কী ঘটছে | |
| App server-এ আসা ডেটা | |
| Bucket-এ object | |
| URL-এর বাকি মেয়াদ |
- অনুমতি চাওয়া। Login করা ব্যবহারকারীর browser server-কে বলল: photo.jpg, 2 MB, image/jpeg upload করতে চাই। মাত্র 1 KB-র অনুরোধ, ফাইল নিজে এখনো browser-এই।
- নিয়ম যাচাই। Server দেখল ব্যবহারকারী বৈধ, আকার 5 MB-র মধ্যে, ধরন অনুমোদিত। Key নিজে বানাল:
uploads/u42/9f3a.jpg. Browser-কে key বাছতে দিলে সে অন্যের ফাইলের ওপরে লেখার চেষ্টা করতে পারে। - URL সই। Server নিজের temporary credential দিয়ে স্থানীয়ভাবে হিসাব করে URL বানাল, মেয়াদ 300 s. Storage-এর সাথে কোনো কথাই হলো না। সই করার নিজের অধিকারের বেশি কিছু এই URL পায় না।
- CORS preflight. Browser bucket-কে OPTIONS অনুরোধে জিজ্ঞেস করল: এই origin থেকে PUT চলবে? Bucket-এর CORS নিয়ম হ্যাঁ বলল। নিয়ম না থাকলে browser-এর console-এ CORS error আসত।
- ফাইল PUT. 2 MB সোজা bucket-এ গেল। Storage স্বাক্ষর আর মেয়াদ মিলিয়ে 200 দিল। App server-এ 2 MB-র এক বাইটও আসেনি। হাজার ব্যবহারকারী একসাথে upload করলেও server-এর ভার প্রায় বদলায় না।
- Event আর যাচাই। Bucket-এর event একটি queue হয়ে worker-কে জানাল। Worker আসল আকার আর ধরন দেখল, thumbnail বানাল, database-এ “প্রস্তুত” লিখল। Client-এর দাবি বিশ্বাস করা হয়নি। খেয়াল করুন, URL-এ এখনো 296 s বাকি: এই সময়ে এটি দিয়ে আবার লেখা যায়, তাই মেয়াদ ছোট রাখা জরুরি।
Presigned URL একটি bearer token: যাঁর হাতে URL, তিনিই ব্যবহার করতে পারেন। Log, chat, browser history বা Referer header-এ এটি ফাঁস হতে পারে। তাই মেয়াদ মিনিটের হিসাবে রাখুন, শুধু একটি key আর একটি কাজে সই করুন, আর URL log-এ লিখবেন না। Upload-এ আকারের সীমা বসাতে S3-র presigned POST policy-র মতো ব্যবস্থা দেখুন, আর ফাইল যাচাইয়ের আগে তা ব্যবহারকারীদের দেখাবেন না। মেয়াদের সর্বোচ্চ সীমা provider আর credential-ভেদে আলাদা।
৮ · Website, event আর replication
Static website, CDN-এর পেছনে
HTML, CSS, JS আর ছবি বানানোই থাকলে server লাগে না। Bucket থেকেই static website hosting করা যায়। তবে bucket সরাসরি খোলা না রেখে সামনে CDN বসানোই ভালো পথ: HTTPS, নিজের domain, cache আর কম egress একসাথে মেলে। Bucket private থাকে, আর শুধু CDN-কে পড়ার অনুমতি দেওয়া হয়। AWS-এ একে বলে origin access control; অন্য provider-এ নিজস্ব ব্যবস্থা আছে। CDN-এর পুরো গল্প পর্ব ৩০-এ।
# উদাহরণ: চালানোর জন্য নয়
# নামে hash আছে এমন ফাইল বদলায় না, তাই লম্বা cache
aws s3 cp dist/assets/ s3://example-bucket/assets/ --recursive \
--cache-control "public,max-age=31536000,immutable"
# index.html প্রতিবার যাচাই হবে
aws s3 cp dist/index.html s3://example-bucket/index.html \
--cache-control "no-cache"Event notification: ফাইল এলেই কাজ শুরু
Event notification মানে object তৈরি বা মোছা হলে storage নিজেই একটি বার্তা পাঠায়: queue, serverless function বা event bus-এ। Polling করে বারবার LIST করতে হয় না। তিনটি বাস্তব সতর্কতা: বার্তা at-least-once আসে, তাই একই event দুবারও আসতে পারে, ক্রমও উল্টাতে পারে, আর আপনার কোডে idempotency থাকতে হবে। Function যদি ফল একই bucket-এর একই prefix-এ লেখে, নিজেকেই বারবার ডেকে বিল ফুলিয়ে দিতে পারে; তাই uploads/ থেকে পড়ে thumbs/-এ লিখুন, আর event-এ prefix filter দিন। পর্ব ৬৯ আর ৭০-এ এর বিস্তার আছে।
Replication: অন্য region-এ কপি
Cross-region replication প্রতিটি নতুন object অন্য region-এর bucket-এ কপি করে। এটি region-ব্যাপী বিপর্যয়, কম latency আর আইনি কারণে কাজে লাগে। S3-তে দুই পাশেই versioning লাগে, কপি হয় asynchronous ভাবে, আর চালুর আগের object নিজে থেকে যায় না; তার জন্য আলাদা batch কাজ লাগে। অর্থাৎ RPO শূন্য নয়। খরচ দ্বিগুণ জমা আর region-পারাপারের ডেটা ফি। Delete marker কপি হবে কি না সেটিও setting, আর version-ID দিয়ে মোছা সাধারণত কপি হয় না। Google-এর dual-region bucket আর Azure-এর geo-redundant storage একই লক্ষ্যে ভিন্ন পথ। মনে রাখুন, ভুল ডেটা বা ভুল DELETE-ও কপি হয়ে যেতে পারে, তাই replication backup-এর বিকল্প নয়। পর্ব ২৪-এ এই হিসাব আছে।
৯ · Object lock — ransomware-এর বিরুদ্ধে শেষ দেয়াল
কল্পনা করুন, ransomware বা চুরি যাওয়া একটি শক্তিশালী credential দিয়ে কেউ আপনার backup মুছে দিতে বা বিকৃত করতে চায়। Versioning এখানে যথেষ্ট নয়, কারণ যার DeleteObjectVersion-এর অধিকার আছে, সে পুরোনো version-ও মুছতে পারে, lifecycle বদলাতে পারে। দরকার এমন কপি, যা নিজের অধিকারেও মোছা যায় না।
Object lock সেই ব্যবস্থা। একে বলে WORM: একবার লিখুন, বহুবার পড়ুন। জমির দলিল রেজিস্ট্রি অফিসে তোলার মতো: আপনার মালিকানা থাকলেও বালাম বই থেকে পাতা ছেঁড়ার উপায় নেই। S3-তে এর জন্য versioning লাগে, আর নিয়ম এমন:
| ধরন | মানে | কখন |
|---|---|---|
| Governance | বিশেষ অনুমতিওয়ালা identity মেয়াদের আগে সরাতে পারে | পরীক্ষা, সাধারণ সুরক্ষা |
| Compliance | মেয়াদ শেষ হওয়ার আগে কেউ মুছতে বা মেয়াদ কমাতে পারে না, root-ও নয় | নিয়ন্ত্রক শর্ত, আসল immutable backup |
| Legal hold | মেয়াদ ছাড়াই লক, তুলে না নেওয়া পর্যন্ত থাকে | তদন্ত বা মামলা |
# উদাহরণ: চালানোর জন্য নয়। আগে Governance-এ পরীক্ষা করুন।
aws s3api put-object-lock-configuration --bucket example-bucket \
--object-lock-configuration '{"ObjectLockEnabled":"Enabled",
"Rule":{"DefaultRetention":{"Mode":"GOVERNANCE","Days":30}}}'Azure-এ immutable storage আর Google-এ bucket lock বা retention lock একই ধারণা। একটি ভালো প্রতিরক্ষা-নকশা এমন: backup আলাদা account-এ, উৎস account-এর credential সেখানে শুধু লিখতে পারে, মুছতে পারে না; সেখানে object lock চালু; replication-এ কপি অন্য region-এ; আর নিয়মিত restore পরীক্ষা। শেষেরটি বাদ দিলে বাকি সব আশা মাত্র।
লকের নিজের ঝুঁকি: Compliance ধরনে ১০ বছরের লক ভুলে বসালে সেই ১০ বছরের ভাড়া দিতেই হবে, মোছার পথ নেই। তাই ছোট মেয়াদে আর Governance-এ পরীক্ষা করে তবেই Compliance-এ যান। মনে রাখবেন, object lock মুছে ফেলা ঠেকায়, ডেটা চুরি ঠেকায় না। Encryption আর অনুমতি সেই কাজ করে।
আরও গভীরে: S3-র SigV4 সরাসরি secret দিয়ে সই করে না। তারিখ, region আর service দিয়ে ধাপে ধাপে HMAC চালিয়ে একটি স্বল্পমেয়াদি signing key বানায়, ফলে একটি স্বাক্ষরের ক্ষমতা ছোট গণ্ডিতে আটকে থাকে। Prefix-এর পুরোনো “key-র শুরুতে random hash বসান” পরামর্শও এখন সাধারণত দরকার নেই: ২০১৮ সালে AWS জানায়, S3 প্রতি prefix-এ প্রতি সেকেন্ডে কয়েক হাজার অনুরোধ সামলায় আর ভার বুঝে নিজে ভাগ হয়। S3 ২০২৪ সালে conditional write-ও এনেছে (If-None-Match), যা দিয়ে “key না থাকলেই লেখা হবে” ধরনের কাজ নিরাপদে করা যায়। ভেতরের durability আর erasure coding দেখতে System Design · Object storage পড়ুন।
পরীক্ষা ও ইন্টারভিউতে:
- Versioned bucket-এ DELETE করলে কী হয়? Version ID ছাড়া হলে delete marker বসে, ডেটা থাকে। Version ID দিলে সেই version স্থায়ীভাবে মোছে।
- Presigned URL কি কোনো ব্যবহারকারীর সাথে বাঁধা? না। URL যাঁর হাতে তিনিই নির্দিষ্ট কাজটি করতে পারেন, মেয়াদ শেষ হওয়া পর্যন্ত।
- Lifecycle রেখেও বিল কমছে না কেন? Noncurrent version বা অসমাপ্ত multipart থেকে যাচ্ছে, অথবা ছোট object-এ সরানোর ফি বেশি।
- Replication কি backup? না। ভুল বদলও কপি হতে পারে। Backup-এর জন্য version, লক আর আলাদা account দরকার।
- Multipart কেন? ব্যর্থ part-ই শুধু আবার পাঠানো, একসাথে পাঠিয়ে গতি বাড়ানো, আর সীমার চেয়ে বড় ফাইল পাঠানো।
১০ · AI-এর যুগে object storage
“S3-তে ছবি দেখাতে পারছি না” বলে AI-কে জিজ্ঞেস করলে সে প্রায়ই সবচেয়ে দ্রুত সমাধান দেয়, আর সেটিই সবচেয়ে বিপজ্জনক: bucket public করা। AI-এর লেখা কনফিগারেশন চলতে পারে, তবু নিরাপদ বা সস্তা না-ও হতে পারে।
| AI-এর ভুল | কেন বিপদ | কী করবেন |
|---|---|---|
Block public access বন্ধ, "Principal": "*" | পুরো bucket ইন্টারনেটে খোলা | CDN বা presigned URL ব্যবহার করুন |
"Action": "s3:*" অ্যাপের role-এ | একটি bug-এ সব মুছতে পারে | নির্দিষ্ট prefix আর কাজ দিন (least privilege) |
| Access key কোডে বসানো | Git-এ ফাঁস হয় | Role আর temporary credential |
| ৭ দিনের presigned URL | ফাঁস হলে লম্বা সময় খোলা | মিনিটের হিসাবে মেয়াদ |
| সব কিছু archive-এ নেওয়ার নিয়ম | ছোট object-এ সরানো আর পড়ার খরচ | Object-এর সংখ্যা ধরে হিসাব করুন |
aws s3 rm --recursive, sync --delete সতর্কতা ছাড়া | এক কমান্ডে ডেটা শেষ | আগে --dryrun, পরে আসল কমান্ড |
| অস্তিত্বহীন flag বা lifecycle field | নিয়ম চুপচাপ কাজ না-ও করতে পারে | Official docs মিলিয়ে দেখুন |
AI-কে কাজ দেওয়ার সময় সীমা আগেই বলে দিন, আর উত্তরে ঝুঁকি আলাদা করে চান:
AI-এর দেওয়া storage কনফিগারেশন — যাচাইয়ের চেকলিস্ট
ভাবনার প্রশ্ন
প্রতিটি প্রশ্ন নিয়ে নিজে কিছুক্ষণ ভাবুন — তারপর “→ উত্তর” চাপুন। ইতিহাস আর বাস্তব ভুল থেকেই সবচেয়ে ভালো নকশা শেখা যায়।
প্র ০১S3 চৌদ্দ বছর ধরে eventual consistency-তে চলল কেন, আর ২০২০ সালের পরিবর্তন আসলে কী সমস্যা মেটাল?
২০০৬ সালে S3-র নকশায় লক্ষ্য ছিল প্রায় সীমাহীন আকার আর উচ্চ availability. এ জন্য অনেক কপির মধ্যে বদল ছড়াতে একটু সময় লাগত। নতুন object সাধারণত সাথে সাথে পড়া গেলেও overwrite, delete আর LIST-এ কিছুক্ষণ পুরোনো ফল আসতে পারত। ছবি দেখানোর অ্যাপে এটি প্রায় অদৃশ্য।
সমস্যা বাধল যখন মানুষ S3-কে data lake বানালেন। Hadoop বা Spark একটি job-এ ফাইল লেখে, পরের ধাপ LIST করে সেগুলো পড়ে। LIST কয়েকটি ফাইল বাদ দিলে কোনো error ছাড়াই ভুল হিসাব বেরোত। এই চুপচাপ ভুল ঠেকাতে Hadoop সম্প্রদায় S3Guard বানায়, Netflix প্রকাশ করে s3mper, আর AWS-এর EMRFS-এ আসে “consistent view”. এদের প্রায় সবার মূল কৌশল ছিল একটি আলাদা consistent metadata store রেখে S3-র তালিকার সাথে মিলিয়ে দেখা। অর্থাৎ ব্যবহারকারীরা নিজেরাই একটি ব্যবস্থার দুর্বলতা ঢাকতে দ্বিতীয় একটি ব্যবস্থা চালাচ্ছিলেন, আর তার খরচ ও রক্ষণাবেক্ষণের ভারও বইছিলেন। দ্বিতীয় ব্যবস্থাটি মূল ব্যবস্থার সাথে অমিল হলে আবার নতুন ধরনের ভুল তৈরি হতো।
২০২০ সালের ডিসেম্বরে AWS জানায়, S3 এখন স্বয়ংক্রিয়ভাবে শক্তিশালী read-after-write দেয়, বাড়তি দাম বা performance-এর ক্ষতি ছাড়া। ফলে এসব বাড়তি স্তরের বেশিরভাগ দরকার ফুরায়। কৌশলটির একটি অংশ Amazon-এর CTO Werner Vogels ২০২১ সালের এপ্রিলে নিজের ব্লগে “Diving Deep on S3 Consistency” লেখায় বলেন: metadata cache-এর পাশে একটি “witness” (সাক্ষী) অংশ যোগ করা হয়, যা জানায় cache-এর তথ্য পুরোনো কি না, আর নকশা যাচাই করা হয় formal method দিয়ে। তবু সব ঝামেলা যায়নি: CDN, cache আর cross-region কপি নিজের নিজের সময়ে চলে, আর একই key-তে একসাথে দুজন লিখলে একজনের লেখা হারায়।
মূল উপলব্ধি: Consistency একটি ব্যবস্থার গুণ নয়, পুরো পথের গুণ। পথের একটি অংশ পুরোনো ডেটা দিলে ব্যবহারকারী পুরোনো ডেটাই পান। আর একটি প্ল্যাটফর্মের দুর্বলতা ঢাকতে যে বাড়তি জটিলতা বানানো হয়, প্ল্যাটফর্ম ঠিক হলে সেটি সরাতেও ভুলবেন না।
প্র ০২ফেব্রুয়ারি ২০১৭-র S3 outage থেকে একটি অ্যাপের দল কী শিখতে পারে, যদিও তাদের নিজের কোনো ভুল ছিল না?
২০১৭ সালের ২৮ ফেব্রুয়ারি S3-র একটি বড় region (US-EAST-1)-এ কয়েক ঘণ্টা সমস্যা চলে। AWS-এর প্রকাশিত ব্যাখ্যা অনুযায়ী, একজন প্রকৌশলী একটি নির্ধারিত কমান্ডে ভুল ইনপুট দেন, ফলে দরকারের চেয়ে বেশি server সরে যায়। সেই server-গুলো গুরুত্বপূর্ণ দুটি subsystem-কে সহায়তা করত, আর সেগুলো পুরো restart করতে হয়। বহু বছর এমন পূর্ণ restart না হওয়ায় সময় অনুমানের চেয়ে বেশি লাগে। সেই সময়ে AWS-এর status dashboard-ও S3-র ওপর নির্ভরশীল থাকায় ঠিক অবস্থা দেখাতে সমস্যা হয়।
অ্যাপ দলের জন্য শিক্ষাগুলো সরাসরি। প্রথমত, অনেক ওয়েবসাইট শুধু ছবি বা JS bundle-এর জন্য একটি bucket-এর ওপর নির্ভর করত, আর সেই একটি নির্ভরতা পুরো পাতা ভেঙে দিল। তাই নিজের page-এর কোন অংশ bucket ছাড়া চলতে পারবে, সেটি আগে ভাবুন: ছবি না এলে placeholder, CDN-এ জমা কপি, মূল কেনাকাটার পথ আলাদা।
দ্বিতীয়ত, durability আর availability এক জিনিস নয়। সেদিন ডেটা হারানোর খবর নয়, ডেটা পাওয়া যায়নি। Replication-এ অন্য region-এ কপি থাকলেও অ্যাপ নিজে থেকে সেখানে যাবে না, যদি না সেই পথ আগে বানিয়ে পরীক্ষা করা থাকে। তৃতীয়ত, নিজের monitoring যেন নজরদারি করা ব্যবস্থার ওপরই নির্ভর না করে। AWS নিজেও এই শিক্ষা জানায়, আর কমান্ডে নিরাপত্তা-সীমা যোগ করে।
মূল উপলব্ধি: Managed সেবা ব্যর্থতা দূর করে না, ব্যর্থতার ধরন বদলায়। আপনার দায়িত্ব জানা কোন নির্ভরতা পড়ে গেলে কী হবে, আর সেই পরিকল্পনা শান্ত সময়ে পরীক্ষা করে রাখা। Blast radius ছোট রাখার প্রশ্নটি তাই নিজের নকশাতেও তুলতে হবে।
প্র ০৩Public bucket-এর দুর্ঘটনাকে কি শুধু “মানুষের ভুল” বলা ঠিক? ডিফল্ট setting-এর দায় কতটা?
“মানুষের ভুল” বললে তদন্ত সহজে শেষ হয়, কিন্তু সমস্যা শেষ হয় না। পুরোনো দিনে S3-তে public করার পথ ছিল একাধিক: bucket ACL, object ACL, bucket policy. একটি bucket private দেখালেও একটি object আলাদা ACL-এ public থাকতে পারত। “Any authenticated user” ধরনের নামের অর্থ অনেকে ভুল বুঝতেন, ভাবতেন নিজের account-এর লোক, অথচ এর মানে হতে পারত যেকোনো account-ধারী। জটিল অনুমতি-ব্যবস্থায় ভালো ও দক্ষ মানুষও ভুল করেন, বিশেষত তাড়ার সময়ে, আর ভুলটি কোনো error দেখায় না, কারণ সবকিছু দিব্যি চলতে থাকে।
বছরের পর বছর নানা প্রতিষ্ঠানের ডেটা ফাঁসের খবরের পর ২০১৮ সালে AWS আনে Block Public Access: সব পথের ওপরে একটি সুইচ। কিন্তু ঐচ্ছিক সুইচ সবাই চালু করে না। শেষে ২০২৩ সালের এপ্রিলে নতুন bucket-এর ডিফল্টই বদলে যায়: public access আটকানো, ACL বন্ধ। Azure আর Google-ও একই দিকে এগিয়েছে। শুধু একটি ডিফল্ট বদলেই যে ভুলটি হওয়া কঠিন হলো, হাজারো সতর্কবার্তা তা পারেনি।
এখান থেকে দুটি ব্যবহারিক সিদ্ধান্ত আসে। প্রথমত, নিজের প্রতিষ্ঠানে ব্যক্তির সতর্কতার ওপর ভরসা না করে organization-স্তরের guardrail বসান, যাতে ভুল কাজটি করাই না যায়। দ্বিতীয়ত, Terraform বা CI-তে policy পরীক্ষা জুড়ুন, যাতে public করার পরিবর্তন review-তেই আটকায়। পুরোনো bucket-গুলো নতুন ডিফল্ট আপনাআপনি পায় না, তাই আলাদা করে audit দরকার। যে bucket সত্যিই public থাকার কথা, সেটিকেও কারণসহ লিখে রাখুন, যাতে তালিকায় অস্বাভাবিকটি চোখে পড়ে।
মূল উপলব্ধি: নিরাপত্তা ব্যক্তির মনোযোগের ওপর দাঁড়ালে একদিন ভাঙবেই। ভালো ব্যবস্থা ভুল পথকে কঠিন আর নিরাপদ পথকে সহজ করে। পরের বার কোনো ঘটনায় “কে ভুল করল” না জিজ্ঞেস করে জিজ্ঞেস করুন, “ব্যবস্থা এই ভুল কেন হতে দিল।”
প্র ০৪Versioning, replication আর snapshot থাকলে আলাদা backup-এর কি আদৌ দরকার আছে?
প্রশ্নটি ভালো, কারণ তিনটিই “কপি” বানায়। কিন্তু প্রতিটি আলাদা বিপদ সামলায়। Versioning ভুল overwrite বা ভুল delete ঠিক করে, তবে কপিগুলো একই bucket, একই account আর একই region-এ থাকে। Replication region-এর বিপর্যয় সামলায়, তবে এটি প্রায় তাৎক্ষণিকভাবে বিকৃত ডেটাও কপি করে। আর একই admin credential সব জায়গায় চললে এক চোরই সব নষ্ট করতে পারে। Snapshot-ও সাধারণত একই account-এ থাকে, তাই account-এর নিয়ন্ত্রণ হারালে সেটিও সাথে যায়। অর্থাৎ তিনটিই কাজের, কিন্তু কোনোটিই একা পুরো ছবি নয়।
২০১৭ সালের GitLab-এর database ঘটনাটি মনে করুন, যার বিবরণ তারা নিজেরাই খোলাখুলি প্রকাশ করে। ভুল কমান্ডে production ডেটা মোছে, আর তখন দেখা যায় একাধিক backup পদ্ধতি হয় কাজ করছিল না, নয় ঠিকভাবে পরীক্ষা হয়নি। শেষে একটি কাকতালীয় কপি থেকে উদ্ধার হয়, কয়েক ঘণ্টার ডেটা হারিয়ে। শিক্ষা: backup আছে ভাবা আর restore পারা এক কথা নয়।
পুরোনো 3-2-1 নিয়মটি এখনো কাজের: তিনটি কপি, দুই ধরনের মাধ্যমে, একটি বাইরে। Cloud-এর ভাষায় এর সাথে যোগ হয় ভিন্ন account, ভিন্ন region, immutable লক আর নিয়মিত restore পরীক্ষা। ব্যবসার দিক থেকে হিসাব হয় RPO আর RTO দিয়ে: কতটা ডেটা হারানো চলে, কত দ্রুত ফিরতে হবে। Archive ধাপে backup রাখলে RTO-তে ঘণ্টার অপেক্ষা যোগ হয়, সেটিও হিসাবে আনুন।
মূল উপলব্ধি: প্রতিটি কপি নিয়ে জিজ্ঞেস করুন, “কোন বিপদে এটি কাজে লাগবে না?” ভুল delete, region বিপর্যয়, চুরি যাওয়া credential, বিকৃত ডেটা: এই চারটির প্রতিটির জন্য অন্তত একটি উত্তর থাকলে, আর সেই উত্তর পরীক্ষিত হলে, তবেই backup আছে বলা যায়।
প্র ০৫S3 API কি কার্যত একটি মান হয়ে গেছে? এটি vendor lock-in কমায়, না নতুন রূপে বাড়ায়?
S3 API কোনো আনুষ্ঠানিক মান-সংস্থার তৈরি নয়, একটি কোম্পানির নিজস্ব interface. তবু আগে আসা, সহজ HTTP নকশা আর বিপুল SDK ও টুলের কারণে এটি কার্যত সাধারণ ভাষা হয়ে গেছে। Backup সফটওয়্যার, database, Hadoop-পরবর্তী data টুল প্রায় সবাই S3-এর সাথে কথা বলতে পারে। তাই নতুন storage পণ্য নিজে আলাদা API না এনে S3-র ভাষা বলে, নইলে কেউ ব্যবহার করত না। Open-source দিকে MinIO ও Ceph, আর বাণিজ্যিক দিকে R2 বা B2 এই পথেই এসেছে।
এতে vendor lock-in আংশিক কমে: কোড প্রায় অপরিবর্তিত রেখে endpoint বদলানো যায়। কিন্তু lock-in শুধু API-তে থাকে না। IAM policy, event, lifecycle, লক, CDN-এর সংযোগ, আর সবচেয়ে বড় কথা ডেটার ওজন। পেটাবাইট ডেটা সরাতে সময় আর egress ফি দুটোই লাগে। এই ফি নিয়ে বিতর্কের কারণে কিছু সেবা কম বা শূন্য egress-এর প্রস্তাব দিয়ে বাজারে এসেছে, আর নিয়ন্ত্রকদের চাপের প্রেক্ষাপটে ২০২৪ সালের দিকে বড় provider-রা cloud ছেড়ে যাওয়ার সময় ডেটা বের করায় ছাড়ের ঘোষণা দেন। শর্ত বদলায় আর আবেদনের নিয়মও থাকে, তাই নিজের ক্ষেত্রে যাচাই করবেন।
আবার একটি কোম্পানির API “মান” হলে সেই কোম্পানির সিদ্ধান্ত অন্যদের অনুসরণ করতে হয়। নতুন feature এলে compatible পণ্যগুলো পিছিয়ে থাকতে পারে, আচরণেও সূক্ষ্ম পার্থক্য থাকে। পরীক্ষা ছাড়া migration করলে ঠিক সেখানেই আটকাবেন, যেখানে সবচেয়ে কম আশা করেন।
মূল উপলব্ধি: Lock-in শূন্য করা নয়, দামটি জেনে নেওয়াই লক্ষ্য। নিজের কোডে storage-এর ওপর একটি পাতলা স্তর রাখুন, বিশেষ feature ব্যবহারের সময় লিখে রাখুন কেন, আর হিসাব করে রাখুন ছেড়ে যেতে কত সময় ও টাকা লাগবে।
অনুশীলন
কোনো cloud account ছাড়াই সব করা যাবে। সব দাম ধরে নেওয়া, মাস ৩০ দিনের।
-
বিল হিসাব: 500 GB ডেটা cold ধাপে রাখলেন (জমা $0.004 প্রতি GB-মাস, পড়া $0.03 প্রতি GB, ন্যূনতম ৯০ দিন)। ৩০ দিন পরে 100 GB পড়লেন, আর তারপরই সব মুছে দিলেন। মোট খরচ কত? Hot-এ (জমা $0.020, পড়ার ফি নেই) ওই ৩০ দিনের খরচ কত হতো?
Cold-এ ৯০ দিন মানে ৩ মাসের ভাড়া: 500 × 0.004 × 3 = $6.00. এর মধ্যে ব্যবহৃত ১ মাসের ভাড়া $2.00, আর আগে মোছার জন্য বাকি ২ মাসের ভাড়া $4.00. এরপর পড়া: 100 × 0.03 = $3.00. মোট $9.00. Hot-এ: 500 × 0.020 × 1 = $10.00. Cold মাত্র $1 সস্তা। আরও একটু বেশি পড়লে বা আরও আগে মুছলে ফল উল্টে যেত। 100 GB-র বদলে 134 GB পড়লেই cold-এর খরচ $10.02, অর্থাৎ hot-এর চেয়ে বেশি।
-
Multipart হিসাব: ধরুন সীমা হলো part সর্বনিম্ন 5 MiB, সর্বোচ্চ ১০,০০০ part. (ক) 30 GiB ফাইল 8 MiB part-এ পাঠালে কয়টি part? (খ) 2 TiB ফাইলের জন্য part-এর আকার অন্তত কত হতে হবে?
(ক) 30 GiB = 30 × 1024 = 30,720 MiB. 30,720 ÷ 8 = 3,840টি part. (খ) 2 TiB = 2 × 1024 × 1024 = 2,097,152 MiB. 2,097,152 ÷ 10,000 = 209.72, তাই ওপরের দিকে নিয়ে অন্তত 210 MiB. Part বড় হলে একটি ব্যর্থতায় বেশি ডেটা আবার পাঠাতে হয়, আর ছোট হলে অনুরোধের সংখ্যা বাড়ে। এই ভারসাম্যই part-এর আকার ঠিক করে।
-
অবস্থা অনুমান করুন: একটি versioned bucket-এ
a.txt-এর ওপর পরপর এই কাজগুলো হলো: PUT 5 MB (v1), PUT 7 MB (v2), version ID ছাড়া DELETE (DM3), PUT 9 MB (v4), তারপর--version-id v2দিয়ে DELETE. এখন GET কী দেবে? সাধারণ LIST-এa.txtদেখা যাবে? Version তালিকায় কী আছে, আর কত MB-র বিল?Version তালিকা, নতুন আগে:
v4(current),DM3,v1. GET দেবেv4, 200. LIST-এa.txtদেখা যাবে, কারণ সবার ওপরে এখন আসল version, marker নয়। বিল 5 + 9 = 14 MB.v2সত্যিই মুছেছে। মাঝের marker নিজে থেকে যায়নি, তা তালিকায় রয়ে গেছে, এবং এর কোনো ক্ষতি নেই। -
নকশার সমালোচনা: একটি কাল্পনিক অ্যাপ জাতীয় পরিচয়পত্রের ছবি নেয়। নকশা: এক bucket-এ সব, public-read, key
nid/01712345678.jpg, versioning বন্ধ, মোবাইল অ্যাপে access key বসানো, আর ৩০ দিন পরে সব কিছু archive-এ। কী কী ভুল, আর আপনি কী বদলাবেন?- Public-read: সবচেয়ে বড় ভুল। Bucket private করুন, block public access চালু রাখুন, আর দেখার জন্য ছোট মেয়াদের presigned URL দিন।
- Key-তে ফোন নম্বর: ব্যক্তিগত তথ্য log আর URL-এ যায়, আর key অনুমান করা যায়। Random ID ব্যবহার করুন।
- অ্যাপে access key: অ্যাপ খুলেই বের করা যায়। Server থেকে presigned upload URL দিন, key অ্যাপে রাখবেন না।
- এক bucket-এ সব: সংবেদনশীল ডেটা আলাদা bucket-এ রাখুন, আলাদা policy আর সম্ভব হলে আলাদা encryption key-সহ।
- Versioning বন্ধ: ভুল overwrite ফেরানো যায় না। চালু করুন, আর পুরোনো version মোছার সময়সীমা দিন।
- সব archive-এ: যাচাই বা অভিযোগের সময় ঘণ্টা ধরে অপেক্ষা করতে হতে পারে। আর ডেটা কত দিন রাখা বৈধ, তার নীতি ঠিক করে মেয়াদ শেষে মুছুন।
নিজেকে যাচাই করুন
ভুল হলে কারণসহ ব্যাখ্যা পাবেন, আবার চেষ্টাও করতে পারবেন।
ক্রমPresigned URL দিয়ে browser থেকে সরাসরি upload-এর ধাপগুলো সাজান (▲▼ চেপে সরান)
- Browser অ্যাপ server-এর কাছে upload-এর অনুমতি চায়
- Server ব্যবহারকারী, আকার আর ধরন যাচাই করে key ঠিক করে
- Server স্থানীয়ভাবে সই করে স্বল্প মেয়াদের URL ফেরত দেয়
- Browser সেই URL-এ ফাইল সরাসরি storage-এ PUT করে
- Event পেয়ে worker ফাইল যাচাই করে “প্রস্তুত” লেখে
একটি bucket-এ key আছে logs/2026/04/a.log আর logs/2026/05/b.log. --prefix logs/2026/ --delimiter / দিয়ে তালিকা চাইলে কী আসবে?
- দুটি পুরো key
- দুটি common prefix, 04/ আর 05/ দিয়ে শেষ
- খালি তালিকা, কারণ folder বলে কিছু নেই
- Error, কারণ key-তে / থাকতে পারে না
S3-র versioning চালু আছে এমন bucket-এ version ID ছাড়া DELETE করলে কী হয়?
- সব version স্থায়ীভাবে মুছে যায়
- শুধু current version মুছে যায়, আগেরটি current হয়
- একটি delete marker current হয়, পুরোনো version থেকে যায়
- অনুরোধ ব্যর্থ হয়, আগে versioning বন্ধ করতে হয়
ধরা যাক cool ধাপের দাম $0.01 প্রতি GB-মাস, ন্যূনতম জমার সময় ৩০ দিন, মাস ৩০ দিনের। 200 GB রেখে ৬ দিন পরে মুছলে মোট জমার খরচ কত?
- $0.40
- $1.60
- $0.00
- $2.00
একটি GET presigned URL ৫ মিনিটের জন্য বানানো হয়েছে। URL-টি কেউ chat-এ অন্য একজনকে পাঠাল। কী হবে?
- মেয়াদের মধ্যে যাঁর হাতে URL, তিনি সেই object পড়তে পারবেন
- শুধু প্রথম ব্যবহারকারীর browser-এ কাজ করবে
- URL দিয়ে bucket-এর সব object পড়া আর মোছা যাবে
- একবার খোলার পরেই URL বাতিল হবে
চুরি যাওয়া admin credential দিয়ে backup নষ্ট হওয়া ঠেকাতে কোনটি সবচেয়ে কার্যকর?
- শুধু versioning চালু রাখা
- আলাদা account-এ compliance ধরনের object lock দেওয়া কপি
- একই account-এ অন্য region-এ replication
- ডিফল্ট server-side encryption চালু করা
মাসের পর মাস bucket-এর বিল বাড়ছে, অথচ সাধারণ তালিকায় object-এর মোট আকার স্থির। বড় ফাইল upload প্রায়ই মাঝপথে crash করে। সম্ভাব্য কারণ আর সমাধান কী?
- Block public access-এর ফি; সেটি বন্ধ করা
- Region-এর দাম বেড়েছে; bucket অন্য region-এ নেওয়া
- অসমাপ্ত multipart-এর part জমছে; lifecycle-এ abort নিয়ম দেওয়া
- ETag অনেক জায়গা নিচ্ছে; ETag বন্ধ করা
শব্দকোষ
লেখার মধ্যে ডটেড দাগ দেওয়া শব্দে মাউস রাখুন বা চাপুন — অর্থ দেখাবে। এই পর্বের সব নতুন শব্দ এখানে একসাথে:
মনে রাখুন
- Key একটি লম্বা নাম, folder নয়। Prefix দিয়ে তালিকা আনুন, আর bucket-এর region শুরুতেই ভেবে বাছুন।
- Versioned bucket-এ DELETE মানে marker; পুরোনো version-এর ভাড়া চলে। সাথে noncurrent মোছার নিয়ম রাখুন।
- ঠান্ডা ধাপের হিসাবে চারটি জিনিস: জমা, পড়া, ন্যূনতম সময় আর object-এর সংখ্যা। ছোট ফাইল আগে জুড়ে নিন।
- Bucket private রাখুন: Block public access চালু, ACL বন্ধ, ভাগ করতে ছোট মেয়াদের presigned URL আর CDN.
- ভুল আর আক্রমণ আলাদা: Versioning ভুল সামলায়, object lock আর আলাদা account আক্রমণ সামলায়, আর restore পরীক্ষাই সব কিছুর প্রমাণ।
আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ
- পর্ব ২২ · Managed database — replica, failover, backup আর connectionপরবর্তী পর্বDatabase চালানোর দায়িত্বের কতটা provider নেন, আর কতটা আপনার।
- ক্লাউড কম্পিউটিং ও DevOps · কোর্স হোম৮১টি পর্বপুরো কোর্সের রোডম্যাপ।
- System Design · Object storageগভীরে যানErasure coding, durability আর ভেতরের নকশা।
- System Design · CDN আর edgeগভীরে যানBucket-এর সামনে CDN বসানোর পেছনের তত্ত্ব।
- System Design · Disaster recoveryপাশের ট্র্যাকRPO, RTO আর backup-এর পরিকল্পনা।
- পর্ব ০৬ · Cloud ব্যবহারের পথপেছনে ফিরে দেখুনSigned request আর খরচের নিরাপত্তা।