{"id":"l-aws-3-2","courseId":"aws-cloud-foundations","lang":"ar","kind":"lesson","summary":"خزّن ملصقات Lantern ونسخه الاحتياطية في Amazon S3 بفئة التخزين المناسبة مع تفعيل الـ versioning وBlock Public Access، واعرف متى يحتاج حمل عمل على EC2 إلى EBS أو EFS بدلًا من ذلك.","html":"<p>على خادم Lantern القديم، كان “التخزين” قرصًا واحدًا يمتلئ. أما على AWS فتحصل على ثلاثة أنواع مختلفة، صُمِّم كلٌّ منها لمهمة مختلفة: <strong>الكائنات (objects)</strong> في Amazon S3، و<strong>الأقراص الكتلية (block disks)</strong> في Amazon EBS، و<strong>الملفات المشتركة</strong> في Amazon EFS. ومعظم بيانات Lantern مكانها النوع الأول.</p>\n<h2 id=\"sec-1\" tabindex=\"-1\">Amazon S3: كائنات في buckets</h2>\n<p>يخزّن S3 <strong>الكائنات</strong> (أي بايتات، حتى 50 TB لكلٍّ منها) في <strong>buckets</strong>. يُعنون الكائن بـ <strong>مفتاحه (key)</strong>، مثل <code dir=\"ltr\">posters/2026/street-food-festival.jpg</code>. تبدو الشرطات المائلة كمجلّدات، ويرسمها الـ console كمجلّدات، لكن S3 لا يحتوي على مجلّدات: المفتاح نص واحد، و<code dir=\"ltr\">posters/2026/</code> <strong>بادئة (prefix)</strong>. أسماء الـ buckets فريدة على مستوى AWS كلها؛ أما الـ bucket نفسه فيعيش في الـ Region التي تختارها.</p>\n<div class=\"code-block\" dir=\"ltr\" data-lang=\"bash\" data-index=\"0\"><div class=\"code-head\"><span class=\"code-title\">Terminal</span><span class=\"code-actions\"><button type=\"button\" class=\"code-btn\" data-action=\"copy\" aria-label=\"نسخ الكود\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"/><path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"/></svg><span>نسخ</span></button></span></div><pre class=\"shiki\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#953800;--shiki-dark:#FFA657\">aws</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> s3</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> mb</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> s3://lantern-posters</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> --region</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> eu-west-1</span></span>\n<span class=\"line\"><span style=\"color:#953800;--shiki-dark:#FFA657\">aws</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> s3</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> cp</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> ./posters/</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> s3://lantern-posters/posters/</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> --recursive</span></span>\n<span class=\"line\"><span style=\"color:#953800;--shiki-dark:#FFA657\">aws</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> s3</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> ls</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> s3://lantern-posters/posters/2026/</span></span></code></pre></div>\n<h3 id=\"sec-2\" tabindex=\"-1\">آمن افتراضيًا، فأبقِه كذلك</h3>\n<p>تأتي الـ buckets الجديدة بثلاث حمايات مفعّلة: <strong>Block Public Access</strong> (بإعداداته الأربعة مفعّلة)، و<strong>Object Ownership مضبوطًا على bucket owner enforced</strong> (قوائم التحكّم في الوصول ACLs معطّلة، فلا تمنح الوصولَ إلا السياسات)، و<strong>التشفير الافتراضي</strong> بمفاتيح يديرها S3. تغيّر الوصول عبر سياسات الـ bucket، كما فعلت في القسم الثاني.</p>\n<p>أبقِ Block Public Access مفعّلًا في كل bucket ليس عامًّا عن قصد، واضبطه على مستوى الحساب أيضًا، كي لا يتحوّل bucket واحد إلى عام بالخطأ:</p>\n<div class=\"code-block\" dir=\"ltr\" data-lang=\"bash\" data-index=\"1\"><div class=\"code-head\"><span class=\"code-title\">Terminal</span><span class=\"code-actions\"><button type=\"button\" class=\"code-btn\" data-action=\"copy\" aria-label=\"نسخ الكود\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"/><path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"/></svg><span>نسخ</span></button></span></div><pre class=\"shiki\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#953800;--shiki-dark:#FFA657\">aws</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> s3control</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> put-public-access-block</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> --account-id</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> 111122223333</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\"> \\</span></span>\n<span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">  --public-access-block-configuration</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\"> \\</span></span>\n<span class=\"line\"><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">  BlockPublicAcls=</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">true</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">,IgnorePublicAcls=</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">true</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">,BlockPublicPolicy=</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">true</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">,RestrictPublicBuckets=</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">true</span></span></code></pre></div>\n<p>في القسم الرابع يُقدَّم موقع Lantern للجمهور <strong>دون</strong> جعل أي bucket عامًّا: يقرأ CloudFront الـ bucket بشكل خاص نيابة عن الزوّار.</p>\n<h3 id=\"sec-3\" tabindex=\"-1\">فئات التخزين: الـ API نفسه، وشكل سعر مختلف</h3>\n<p>لكل كائن فئة تخزين. وكلها مصمّمة لمستوى المتانة نفسه، أي إحدى عشرة تسعة (99.999999999%)؛ لكنها تختلف في طريقة الدفع.</p>\n<div class=\"table-wrap\" role=\"region\" aria-label=\"جدول قابل للتمرير\" tabindex=\"0\"><table><thead>\n<tr>\n<th>الفئة</th>\n<th>الأنسب لـ</th>\n<th>العقبة</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>S3 Standard (الافتراضية)</td>\n<td>البيانات التي تُقرأ كثيرًا</td>\n<td>أعلى سعر تخزين</td>\n</tr>\n<tr>\n<td>S3 Intelligent-Tiering</td>\n<td>نمط وصول مجهول أو متغيّر</td>\n<td>رسوم مراقبة صغيرة لكل كائن</td>\n</tr>\n<tr>\n<td>S3 Standard-IA</td>\n<td>ما يُقرأ نحو مرة شهريًا ويحتاج إلى وصول بالمللي ثانية</td>\n<td>رسوم استرجاع، وحد أدنى 30 يومًا</td>\n</tr>\n<tr>\n<td>S3 One Zone-IA</td>\n<td>النسخ التي يمكن إعادة إنشائها</td>\n<td>منطقة توافر واحدة فقط</td>\n</tr>\n<tr>\n<td>S3 Glacier Instant Retrieval</td>\n<td>ما يُقرأ نحو مرة كل ربع سنة، بوصول بالمللي ثانية</td>\n<td>رسوم استرجاع أعلى، وحد أدنى 90 يومًا</td>\n</tr>\n<tr>\n<td>S3 Glacier Flexible Retrieval</td>\n<td>الأرشيفات، والاستعادة من دقائق إلى ساعات</td>\n<td>الاستعادة قبل القراءة</td>\n</tr>\n<tr>\n<td>S3 Glacier Deep Archive</td>\n<td>ما نادرًا ما يُلمس، والاستعادة بالساعات</td>\n<td>حد أدنى 180 يومًا</td>\n</tr>\n</tbody>\n</table></div><p>لنموذج السعر ثلاثة أجزاء: <strong>لكل غيغابايت مخزّن شهريًا</strong>، و<strong>لكل طلب</strong>، و<strong>لكل غيغابايت مسترجَع</strong> في فئات الوصول غير المتكرّر والأرشيف. فئة تخزين أرخص مع قراءات متكرّرة قد تكلّف أكثر من Standard. والكائنات الصغيرة فخ أيضًا: فئات IA تحتسب كل كائن بـ 128 KB على الأقل.</p>\n<p>بالنسبة إلى Lantern: تبقى الملصقات الحالية في Standard، وتنتقل الملصقات الأقدم من سنة إلى Glacier Instant Retrieval (فهي ما زالت تظهر في صفحات الفعاليات القديمة)، وتذهب التصديرات الشهرية لقاعدة البيانات إلى Deep Archive.</p>\n<h3 id=\"sec-4\" tabindex=\"-1\">الـ versioning: زر تراجع له ثمن</h3>\n<p>مع تفعيل <strong>الـ versioning (إدارة النسخ)</strong>، تُبقي الكتابة فوق كائن أو حذفه على النسخة القديمة. الحذف يضيف <em>علامة حذف (delete marker)</em> بدلًا من إتلاف البيانات، فيمكن التعافي من <code dir=\"ltr\">aws s3 rm</code> عرضي. وبمجرد تفعيله، يمكن تعليق الـ versioning فقط، ولا يمكن إزالته كليًا أبدًا.</p>\n<div class=\"code-block\" dir=\"ltr\" data-lang=\"bash\" data-index=\"2\"><div class=\"code-head\"><span class=\"code-title\">Terminal</span><span class=\"code-actions\"><button type=\"button\" class=\"code-btn\" data-action=\"copy\" aria-label=\"نسخ الكود\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"/><path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"/></svg><span>نسخ</span></button></span></div><pre class=\"shiki\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#953800;--shiki-dark:#FFA657\">aws</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> s3api</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> put-bucket-versioning</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> --bucket</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> lantern-posters</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\"> \\</span></span>\n<span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">  --versioning-configuration</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> Status=Enabled</span></span></code></pre></div>\n<p>كل نسخة تُحتسب ككائن كامل، لذا اقرن الـ versioning بـ <strong>قاعدة دورة حياة (lifecycle rule)</strong> تنقل البيانات وتنهيها تلقائيًا:</p>\n<div class=\"code-block\" dir=\"ltr\" data-lang=\"json\" data-index=\"3\"><div class=\"code-head\"><span class=\"code-title\">lifecycle.json</span><span class=\"code-actions\"><button type=\"button\" class=\"code-btn\" data-action=\"copy\" aria-label=\"نسخ الكود\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"/><path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"/></svg><span>نسخ</span></button></span></div><pre class=\"shiki\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">{</span></span>\n<span class=\"line\"><span style=\"color:#116329;--shiki-dark:#7EE787\">  \"Rules\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">: [</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">    {</span></span>\n<span class=\"line\"><span style=\"color:#116329;--shiki-dark:#7EE787\">      \"ID\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">: </span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"age-out-posters\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">,</span></span>\n<span class=\"line\"><span style=\"color:#116329;--shiki-dark:#7EE787\">      \"Filter\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">: { </span><span style=\"color:#116329;--shiki-dark:#7EE787\">\"Prefix\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">: </span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"posters/\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> },</span></span>\n<span class=\"line\"><span style=\"color:#116329;--shiki-dark:#7EE787\">      \"Status\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">: </span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"Enabled\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">,</span></span>\n<span class=\"line\"><span style=\"color:#116329;--shiki-dark:#7EE787\">      \"Transitions\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">: [{ </span><span style=\"color:#116329;--shiki-dark:#7EE787\">\"Days\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">: </span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">365</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#116329;--shiki-dark:#7EE787\">\"StorageClass\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">: </span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"GLACIER_IR\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> }],</span></span>\n<span class=\"line\"><span style=\"color:#116329;--shiki-dark:#7EE787\">      \"NoncurrentVersionExpiration\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">: { </span><span style=\"color:#116329;--shiki-dark:#7EE787\">\"NoncurrentDays\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">: </span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">30</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> }</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">    }</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">  ]</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">}</span></span></code></pre></div>\n<div class=\"code-block\" dir=\"ltr\" data-lang=\"bash\" data-index=\"4\"><div class=\"code-head\"><span class=\"code-title\">Terminal</span><span class=\"code-actions\"><button type=\"button\" class=\"code-btn\" data-action=\"copy\" aria-label=\"نسخ الكود\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"/><path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"/></svg><span>نسخ</span></button></span></div><pre class=\"shiki\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#953800;--shiki-dark:#FFA657\">aws</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> s3api</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> put-bucket-lifecycle-configuration</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> --bucket</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> lantern-posters</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\"> \\</span></span>\n<span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">  --lifecycle-configuration</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> file://lifecycle.json</span></span></code></pre></div>\n<aside class=\"callout callout-mistake\" role=\"note\"><p class=\"callout-title\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><path d=\"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3\"/><path d=\"M12 9v4\"/><path d=\"M12 17h.01\"/></svg><span><span class=\"callout-kind\">خطأ شائع</span><span class=\"callout-sep\" aria-hidden=\"true\"> · </span>الـ versioning دون قاعدة دورة حياة</span></p>\n<p>تفعّل الفرق الـ versioning من أجل الأمان، ثم يعيد سكربت كتابة آلاف الكائنات كل ليلة. بعد ستة أشهر يحتوي الـ bucket على 180 نسخة من كل شيء، وتُظهر الفاتورة ذلك. كلما فعّلت الـ versioning، أضف قاعدة <code dir=\"ltr\">NoncurrentVersionExpiration</code> في التغيير نفسه.</p>\n</aside>\n<h2 id=\"sec-5\" tabindex=\"-1\">أقراص للخوادم: EBS وEFS</h2>\n<p>بعض البرمجيات تحتاج إلى نظام ملفات حقيقي. وهنا يأتي دور الخدمتين الأخريين.</p>\n<figure class=\"diagram\"><svg class=\"diagram-svg\" focusable=\"false\" viewBox=\"0 0 680 250\" role=\"img\" aria-labelledby=\"l-aws-3-2-t1\"><defs><marker id=\"arrow-l-aws-3-2-1\" viewBox=\"0 0 10 10\" refX=\"9\" refY=\"5\" markerWidth=\"7\" markerHeight=\"7\" orient=\"auto-start-reverse\"><path d=\"M0 0 L10 5 L0 10 z\" class=\"d-arrowhead\"/></marker></defs>\n  <title id=\"l-aws-3-2-t1\">يصل أي عميل إلى S3 عبر HTTPS. يُرفق volume في EBS بـ instance واحدة في EC2 داخل منطقة توافر واحدة. ويُركَّب نظام ملفات EFS على instances في منطقتي توافر في الوقت نفسه.</title>\n  <rect class=\"d-box-primary\" x=\"20\" y=\"90\" width=\"150\" height=\"60\" rx=\"10\"/>\n  <text class=\"d-label\" x=\"95\" y=\"117\" text-anchor=\"middle\">Amazon S3</text>\n  <text class=\"d-label-muted\" x=\"95\" y=\"137\" text-anchor=\"middle\">كائنات عبر API</text>\n  <text class=\"d-label-muted\" x=\"95\" y=\"70\" text-anchor=\"middle\">متصفّحات، Lambda، CLI</text>\n  <path class=\"d-arrow\" d=\"M95 76 L95 86\" marker-end=\"url(#arrow-l-aws-3-2-1)\"/>\n  <rect class=\"d-box\" x=\"210\" y=\"30\" width=\"200\" height=\"190\" rx=\"12\"/>\n  <text class=\"d-label-muted\" x=\"310\" y=\"52\" text-anchor=\"middle\">AZ a</text>\n  <rect class=\"d-box-accent\" x=\"240\" y=\"70\" width=\"140\" height=\"44\" rx=\"8\"/>\n  <text class=\"d-label\" x=\"310\" y=\"97\" text-anchor=\"middle\">EC2 instance</text>\n  <rect class=\"d-box-success\" x=\"255\" y=\"150\" width=\"110\" height=\"40\" rx=\"8\"/>\n  <text class=\"d-label\" x=\"310\" y=\"175\" text-anchor=\"middle\">EBS volume</text>\n  <path class=\"d-arrow\" d=\"M310 148 L310 118\" marker-end=\"url(#arrow-l-aws-3-2-1)\"/>\n  <rect class=\"d-box\" x=\"450\" y=\"30\" width=\"210\" height=\"110\" rx=\"12\"/>\n  <text class=\"d-label-muted\" x=\"555\" y=\"52\" text-anchor=\"middle\">AZ b</text>\n  <rect class=\"d-box-accent\" x=\"485\" y=\"70\" width=\"140\" height=\"44\" rx=\"8\"/>\n  <text class=\"d-label\" x=\"555\" y=\"97\" text-anchor=\"middle\">EC2 instance</text>\n  <rect class=\"d-box-warn\" x=\"430\" y=\"180\" width=\"160\" height=\"44\" rx=\"8\"/>\n  <text class=\"d-label\" x=\"510\" y=\"207\" text-anchor=\"middle\">Amazon EFS</text>\n  <path class=\"d-arrow\" d=\"M480 180 L360 114\" marker-end=\"url(#arrow-l-aws-3-2-1)\"/>\n  <path class=\"d-arrow\" d=\"M530 180 L550 118\" marker-end=\"url(#arrow-l-aws-3-2-1)\"/>\n</svg><figcaption>يُوصَل إلى S3 عبر HTTPS، ويُرفق EBS بـ instance واحدة، وEFS مشترك</figcaption></figure>\n<p><strong>Amazon EBS</strong> (Elastic Block Store) قرص شبكي لـ instance <strong>واحدة</strong> في EC2، ضمن منطقة توافر <strong>واحدة</strong>. وتقريبًا كل instance تُقلع من واحد منها. والنوع <code dir=\"ltr\">gp3</code> هو قرص SSD للأغراض العامة الذي تبدأ به. تدفع مقابل الحجم <strong>المحجوز</strong>، لا مقابل ما تملؤه، لذا فإن volume بحجم 500 GB يحمل 20 GB يكلّف ما يكلّفه volume ممتلئ. و<strong>اللقطات (snapshots)</strong> تنسخ الـ volumes احتياطيًا بشكل تزايدي إلى تخزين يصمد أمام خسارة منطقة التوافر.</p>\n<p><strong>Amazon EFS</strong> (Elastic File System) نظام ملفات NFS مُدار تركّبه instances <strong>كثيرة</strong>، عبر مناطق التوافر، في الوقت نفسه. يكبر ويصغر مع ملفاتك ويُحتسب لكل غيغابايت مخزّن فعلًا، بسعر للغيغابايت أعلى من EBS. استخدمه حين يجب أن تتشارك عدة خوادم شجرة مجلّدات واحدة.</p>\n<p>بالنسبة إلى Lantern، الجواب في الغالب “لا هذا ولا ذاك”: تعيش الملصقات في S3، حيث تستطيع Lambda وCloudFront الوصول إليها. ويحصل خادم الترحيل المؤقت على volume صغير واحد من نوع <code dir=\"ltr\">gp3</code>، ولا EFS على الإطلاق.</p>\n<aside class=\"callout callout-tip\" role=\"note\"><p class=\"callout-title\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5\"/><path d=\"M9 18h6\"/><path d=\"M10 22h4\"/></svg><span><span class=\"callout-kind\">نصيحة</span><span class=\"callout-sep\" aria-hidden=\"true\"> · </span>اسأل: “من يقرأ هذا، وكيف؟”</span></p>\n<p>إذا كان الكود أو المتصفّحات تقرؤه عبر HTTP، فاستخدم S3. وإذا احتاج خادم واحد إلى قرص، فاستخدم EBS. وإذا احتاجت عدة خوادم إلى المجلّد نفسه، فاستخدم EFS. هذا السؤال الواحد يحسم معظم قرارات التخزين.</p>\n</aside>\n<p>حُسم أمر الملفات. في الدرس التالي: البيانات التي تتغيّر كل ثانية، في قاعدة بيانات.</p>\n","toc":[{"id":"sec-1","text":"Amazon S3: كائنات في buckets","level":2},{"id":"sec-2","text":"آمن افتراضيًا، فأبقِه كذلك","level":3},{"id":"sec-3","text":"فئات التخزين: الـ API نفسه، وشكل سعر مختلف","level":3},{"id":"sec-4","text":"الـ versioning: زر تراجع له ثمن","level":3},{"id":"sec-5","text":"أقراص للخوادم: EBS وEFS","level":2}],"takeaways":["يخزّن Amazon S3 الكائنات تحت مفاتيح (keys) داخل buckets، والـ buckets الجديدة تحجب الوصول العام وتعطّل الـ ACLs وتشفّر الكائنات افتراضيًا.","فئات التخزين تقايض بين سعر التخزين وتكلفة الاسترجاع وسرعته والحد الأدنى لمدة التخزين؛ وS3 Standard هي الفئة الافتراضية.","يحتفظ الـ versioning بكل نسخة من كل كائن، ما يحمي من الكتابة فوق الملفات وحذفها، لكنه يحتسب كل نسخة مخزّنة حتى تنهيها قاعدة دورة حياة (lifecycle rule).","Amazon EBS قرص كتلي (block) لـ instance واحدة في EC2 ضمن منطقة توافر واحدة، ويُحتسب لكل غيغابايت محجوز.","Amazon EFS نظام ملفات مشترك تستطيع instances كثيرة عبر مناطق التوافر تركيبه (mount) في الوقت نفسه، ويُحتسب لكل غيغابايت مخزّن فعلًا."],"further":[{"title":"Understanding and managing Amazon S3 storage classes","url":"https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage-class-intro.html"},{"title":"Blocking public access to your Amazon S3 storage","url":"https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-control-block-public-access.html"},{"title":"Retaining multiple versions of objects with S3 Versioning","url":"https://docs.aws.amazon.com/AmazonS3/latest/userguide/Versioning.html"},{"title":"What is Amazon Elastic File System?","url":"https://docs.aws.amazon.com/efs/latest/ug/whatisefs.html"}],"quiz":[{"q":"<p>يحتفظ Lantern بتصديرات شهرية لقاعدة البيانات لمدة سبع سنوات، ويتوقّع أن يستعيد واحدًا منها ربما مرة في السنة، مع قبول الانتظار بضع ساعات. أيّ فئة تخزين تناسبه؟</p>","options":[{"text":"S3 Glacier Deep Archive","why":"صحيح. لها أقل سعر تخزين، ووقت استرجاعها الذي يُقاس بالساعات مقبول لاستعادة تحدث مرة في السنة."},{"text":"S3 Standard","why":"تعمل، لكنك تدفع أعلى سعر تخزين لسنوات على بيانات لا تكاد تُقرأ."},{"text":"S3 One Zone-IA","why":"تحتفظ بالبيانات في منطقة توافر واحدة، لذا قد تعني خسارة تلك المنطقة خسارة النسخة الوحيدة من نسخ احتياطية عمرها سبع سنوات."},{"text":"S3 Express One Zone","why":"صُمِّمت للوصول خلال أجزاء قليلة من الألف من الثانية من قِبل تطبيقات حساسة لزمن الاستجابة، وهذا عكس الأرشيف تمامًا."}],"answer":0},{"q":"<p>الـ versioning مفعّل في الـ bucket الخاص بالملصقات. أعاد أحد المنظّمين رفع الملصق نفسه 40 مرة أثناء تعديله. ماذا يحدث لتكاليف التخزين؟</p>","options":[{"text":"لا يتغيّر شيء؛ يخزّن S3 أحدث نسخة فقط.","why":"مع تفعيل الـ versioning، تُبقي كل كتابة فوق الكائن الكائنَ السابق كنسخة غير حالية (noncurrent version)."},{"text":"يدفع Lantern ثمن النسخ الأربعين كلها حتى تحذف قاعدة دورة حياة أو شخصٌ ما النسخَ غير الحالية.","why":"صحيح. كل نسخة كائن مخزّن كامل. وقاعدة NoncurrentVersionExpiration تُبقي هذا تحت السيطرة."},{"text":"يزيل S3 التكرار من عمليات الرفع المتطابقة، فلا يُحتسب إلا البايتات المتغيّرة.","why":"لا يزيل S3 التكرار. كل نسخة تُحتسب بحجمها الكامل."}],"answer":1},{"q":"<p>يجب أن تقرأ ثلاث instances في EC2، موزّعة على مناطق توافر مختلفة، مجموعةَ الملفات المرفوعة نفسها وتكتب فيها عبر مسار عادي في نظام الملفات. ماذا تستخدم؟</p>","options":[{"text":"volume واحدًا في EBS مرفقًا بالـ instances الثلاث.","why":"الـ volume القياسي في EBS يُرفق بـ instance واحدة، ويعيش في منطقة توافر واحدة، فلا تستطيع الـ instances في المناطق الأخرى استخدامه."},{"text":"volume من نوع instance store على كل instance.","why":"الـ instance store محلي لـ instance واحدة وتختفي بياناته عند إيقافها، فلا شيء مشترك."},{"text":"نظام ملفات Amazon EFS مركّب على الثلاث.","why":"صحيح. EFS نظام ملفات NFS مشترك وإقليمي تستطيع instances في عدة مناطق توافر تركيبه في الوقت نفسه."}],"answer":2}],"exercise":{"kind":"fill","language":"bash","template":"# 1. Upload the whole local posters folder, including subfolders\naws s3 {{0}} ./posters/ s3://lantern-posters/posters/ --{{1}}\n\n# 2. Keep old versions when posters are overwritten or deleted\naws s3api put-bucket-versioning --bucket lantern-posters \\\n  --versioning-configuration Status={{2}}\n\n# 3. Store this month's export in the cheapest archive class\naws s3 cp ./exports/2026-09.sql.gz s3://lantern-backups/exports/ \\\n  --storage-class {{3}}","blanks":[{"answers":["cp"]},{"answers":["recursive"]},{"answers":["Enabled"]},{"answers":["DEEP_ARCHIVE"]}],"title":"ارفع، واحمِ، وأرشِف","prompt":"<p>أكمل ثلاثة أوامر لتخزين Lantern. الخطوة 1 تنسخ المجلّد المحلي <code dir=\"ltr\">posters/</code> وكل مجلّداته الفرعية إلى الـ bucket بأمر النسخ. الخطوة 2 تفعّل الـ versioning. الخطوة 3 ترفع تصديرًا لقاعدة البيانات يجب الاحتفاظ به سبع سنوات بأقل سعر تخزين، مع قبول الانتظار ساعات للاستعادة. استخدم اسم فئة التخزين في الـ API، بأحرف كبيرة.</p>\n","hints":["أمر النسخ عالي المستوى في <code dir=\"ltr\">aws s3</code> مكوّن من حرفين، ويحتاج إلى خيار (flag) للنزول داخل المجلّدات.","قيم حالة الـ versioning هي <code dir=\"ltr\">Enabled</code> و<code dir=\"ltr\">Suspended</code>.","فئة الأرشيف ذات أقل سعر تخزين وحد أدنى 180 يومًا تُكتب بشرطة سفلية."],"explanation":"<p>ينسخ <code dir=\"ltr\">aws s3 cp</code> مع <code dir=\"ltr\">--recursive</code> كل ملف تحت المجلّد، محتفظًا بالمسارات النسبية كبادئات للمفاتيح. (سيعمل <code dir=\"ltr\">aws s3 sync</code> أيضًا ولا يرفع إلا الملفات المتغيّرة، لكنه لا يأخذ الخيار <code dir=\"ltr\">--recursive</code>.) يفعّل <code dir=\"ltr\">Status=Enabled</code> الـ versioning؛ وبعد ذلك لا تستطيع إلا تعليقه. ويضع <code dir=\"ltr\">--storage-class DEEP_ARCHIVE</code> التصدير مباشرة في S3 Glacier Deep Archive، التي لها أقل سعر تخزين، وحد أدنى لمدة التخزين قدره 180 يومًا، واستعادة تُقاس بالساعات، وهي مناسبة جيدًا لملفات تأمل ألّا تحتاجها أبدًا.</p>\n","checkLabels":{}},"words":776,"readMinutes":5}