{"id":"l-aws-3-1","courseId":"aws-cloud-foundations","lang":"ar","kind":"lesson","summary":"اقرأ اسم نوع instance في EC2، واختر خيار الشراء المناسب لطبيعة حمل العمل، وقرّر متى يتفوّق نموذج AWS Lambda القائم على الطلب على خادم يعمل طوال الشهر.","html":"<p>كان خادم Lantern القديم يفعل كل شيء: يقدّم الصفحات، ويعالج تأكيدات الحضور، ويغيّر أحجام الملصقات، ويشغّل تصديرًا ليليًا. على AWS، يمكن تشغيل كل مهمة من هذه المهام على نموذج الحوسبة الذي يناسب طبيعتها. النموذجان اللذان ستستخدمهما أكثر من غيرهما هما <strong>Amazon EC2</strong>، أي خوادم افتراضية تستأجرها بالثانية، و<strong>AWS Lambda</strong>، أي دوال لا تعمل إلا حين يستدعيها شيء ما.</p>\n<h2 id=\"sec-1\" tabindex=\"-1\">Amazon EC2: خادم مستأجَر</h2>\n<p>الـ <strong>instance</strong> في EC2 آلة افتراضية. تختار صورة نظام تشغيل (AMI، مثل Amazon Linux 2023)، و<strong>نوع instance</strong>، وشبكة وتخزينًا، فتشغّلها AWS في منطقة التوافر التي تختارها. كل ما فوق الـ hypervisor مسؤوليتك: تحديثات نظام التشغيل، وبيئة التشغيل، والتطبيق، والتوسّع.</p>\n<h3 id=\"sec-2\" tabindex=\"-1\">قراءة نوع الـ instance</h3>\n<p>أسماء أنواع الـ instances مكثّفة لكنها منتظمة. خذ <code dir=\"ltr\">m7g.large</code> مثالًا:</p>\n<div class=\"table-wrap\" role=\"region\" aria-label=\"جدول قابل للتمرير\" tabindex=\"0\"><table><thead>\n<tr>\n<th>الجزء</th>\n<th>المعنى</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code dir=\"ltr\">m</code></td>\n<td>العائلة: للأغراض العامة</td>\n</tr>\n<tr>\n<td><code dir=\"ltr\">7</code></td>\n<td>الجيل: الأحدث عادةً قيمته أفضل</td>\n</tr>\n<tr>\n<td><code dir=\"ltr\">g</code></td>\n<td>قدرة إضافية: معالج AWS Graviton (Arm)</td>\n</tr>\n<tr>\n<td><code dir=\"ltr\">large</code></td>\n<td>الحجم</td>\n</tr>\n</tbody>\n</table></div><p>العائلات الشائعة: <code dir=\"ltr\">t</code> (قابلة للاندفاع burstable، رخيصة للاستخدام المنخفض المتقطّع)، و<code dir=\"ltr\">m</code> (متوازنة)، و<code dir=\"ltr\">c</code> (للحوسبة الكثيفة)، و<code dir=\"ltr\">r</code> (للذاكرة الكثيفة). ومن المقاطع الأخرى <code dir=\"ltr\">i</code> (Intel)، و<code dir=\"ltr\">a</code> (AMD)، و<code dir=\"ltr\">d</code> (قرص NVMe محلي). كل خطوة في الحجم، من <code dir=\"ltr\">large</code> إلى <code dir=\"ltr\">xlarge</code> إلى <code dir=\"ltr\">2xlarge</code>، تضاعف تقريبًا الـ vCPUs والذاكرة والسعر. وتمنح instances العاملة بـ Graviton عادةً نسبة أفضل بين السعر والأداء إذا كان برنامجك يعمل على Arm، وNode.js وPython يعملان عليه دون تغييرات.</p>\n<h3 id=\"sec-3\" tabindex=\"-1\">كيف تدفع</h3>\n<p>الـ instance هي نفسها؛ والالتزام هو ما يغيّر السعر.</p>\n<ul>\n<li><strong>On-Demand</strong>: تدفع بالثانية (على Linux، بحد أدنى 60 ثانية)، دون أي التزام. مناسب لكل ما هو قصير العمر أو جديد أو غير متوقّع.</li>\n<li><strong>Savings Plans</strong>: تلتزم بمبلغ ثابت من الإنفاق على الحوسبة في الساعة لمدة سنة أو ثلاث سنوات، مقابل خصم كبير. مناسب للحد الأدنى الذي تعرف أنه سيعمل طوال العام. (ما زال النموذج الأقدم <strong>Reserved Instances</strong> موجودًا ويعمل بطريقة مشابهة.)</li>\n<li><strong>Spot Instances</strong>: سعة فائضة لدى AWS بخصم كبير، لكن AWS تستطيع استرجاعها بإنذار مدته دقيقتان. مناسب للعمل الدفعي (batch) القابل لإعادة التشغيل.</li>\n<li><strong>Dedicated Hosts</strong> و<strong>Capacity Reservations</strong> تغطّي احتياجات الترخيص والسعة المضمونة التي يُستبعد أن تكون لديك بعد.</li>\n</ul>\n<p>الالتزامات غير متاحة في خطة الحساب المجانية؛ وهذا سبب آخر لكون حساب الإنتاج الخاص بـ Lantern على الخطة المدفوعة.</p>\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>الظن أن “موقوف” تعني “مجاني”</span></p>\n<p>إيقاف الـ instance يوقف رسوم الحوسبة. لكن الـ volumes الخاصة بها في EBS تظل تُحتسب لأن البيانات ما زالت مخزّنة. أما عنوان الـ IP العام المُسنَد تلقائيًا فيُحرَّر عند الإيقاف، لكن عنوان Elastic IP يبقى محجوزًا ويظل يُحتسب، لأن AWS تحاسب على كل عنوان IPv4 عام بالساعة، مستخدمًا كان أم لا. أنهِ (terminate) ما لا تحتاجه، وحرّر عناوين Elastic IP التي لا تستخدمها.</p>\n</aside>\n<h2 id=\"sec-4\" tabindex=\"-1\">AWS Lambda: كود يعمل عند وقوع الأحداث</h2>\n<p>مع Lambda ترفع دالة وتحدّد ما الذي يشغّلها: طلب HTTP عبر API Gateway، أو ملف يصل إلى S3، أو جدول زمني، أو رسالة في طابور (queue). تشغّل Lambda نسخًا بعدد الأحداث المتزامنة، و<strong>لا شيء</strong> حين لا توجد أحداث.</p>\n<p>إليك دالة الصور المصغّرة في Lantern. يستدعيها S3 بحدث يصف الملصق المرفوع:</p>\n<div class=\"code-block\" dir=\"ltr\" data-lang=\"js\" data-index=\"0\"><div class=\"code-head\"><span class=\"code-title\">thumbnail/index.mjs</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:#CF222E;--shiki-dark:#FF7B72\">export</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\"> const</span><span style=\"color:#8250DF;--shiki-dark:#D2A8FF\"> handler</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\"> =</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\"> async</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> (</span><span style=\"color:#953800;--shiki-dark:#FFA657\">event</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">) </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=></span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> {</span></span>\n<span class=\"line\"><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">  const</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> { </span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">bucket</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">object</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> } </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> event.Records[</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">0</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">].s3;</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">  console.</span><span style=\"color:#8250DF;--shiki-dark:#D2A8FF\">log</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">`New poster: s3://${</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">bucket</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">.</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">name</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">}/${</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">object</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">.</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">key</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">}`</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">);</span></span>\n<span class=\"line\"><span style=\"color:#6E7781;--shiki-dark:#8B949E\">  // …download, resize, upload to thumbnails/</span></span>\n<span class=\"line\"><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">  return</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> { resized: object.key };</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">};</span></span></code></pre></div>\n<p>وتنشئها عبر الـ CLI، مختارًا بيئة التشغيل، ومعمارية Arm، والذاكرة، والمهلة (timeout):</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\"> lambda</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> create-function</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> --function-name</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> lantern-thumbnail</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\"> \\</span></span>\n<span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">  --runtime</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> nodejs24.x</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> --architectures</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> arm64</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\"> \\</span></span>\n<span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">  --handler</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> index.handler</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> --zip-file</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> fileb://thumbnail.zip</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\"> \\</span></span>\n<span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">  --role</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> arn:aws:iam::111122223333:role/lantern-thumbnail-role</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\"> \\</span></span>\n<span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">  --memory-size</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> 512</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> --timeout</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> 30</span></span></code></pre></div>\n<p>الـ role هنا هو الـ execution role من القسم السابق: يستطيع قراءة <code dir=\"ltr\">uploads/</code> والكتابة في <code dir=\"ltr\">thumbnails/</code>، ولا شيء غير ذلك.</p>\n<h3 id=\"sec-5\" tabindex=\"-1\">نموذج تكلفة Lambda</h3>\n<p>تدفع لكل <strong>طلب</strong> ولكل <strong>GB-second</strong>: حجم الذاكرة بالغيغابايت مضروبًا في وقت التشغيل بالثواني، مقيسًا بالمللي ثانية. تتناسب قوة المعالج مع الذاكرة التي تخصّصها (من 128 MB إلى 10,240 MB)، ويستطيع الاستدعاء الواحد العمل 15 دقيقة كحد أقصى. احسب استخدام Lantern للصور المصغّرة:</p>\n<div class=\"code-block\" dir=\"ltr\" data-lang=\"js\" data-run=\"js\" data-index=\"2\"><div class=\"code-head\"><span class=\"code-title\">JavaScript</span><span class=\"code-actions\"><button type=\"button\" class=\"code-btn code-run\" data-action=\"run\" data-lang=\"js\" data-index=\"2\" 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\"><path d=\"M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z\"/></svg><span>تشغيل</span></button><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:#CF222E;--shiki-dark:#FF7B72\">const</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> postersPerMonth</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\"> =</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> 3000</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">;</span></span>\n<span class=\"line\"><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">const</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> avgSeconds</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\"> =</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> 0.8</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">;    </span><span style=\"color:#6E7781;--shiki-dark:#8B949E\">// measured from CloudWatch logs</span></span>\n<span class=\"line\"><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">const</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> memoryGb</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\"> =</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> 512</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\"> /</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> 1024</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">const</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> gbSeconds</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\"> =</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> postersPerMonth </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">*</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> avgSeconds </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">*</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> memoryGb;</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">console.</span><span style=\"color:#8250DF;--shiki-dark:#D2A8FF\">log</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">`Requests: ${</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">postersPerMonth</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">}`</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">);</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">console.</span><span style=\"color:#8250DF;--shiki-dark:#D2A8FF\">log</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">`GB-seconds: ${</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">gbSeconds</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">}`</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">);</span></span></code></pre><div class=\"run-output\" data-run-output=\"2\" hidden></div></div>\n<p>1,200 GB-second و3,000 طلب شهريًا أقل بكثير من الحصة الشهرية المجانية الدائمة في Lambda، والتي تبلغ وقت كتابة هذا الدرس مليون طلب و400,000 GB-second. أما instance في EC2 تؤدّي المهمة نفسها فستُحتسب كل ثانية من الشهر، مشغولة كانت أم خاملة.</p>\n<h2 id=\"sec-6\" tabindex=\"-1\">الاختيار بينهما</h2>\n<div class=\"table-wrap\" role=\"region\" aria-label=\"جدول قابل للتمرير\" tabindex=\"0\"><table><thead>\n<tr>\n<th>مهمة في Lantern</th>\n<th>الاختيار</th>\n<th>السبب</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>الـ API الخاص بتأكيد الحضور</td>\n<td>Lambda</td>\n<td>زيارات متقطّعة، وطلبات قصيرة، وخمول معظم الليل</td>\n</tr>\n<tr>\n<td>الصور المصغّرة للملصقات</td>\n<td>Lambda</td>\n<td>يشغّلها رفع الملفات إلى S3، وعملها ثوانٍ معدودة</td>\n</tr>\n<tr>\n<td>الأرشفة الليلية لـ 40 دقيقة</td>\n<td>EC2 بنظام On-Demand أو Spot</td>\n<td>أطول من أن تكفيها استدعاءة واحدة؛ وتعمل لوقت قصير كل يوم</td>\n</tr>\n<tr>\n<td>تطبيق Node.js القديم أثناء الترحيل</td>\n<td>EC2</td>\n<td>يجب أن يعمل دون تغيير حتى يُستغنى عنه</td>\n</tr>\n</tbody>\n</table></div><p>خيار افتراضي جيد لفريق بحجم Lantern: <strong>Lambda للقطع القائمة على الأحداث، وEC2 فقط حين يحتاج شيء ما إلى عملية طويلة التشغيل، أو تحكّم على مستوى نظام التشغيل، أو حمل ثقيل ثابت.</strong> وتقع الـ containers على Amazon ECS مع AWS Fargate بين الاثنين، وتستحق نظرة بمجرد أن تحزم تطبيقاتك كـ images.</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>لأن المعالج يتناسب مع الذاكرة، فإن مضاعفة ذاكرة الدالة كثيرًا ما تنصّف وقت تشغيلها، فتبقى تكلفة الـ GB-second على حالها في الغالب بينما ينتظر المستخدمون وقتًا أقل. قِس قبل التغيير وبعده؛ لا تخمّن.</p>\n</aside>\n<p>تحتاج الحوسبة إلى مكان تحفظ فيه الملفات. في الدرس التالي: Amazon S3 للكائنات، وEBS وEFS للأقراص.</p>\n","toc":[{"id":"sec-1","text":"Amazon EC2: خادم مستأجَر","level":2},{"id":"sec-2","text":"قراءة نوع الـ instance","level":3},{"id":"sec-3","text":"كيف تدفع","level":3},{"id":"sec-4","text":"AWS Lambda: كود يعمل عند وقوع الأحداث","level":2},{"id":"sec-5","text":"نموذج تكلفة Lambda","level":3},{"id":"sec-6","text":"الاختيار بينهما","level":2}],"takeaways":["اسم نوع الـ instance مثل m7g.large يرمّز العائلة والجيل والقدرات الإضافية والحجم، وكل خطوة في الحجم تضاعف عدد الـ vCPUs والذاكرة بما يقارب الضعف.","يناسب On-Demand الاستخدام القصير أو غير المتوقّع، وتناسب Savings Plans الاستخدام الثابت الذي تستطيع الالتزام به، ويناسب Spot العمل القابل للمقاطعة بخصم كبير.","الـ instance الموقوفة في EC2 توقف رسوم الحوسبة، لكن الـ volumes الخاصة بها في EBS وأي عنوان Elastic IP يبقى مرتبطًا بها تظل تُحتسب.","تحاسبك Lambda لكل طلب ولكل GB-second من وقت التشغيل، وتتقلّص إلى الصفر، وتناسب العمل القائم على الأحداث الذي ينتهي خلال 15 دقيقة.","اختر Lambda افتراضيًا للمهام الصغيرة القائمة على الأحداث، وEC2 حين تحتاج إلى عمليات طويلة التشغيل، أو تحكّم كامل في نظام التشغيل، أو حمل ثقيل ثابت."],"further":[{"title":"Amazon EC2 instance types","url":"https://docs.aws.amazon.com/ec2/latest/instancetypes/instance-types.html"},{"title":"Amazon EC2 billing and purchasing options","url":"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-purchasing-options.html"},{"title":"How Lambda works","url":"https://docs.aws.amazon.com/lambda/latest/dg/concepts-basics.html"},{"title":"AWS Lambda pricing","url":"https://aws.amazon.com/lambda/pricing/"}],"quiz":[{"q":"<p>ماذا يخبرك <code dir=\"ltr\">c7g.xlarge</code> مقارنةً بـ <code dir=\"ltr\">c7g.large</code>؟</p>","options":[{"text":"عائلة Graviton نفسها المحسّنة للحوسبة والجيل نفسه، مع ما يقارب ضعف الـ vCPUs والذاكرة.","why":"صحيح. تبقى الحروف والرقم كما هي، ويرتفع مقطع الحجم، ما يضاعف الموارد والسعر بما يقارب الضعف."},{"text":"جيل أحدث من العائلة نفسها بالموارد نفسها.","why":"الجيل هو الرقم (7 في الاسمين). والفرق هنا في الحجم فقط."},{"text":"الـ instance نفسها مع GPU إضافي مرفق.","why":"الـ GPUs تأتي من عائلات GPU مثل g وp. ومقطع الحجم لا يضيف أنواعًا من العتاد أبدًا."},{"text":"نسخة x86 من الـ instance العاملة بمعالج Graviton.","why":"حرف <code dir=\"ltr\">g</code> في <code dir=\"ltr\">c7g</code> يعني Graviton (Arm) في الاسمين. والمكافئ بمعمارية x86 سيُسقط الـ <code dir=\"ltr\">g</code>، مثل <code dir=\"ltr\">c7i</code>."}],"answer":0},{"q":"<p>يشغّل Lantern مهمة ليلية لأرشفة الملصقات تستغرق 40 دقيقة ويمكن إعادة تشغيلها بأمان إذا قوطعت. أيّ خيار يناسبها أكثر؟</p>","options":[{"text":"AWS Lambda، لأنها دائمًا أرخص خيار للحوسبة.","why":"استدعاء Lambda الواحد يستطيع العمل 15 دقيقة كحد أقصى، لذا لا تناسبه مهمة تستغرق 40 دقيقة دون تقسيمها."},{"text":"Savings Plan لثلاث سنوات على instance كبيرة تعمل طوال اليوم.","why":"الالتزام بـ 24 ساعة يوميًا لتغطية 40 دقيقة من العمل يعني أن تدفع ثمن 23 ساعة خاملة."},{"text":"instance بنظام On-Demand لا تعمل إلا أثناء المهمة، أو Spot Instance لأن المقاطعة مقبولة.","why":"صحيح. الدفع فقط أثناء تشغيل المهمة يناسب مهمة يومية قصيرة، وخصم Spot يناسب العمل القابل لإعادة التشغيل."}],"answer":2},{"q":"<p>أوقفت خادم الترحيل القديم الخاص بـ Lantern خلال عطلة نهاية الأسبوع. أيّ الرسوم تستمر؟</p>","options":[{"text":"لا شيء؛ الـ instance الموقوفة مجانية.","why":"رسوم الحوسبة وحدها تتوقف. أما التخزين المرفق وعناوين Elastic IP فموارد منفصلة لها فوترتها الخاصة."},{"text":"سعر الحوسبة بالساعة للـ instance، بسعر مخفّض لعطلة نهاية الأسبوع.","why":"لا يوجد لدى AWS تسعير خاص بعطلة نهاية الأسبوع، والـ instance الموقوفة لا تتراكم عليها رسوم حوسبة."},{"text":"نقل البيانات للزيارات التي كان الخادم سيستقبلها.","why":"الخادم الموقوف لا يستقبل أي زيارات، فلا يوجد نقل بيانات لاحتسابه."},{"text":"الـ volumes الخاصة بها في EBS وأي عنوان IPv4 عام يبقى مخصّصًا لها.","why":"صحيح. التخزين يبقى أثناء الإيقاف، وتحاسب AWS على عناوين IPv4 العامة بالساعة سواء كانت مستخدمة أم لا."}],"answer":3}],"exercise":{"kind":"choice","multiple":true,"options":["spot-batch","sp-steady","lambda-long","ondemand-trial","spot-db","ec2-idle-api"],"correct":["spot-batch","sp-steady","ondemand-trial"],"title":"طابِق أحمال العمل مع الحوسبة والتسعير","prompt":"<p>تسرد مراجعة لتكلفة Lantern ستة مقترحات. اختر كل مقترح يمثّل مطابقة <strong>معقولة</strong> بين طبيعة حمل العمل وخيار الحوسبة أو الشراء.</p>\n","hints":["اطرح ثلاثة أسئلة عن كل مقترح: كم يستمر تشغيله، وما مدى ثباته، وماذا يحدث إذا قوطع؟","Spot رخيص لأنه قد يختفي بإنذار مدته دقيقتان. أيّ أحمال العمل تتحمّل ذلك؟","لاستدعاء Lambda حد صارم مدته 15 دقيقة."],"explanation":"<p>يناسب Spot مهمة الأرشفة لأنها تُعاد بأمان، والخصم كبير. وتناسب Savings Plan الحد الأدنى الذي يعمل كل ساعة من ساعات العام، لأن الالتزام لا يكون ذا قيمة إلا حين يُستخدم بالكامل. وOn-Demand هو الصحيح لتجربة مدتها ثلاثة أسابيع: لا التزام لشيء قد لا يدوم. أما مهمة الـ 40 دقيقة فلا يمكن أن تعمل في استدعاء Lambda واحد. وقاعدة بيانات رئيسية على Spot ستتوقّف كلما استرجعت AWS السعة. وinstance تعمل دائمًا لـ API خامل معظم الوقت تدفع ثمن ساعات خمول لا تحتسبها Lambda.</p>\n","checkLabels":{},"optionText":{"spot-batch":{"text":"شغّل أرشفة الملصقات الليلية التي تستغرق 40 دقيقة، والتي تستطيع الاستئناف من نقطة حفظ، على Spot Instances.","why":"معقول. العمل الدفعي القابل للمقاطعة هو بالضبط ما وُجد Spot من أجله، وإعادة التشغيل لا تكلّف إلا دقائق."},"sp-steady":{"text":"غطِّ خادم الترحيل الذي يعمل دائمًا، والذي سيعمل طوال العام بحمل ثابت، بـ Compute Savings Plan لمدة سنة.","why":"معقول. الاستخدام الثابت المتوقّع هو حيث يؤتي الالتزام ثماره، لأن كل ساعة ملتزَم بها تُستخدم."},"lambda-long":{"text":"انقل مهمة الأرشفة التي تستغرق 40 دقيقة إلى استدعاء Lambda واحد للتوقف عن دفع ثمن خادم.","why":"غير معقول. استدعاء Lambda الواحد يعمل 15 دقيقة كحد أقصى، لذا ستتجاوز المهمة المهلة كل ليلة."},"ondemand-trial":{"text":"شغّل تجربة لمدة ثلاثة أسابيع لميزة بحث جديدة على instances بنظام On-Demand.","why":"معقول. الاستخدام القصير وغير المؤكّد لا يجب أن يحمل التزامًا لسنة أو ثلاث سنوات."},"spot-db":{"text":"استضف قاعدة بيانات PostgreSQL الرئيسية على Spot Instance لتوفير المال.","why":"غير معقول. لا يجب أن تختفي قاعدة البيانات بإنذار مدته دقيقتان؛ فاسترجاع السعة يعني توقّف الخدمة وربما ضياع عمليات كتابة."},"ec2-idle-api":{"text":"شغّل الـ API الخاص بتأكيد الحضور، الخامل معظم الليالي والمزدحم أثناء الفعاليات الكبيرة، على instance كبيرة تعمل دائمًا.","why":"غير معقول. تدفع ثمن ساعات الخمول وتظل معرّضًا لنفاد السعة في الذروة. أما Lambda فتتوسّع مع الطلبات ولا تحتسب شيئًا حين تكون خاملة."}}},"words":762,"readMinutes":4}