S3: أساسيات التخزين الكائني
وش هو التخزين الكائني وكيف يختلف عن الأقراص، والحاويات والكائنات، ومين يقدر يوصل لها، والإصدارات والنسخ بين المناطق، واستضافة موقع ثابت، مع تجربة عملية تشوف فيها الإصدارات تنقذ ملف محذوف.
- الفكرة الأساسية
- تعريف
- متى يُستخدم
- تنبيه
في هذا المقال
في الجزء الخامس شفنا تخزين مربوط بالسيرفرات. بس الصور والفيديوهات والنسخ الاحتياطية والسجلات ما تحتاج سيرفر أصلاً، تحتاج مكان يحفظها بأمان ويوصلها وقت الطلب، مهما كبر حجمها. هذا S3.
وS3 (Simple Storage Service) من أقدم خدمات AWS وأكثرها استخداماً. ما فيها مساحة تحجزها، وتدفع على اللي تخزنه. وAWS تصممها لمتانة 99.999999999%، يعني احتمال ضياع ملف عندك شبه معدوم.
وتشوفها في كل مكان: نسخ احتياطية، وملفات المستخدمين، ومواقع ثابتة، وسجلات، وبحيرات بيانات للتحليل.
التخزين الكائني مقابل الأقراص
| كتلي (EBS) | ملفات (EFS) | كائني (S3) | |
|---|---|---|---|
| يشبه | قرص | مجلد مشترك | مفتاح وملف عبر API |
| يوصل له | سيرفر واحد عادةً | عدة سيرفرات | أي أحد مسموح له عبر HTTP |
| تعديل ملف | جزء منه | جزء منه | تستبدل الكائن كامل |
| الحجم | تحجزه | يكبر لحاله | بلا حد عملي |
والنقطة اللي تفرق في التصميم: S3 مو قرص تركّبه وتشغّل منه قاعدة بيانات، بس هو مثالي لأي ملف تقراه أو تكتبه كامل.
الحاويات والكائنات
الحاوية (Bucket):
- تعيش في Region واحدة تختارها، مع إن S3 تظهر كخدمة عامة في الكونسول.
- اسمها لازم يكون فريد على مستوى كل حسابات AWS، بحروف صغيرة وأرقام وشرطات.
الكائن (Object):
- حجمه لين 50 TB.
- المفتاح هو مساره الكامل، مثل
photos/2026/trip.jpg. - ما فيه مجلدات حقيقية.
photos/2026/جزء من الاسم، والكونسول يعرضه كمجلد فقط.
مين يقدر يوصل؟
كل شي في S3 خاص افتراضياً. ولما يطلب أحد كائن، تجمع AWS كل القواعد: يوصل لو فيه قاعدة تسمح له وما فيه قاعدة تمنعه.
| الأداة | ترتبط بـ | تستخدمها لـ |
|---|---|---|
| سياسة IAM | المستخدم أو الدور | صلاحيات موظفيك وخدماتك |
| Bucket Policy | الحاوية | الوصول العام، وحسابات ثانية، وفرض قواعد |
| Block Public Access | الحاوية أو الحساب | قفل أمان يمنع الوصول العام مهما كانت السياسات |
مثال: سيرفر EC2 يقرأ من S3؟ أعطه دور IAM. وحساب ثاني يقرأ؟ Bucket Policy تسمح له. وهذي سياسة تخلي حاوية كاملة عامة للقراءة، وهذا اللي يحتاجه موقع ثابت:
{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::my-site-bucket/*"
}]
}
الإصدارات (Versioning)
لما تفعّلها، أي استبدال لكائن ينشئ إصدار جديد بدل ما يمسح القديم:
- الكتابة فوق ملف: الإصدار القديم يبقى، وتقدر ترجع له.
- الحذف: يضيف علامة حذف (Delete Marker)، والبيانات تبقى. احذف العلامة ويرجع الملف.
- الإيقاف: ما يمسح الإصدارات الموجودة.
وكل إصدار تدفع عليه، فاربطها بـقواعد دورة الحياة عشان تنظف القديم.
النسخ بين الحاويات (Replication)
S3 تنسخ الكائنات الجديدة تلقائياً لحاوية ثانية، حتى في حساب ثاني. ولازم الإصدارات تكون مفعّلة في الجهتين.
| النوع | يناسب |
|---|---|
| بين Regions (CRR) | التوافق مع الأنظمة، والقرب من المستخدمين، والتعافي من الكوارث |
| داخل Region (SRR) | جمع السجلات في مكان واحد، أو نسخ الإنتاج لبيئة تجربة |
وانتبه: الكائنات القديمة ما تنتقل إلا بـ Batch Replication، والنسخ ما ينتقل عبر سلسلة حاويات، والحذف النهائي لإصدار ما ينسخ، عشان تبقى محمي من الحذف الخبيث.
استضافة موقع ثابت
S3 تقدر تقدم موقع HTML كامل: تفعّل Static website hosting، وتحدد index.html، وتخلي الكائنات عامة بسياسة زي اللي فوق.
بس رابط الموقع هذا يشتغل بـ HTTP فقط. والأفضل في الإنتاج: حاوية خاصة قدامها CloudFront مع OAC، فتحصل HTTPS وسرعة أعلى بدون ما تفتح الحاوية.
التفاعل مع الأحداث
S3 تقدر ترسل إشعار لما يصير شي، مثل رفع صورة. وترسله لـ SQS أو SNS أو Lambda مباشرة، أو لـ EventBridge لو تبي فلترة متقدمة ووجهات أكثر. والمثال المشهور: كل صورة ترتفع، دالة Lambda تسوي لها نسخة مصغرة. وبنطبق هذا في الجزء الثاني والعشرين.
الأداء
S3 تتحمل على الأقل 3,500 كتابة و5,500 قراءة في الثانية لكل بادئة (Prefix)، فتوزيع المفاتيح على عدة بادئات يكبر السعة. وعندك أدوات للملفات الكبيرة والمسافات البعيدة:
| الأداة | وش تسوي |
|---|---|
| Multipart Upload | ترفع الملف أجزاء بالتوازي، ولو فشل جزء تعيده فقط. مفضل فوق 100 MB، ولازم فوق 5 GB |
| Transfer Acceleration | الرفع يمر بأقرب موقع حافة ثم شبكة AWS، للمسافات البعيدة |
| Byte-Range Fetches | تحمّل جزء محدد من الملف، فتسرّع التحميل بالتوازي أو تجيب اللي تحتاجه فقط |
عملي: الإصدارات تنقذ ملف محذوف
من CloudShell، أنشئ حاوية باسم فريد وارفع صفحة:
BUCKET=series-files-$RANDOM$RANDOM
aws s3 mb s3://$BUCKET
echo "<h1>Version 1</h1>" > index.html
aws s3 cp index.html s3://$BUCKET/
aws s3 ls s3://$BUCKET/
جرّب توصل للملف من الإنترنت. بيرجع 403، لأن كل شي خاص:
curl -s -o /dev/null -w "%{http_code}\n" \
https://$BUCKET.s3.$AWS_REGION.amazonaws.com/index.html
الحين فعّل الإصدارات، واكتب فوق الملف، ثم احذفه:
aws s3api put-bucket-versioning --bucket $BUCKET \
--versioning-configuration Status=Enabled
echo "<h1>Version 2</h1>" > index.html
aws s3 cp index.html s3://$BUCKET/
aws s3 rm s3://$BUCKET/index.html
aws s3 ls s3://$BUCKET/
الملف اختفى من القائمة. بس شوف وش صار فعلاً:
aws s3api list-object-versions --bucket $BUCKET --prefix index.html \
--query "{Versions:Versions[].[VersionId,IsLatest],Markers:DeleteMarkers[].[VersionId,IsLatest]}"
الإصدارين موجودين، وفوقهم علامة حذف. احذف العلامة ويرجع الملف:
MARKER=$(aws s3api list-object-versions --bucket $BUCKET --prefix index.html \
--query "DeleteMarkers[0].VersionId" --output text)
aws s3api delete-object --bucket $BUCKET --key index.html --version-id $MARKER
aws s3 cp s3://$BUCKET/index.html -
بيطبع Version 2. رجع الملف وكأن ما انحذف.
الخلاصة
- S3 تخزين كائني بلا حد عملي، وتدفع على اللي تخزنه.
- الحاوية في Region واحدة باسم فريد، والمفتاح مسار الكائن الكامل.
- كل شي خاص افتراضياً، وخل Block Public Access مفعّل.
- الإصدارات تحميك من الحذف والكتابة بالغلط، والنسخ ينقل الكائنات لحاوية ثانية.
- لموقع ثابت في الإنتاج: حاوية خاصة مع CloudFront.
اختبر نفسك
قبل ما تكمل، جرّب هذي الأسئلة عشان تتأكد إنك فهمت الجزء. كل سؤال موقف عملي، وبعد ما تجاوب يطلع لك الشرح.
السؤال 1 من 5
وكالة تصميم تحفظ ملفات عملائها في S3. والأسبوع اللي فات حذف موظف ملفات بالغلط، وسكربت كتب فوق ملفات ثانية. والوكالة تبي تقدر ترجّع النوعين من الحين وطالع، بأقل جهد. وش تفعّل؟
اعرض الجواب
الجواب الصحيح: C
مع الإصدارات، الحذف يضيف علامة بس، والكتابة فوق الملف تنشئ إصدار جديد، فتبقى البيانات القديمة وتقدر ترجع لها.
- A: هذا يمنع الوصول العام، وما يسوي شي مع الحذف أو الكتابة فوق الملفات.
- B: هذا يحتاج الإصدارات أصلاً، ويضيف حاوية ثانية تدفع عليها.
- D: هذا يسرّع الرفع للمسافات الطويلة، وما يحتفظ بنسخ قديمة.
للمراجعة: الإصدارات (Versioning) في هذا الجزء، وRetaining multiple versions of objects with S3 Versioning في وثائق AWS.
السؤال 2 من 5
شركة تحفظ موقعها التسويقي في S3. وتبيه يشتغل بـ HTTPS على نطاقها، والحاوية تبقى خاصة. وش يناسب؟
اعرض الجواب
الجواب الصحيح: A
CloudFront يعطيك HTTPS على نطاقك، وOAC يخلي CloudFront وحده يقرأ من الحاوية، فتبقى مقفلة.
- B: رابط الموقع يشتغل بـ HTTP فقط، ولازم تكون الحاوية عامة.
- C: رابط الموقع يحتاج كائنات عامة، فمع القفل يطلع للزوار
403. - D: هذا يضيف سيرفر تشغله وتحدّثه، لموقع ما يحتاج سيرفر.
للمراجعة: استضافة موقع ثابت في هذا الجزء، وWebsite endpoints في وثائق AWS.
السؤال 3 من 5
استوديو أفلام يرفع ملفات فيديو حجمها 40 جيجابايت إلى S3 عبر اتصال غير مستقر. والرفع يفشل كثير قرب النهاية ويبدأ من جديد. وش يحل هذا؟
اعرض الجواب
الجواب الصحيح: D
Multipart upload يرفع الملف أجزاء بالتوازي، ولو فشل جزء تعيده هو بس. وهو كمان إلزامي لأي ملف فوق 5 جيجابايت.
- A: هذي لتحميل جزء من ملف، مو للرفع.
- B: هذا يختصر الطريق للمسافات الطويلة، بس الرفع الفاشل لسا يبدأ من جديد.
- C: هذا يحتفظ بالإصدارات القديمة، وما يساعد الرفع يكتمل.
للمراجعة: الأداء في هذا الجزء، وUploading and copying objects using multipart upload في وثائق AWS.
السؤال 4 من 5
جهة تنظيمية تطلب من شركة تحتفظ بنسخة من حاوية سجلاتها في Region ثانية، بما فيها الملفات الموجودة حالياً. والإصدارات شغالة في الطرفين. وش تجهز؟
اعرض الجواب
الجواب الصحيح: B
قاعدة النسخ تنسخ الكائنات الجديدة فقط، فالموجودة تحتاج Batch Replication. والاثنين مع بعض يعطونك نسخة كاملة في الـ Region الثانية تبقى محدثة.
- A: هذا ينسخ الكائنات اللي انكتبت بعد القاعدة فقط.
- C: هذا يبقي النسخة في نفس الـ Region، وهذا ما يحقق المطلوب.
- D: قواعد Lifecycle تغير فئة الملف أو تحذفه، وما تنقله بين Regions.
للمراجعة: النسخ بين الحاويات (Replication) في هذا الجزء، وReplicating objects within and across Regions في وثائق AWS.
السؤال 5 من 5
سيرفر EC2 لازم يقرأ من حاوية خاصة، وفريق تحليل في حساب AWS ثاني لازم يقرأ منها كمان. وBlock Public Access لازم يبقى شغال. أي خطوتين تناسب؟ (اختر اثنين.)
اعرض الجواب
الجواب الصحيح: A + D
الدور يعطي السيرفر صلاحيات مؤقتة بدون مفاتيح تحفظها، وسياسة الحاوية هي طريقتك تدخّل فيها حساب ثاني. وما فيهم شي يخلي البيانات عامة.
- B: المفاتيح في ملف ممكن تتسرب، والدور يغنيك عنها تماماً.
- C: هذا يكشف البيانات للكل، والقفل بيمنعه أصلاً.
- E: هذا يزيد نسخ لازم تديرها، والقرص مو طريقة حساب ثاني يقرأ بياناتك.
للمراجعة: مين يقدر يوصل؟ في هذا الجزء، وExample 2: Bucket owner granting cross-account bucket permissions وUse an IAM role to grant permissions to applications running on Amazon EC2 instances في وثائق AWS.
بس هل كل ملف يستاهل نفس السعر؟ ملف ما ينفتح من سنتين لازم ما يكلفك مثل صورة تنطلب كل ثانية. في الجزء السادس عشر نوفر كثير بفئات التخزين ودورة الحياة.