إنشاء واجهة برمجة تطبيقات قابلة للتطوير على مثيلات AWS Spot

أهلاً بكم! اسمي كيريل ، أنا مدير التكنولوجيا في Adapty. معظم تصميماتنا موجودة على AWS ، وسأتحدث اليوم عن كيفية خفض تكاليف الخادم بمقدار 3 أضعاف باستخدام مثيلات Spot في الإنتاج ، وكيفية قياسها تلقائيًا. أولاً ، سيكون هناك نظرة عامة حول كيفية عملها ، ثم إرشادات مفصلة للبدء.

ما هي مثيلات Spot؟

بقعة المثيلات هي خوادم لمستخدمي AWS الآخرين الذين هم في وضع الخمول حاليًا ويبيعونها بخصم كبير (يكتب Amazon ما يصل إلى 90٪ ، في تجربتنا ~ 3x ، يختلف حسب المنطقة ، AZ ونوع المثيل). الفرق الرئيسي بينهما هو أنه يمكن إيقاف تشغيله في أي وقت. لذلك ، اعتقدنا لفترة طويلة أنه من الطبيعي استخدامها لبيئات التطوير ، أو لمهام حساب شيء ما ، مع حفظ النتائج الوسيطة على S3 أو في قاعدة البيانات ، ولكن ليس للبيع. هناك حلول من جهات خارجية تسمح لك باستخدام البقع على prod ، ولكن هناك الكثير من العكازات لحالتنا ، لذلك لم ننفذها. يعمل النهج الموضح في المقالة بشكل كامل في إطار عمل وظائف AWS القياسية ، بدون نصوص برمجية إضافية ، أو crons ، وما إلى ذلك.

فيما يلي بعض لقطات الشاشة التي تعرض سجل الأسعار لـ Spot Instances.

m5.large في eu-west-1 (أيرلندا). استقر السعر في الغالب لمدة 3 أشهر ، مما وفر 2.9 مرة في الوقت الحالي.

إنشاء واجهة برمجة تطبيقات قابلة للتطوير على مثيلات AWS Spot

m5. large في منطقة شرق الولايات المتحدة 1 (شمال فيرجينيا). يتقلب السعر بشكل مستمر على مدار 3 أشهر ، حيث تتراوح المدخرات الحالية من 2.3x إلى 2.8x اعتمادًا على منطقة التوفر.

إنشاء واجهة برمجة تطبيقات قابلة للتطوير على مثيلات AWS Spot

t3. small في شرق الولايات المتحدة -1 (شمال فيرجينيا). السعر مستقر لمدة 3 أشهر ، يوفر حاليًا 3.4 أضعاف.

إنشاء واجهة برمجة تطبيقات قابلة للتطوير على مثيلات AWS Spot

هندسة الخدمة

يظهر الهيكل الأساسي للخدمة ، والذي سنتحدث عنه في هذه المقالة ، في الرسم التخطيطي أدناه.

إنشاء واجهة برمجة تطبيقات قابلة للتطوير على مثيلات AWS Spot

موازن تحميل التطبيق ← المجموعة المستهدفة EC2 ← خدمة الحاوية المرنة

يتم استخدام Application Load Balancer (ALB) كموازن ، والذي يرسل الطلبات إلى EC2 Target Group (TG). تكون TG مسؤولة عن فتح منافذ ALBs في المثيلات وربطها بمنافذ الحاويات Elastic Container Service (ECS). تُعد ECS نظيرًا لنظام Kubernetes في AWS ، والذي يتعامل مع إدارة حاويات Docker.

في حالة واحدة ، يمكن أن يكون هناك عدة حاويات قيد التشغيل بنفس المنافذ ، لذلك لا يمكننا إصلاحها. تخبر ECS TG أنها بدأت مهمة جديدة (في مصطلحات Kubernetes ، وهذا يسمى pod) ، وتتحقق من المنافذ المجانية في المثيل وتعين أحدها للمهمة التي يتم تشغيلها. أيضًا ، يتحقق TG بانتظام مما إذا كان المثيل وواجهة برمجة التطبيقات يعملان عليه باستخدام الفحص الصحي ، وإذا رأى أي مشاكل ، فإنه يتوقف عن إرسال الطلبات هناك.

مجموعات قياس EC2 التلقائية + موفرو سعة ECS

لا يُظهر الرسم البياني أعلاه خدمة EC2 Auto Scaling Groups (ASG). من الاسم يمكنك أن تفهم أنه مسؤول عن تحجيم الحالات. في الوقت نفسه ، حتى وقت قريب ، لم يكن لدى AWS قدرة مضمنة على إدارة عدد الأجهزة قيد التشغيل من ECS. سمحت ECS بتوسيع عدد المهام ، على سبيل المثال ، عن طريق استخدام وحدة المعالجة المركزية أو ذاكرة الوصول العشوائي أو عدد الطلبات. ولكن إذا احتلت المهام جميع الحالات المجانية ، فلن تظهر الأجهزة الجديدة تلقائيًا.

لقد تغير هذا مع ظهور مزودي قدرة ECS (ECS CP). يمكن الآن ربط كل خدمة في ECS بـ ASG ، وإذا كانت المهام لا تتناسب مع مثيلات التشغيل ، فسترتفع خدمات جديدة (ولكن ضمن حدود ASG المحددة). يعمل هذا أيضًا في الاتجاه المعاكس ، إذا رأى ECS CP حالات خاملة بدون مهام ، فسيعطي أمر ASG لإيقاف تشغيلها. لدى ECS CP القدرة على تحديد النسبة المئوية المستهدفة لتحميل المثيلات ، بحيث يكون عددًا معينًا من الأجهزة متاحًا دائمًا لتوسيع نطاق المهام بسرعة ، سأتحدث عن هذا بعد قليل.

قوالب إطلاق EC2

الخدمة الأخيرة التي سأتحدث عنها قبل الانتقال إلى وصف تفصيلي لإنشاء هذه البنية التحتية هي قوالب إطلاق EC2. يسمح لك بإنشاء نموذج تبدأ من خلاله جميع الأجهزة ، حتى لا تكرر ذلك في كل مرة من البداية. يمكنك هنا تحديد نوع الجهاز المراد تشغيله ومجموعة الأمان وصورة القرص والعديد من الخيارات الأخرى. يمكنك أيضًا تحديد بيانات المستخدم التي سيتم تحميلها إلى جميع المثيلات التي تم تشغيلها. يمكنك تشغيل البرامج النصية في بيانات المستخدم ، على سبيل المثال ، يمكنك تحرير محتويات ملف تكوين وكيل ECS.

أحد أهم خيارات التكوين في هذه المقالة هو ECS_ENABLE_SPOT_INSTANCE_DRAINING= صحيح. إذا تم تمكين هذا الإعداد ، فبمجرد تلقي ECS إشارة بأنه يتم التقاط مثيل Spot ، فإنه ينقل جميع المهام التي تعمل عليه إلى حالة الصرف. لن يتم تعيين أي مهام جديدة لهذا المثيل ، إذا كانت هناك مهام تريد طرحها عليه الآن ، فسيتم إلغاؤها. تتوقف الطلبات الواردة من الموازن أيضًا. يصل إشعار حذف المثيل قبل دقيقتين من الحدث الفعلي. لذلك ، إذا كانت خدمتك لا تؤدي مهامًا لأكثر من دقيقتين ولا تحفظ أي شيء على القرص ، فيمكنك استخدام مثيلات Spot دون فقدان البيانات.

حول القرص - AWS مؤخرًا مصنوع من الممكن استخدام نظام الملفات المرنة (EFS) مع ECS ، مع هذا المخطط حتى القرص لا يمثل عقبة ، لكننا لم نجربه ، لأننا من حيث المبدأ لا نحتاج إلى قرص لتخزين الحالة. بشكل افتراضي ، بعد تلقي SIGINT (يتم إرساله في الوقت الحالي يتم نقل المهمة إلى حالة Draining) ، سيتم إيقاف جميع المهام قيد التشغيل بعد 30 ثانية ، حتى لو لم تكتمل بعد ، يمكنك تغيير هذا الوقت باستخدام المعلمة ECS_CONTAINER_STOP_TIMEOUT. الشيء الرئيسي هو عدم تعريضها لأكثر من دقيقتين للسيارات الموضعية.

إنشاء الخدمة

ننتقل مباشرة إلى إنشاء الخدمة الموصوفة. في هذه العملية ، سوف أصف بالإضافة إلى ذلك بعض النقاط المفيدة التي لم يتم ذكرها أعلاه. بشكل عام ، هذه تعليمات خطوة بخطوة ، لكنني لن أعتبر بعض الحالات الأساسية جدًا أو ، على العكس من ذلك ، محددة للغاية. يتم تنفيذ جميع الإجراءات في وحدة التحكم المرئية في AWS ، ولكن يمكن إعادة تشغيلها برمجيًا باستخدام CloudFormation أو Terraform. في Adapty ، نستخدم Terraform.

قالب إطلاق EC2

في هذه الخدمة ، يتم إنشاء تكوين الأجهزة التي سيتم استخدامها. تتم إدارة القوالب في EC2 -> المثيلات -> قسم قوالب التشغيل.

صورة آلة أمازون (AMI) - حدد صورة القرص التي سيتم تشغيل جميع المثيلات بها. بالنسبة إلى ECS ، في معظم الحالات ، يجب عليك استخدام الصورة المحسّنة من Amazon. يتم تحديثه بانتظام ويحتوي على كل ما تحتاجه لتشغيل ECS. لمعرفة معرف الصورة الحالي ، انتقل إلى الصفحة AMIs المحسّنة من Amazon ECS، حدد المنطقة المستخدمة وانسخ معرف AMI لها. على سبيل المثال ، بالنسبة لمنطقة us-east-1 ، يكون المعرف الحالي وقت كتابة هذا المعرف هو ami-00c7c1cf5bdc913ed. يجب إدراج هذا المعرف في تحديد عنصر قيمة مخصصة.

نوع الطلب - حدد نوع المثيل. اختر أفضل ما يناسب مهمتك.

زوج المفاتيح (تسجيل الدخول) - حدد الشهادة التي يمكنك من خلالها الاتصال بالمثيل عبر SSH ، إذا لزم الأمر.

إعدادات الشبكة - تحديد إعدادات الشبكة. منصة الشبكات في معظم الحالات ، يجب أن تكون سحابة افتراضية خاصة (VPC). مجموعات الأمان - مجموعات الأمان لمثيلاتك. نظرًا لأننا سنستخدم الموازن قبل الطبعات ، فإنني أوصي بتحديد مجموعة هنا تسمح بالاتصالات الواردة فقط من الموازن. أي أنه سيكون لديك مجموعتا أمان ، واحدة للموازنة ، والتي تسمح بالاتصالات الواردة (الواردة) من كل مكان على المنفذين 2 (http) و 80 (https) ، والثانية للأجهزة ، والتي تسمح بالاتصالات الواردة على أي منافذ من مجموعة الموازن. يجب فتح الاتصالات الصادرة (الصادرة) في كلا المجموعتين عبر بروتوكول TCP لجميع المنافذ إلى جميع العناوين. يمكنك تقييد المنافذ والعناوين للاتصالات الصادرة ، ولكن بعد ذلك تحتاج إلى المراقبة المستمرة أنك لا تحاول الوصول إلى مكان ما على منفذ مغلق.

التخزين (الأحجام) - تحديد معلمات الأقراص للآلات. لا يمكن أن يكون حجم القرص أقل من ذلك المحدد في AMI ، لـ ECS Optimized - 30 جيجا بايت.

تفاصيل متقدمة - تحديد معلمات إضافية.

خيار الشراء - ما إذا كنا نريد شراء مثيلات Spot. نريد ذلك ، لكننا لن نحدد هذا المربع هنا ، سنقوم بتكوينه في مجموعة القياس التلقائي ، هناك المزيد من الخيارات.

ملف تعريف مثيل IAM - تحديد الدور الذي سيتم من خلاله إطلاق النسخ. لكي تعمل الأمثلة في ECS ، فإنها تحتاج إلى حقوق ، والتي تكمن عادةً في الدور ecsInstance: الدور. في بعض الحالات يمكن إنشاؤه ، إن لم يكن كذلك ، هنا تعليمات حول كيفية القيام بذلك. بعد الإنشاء ، نحدده في النموذج.
ثم هناك العديد من المعلمات ، في الأساس يمكنك ترك القيم الافتراضية في كل مكان ، ولكن لكل منها وصف واضح. أقوم دائمًا بتمكين المثيل المُحسَّن لـ EBS وخيارات T2 / T3 غير المحدودة إذا تم استخدامها قابل للانفجار حالات.

الوقت المستخدم - تحديد بيانات المستخدم. سنقوم بتحرير الملف /etc/ecs/ecs.config، والذي يحتوي على تكوين وكيل ECS.
مثال على الشكل الذي قد تبدو عليه بيانات المستخدم:

#!/bin/bash
echo ECS_CLUSTER=DemoApiClusterProd >> /etc/ecs/ecs.config
echo ECS_ENABLE_SPOT_INSTANCE_DRAINING=true >> /etc/ecs/ecs.config
echo ECS_CONTAINER_STOP_TIMEOUT=1m >> /etc/ecs/ecs.config
echo ECS_ENGINE_AUTH_TYPE=docker >> /etc/ecs/ecs.config
echo "ECS_ENGINE_AUTH_DATA={"registry.gitlab.com":{"username":"username","password":"password"}}" >> /etc/ecs/ecs.config

ECS_CLUSTER=DemoApiClusterProd - تشير المعلمة إلى أن المثيل ينتمي إلى مجموعة تحمل اسمًا معينًا ، أي أن هذه المجموعة ستكون قادرة على استضافة مهامها على هذا الخادم. لم ننشئ كتلة بعد ، لكننا سنستخدم هذا الاسم عند إنشائها.

ECS_ENABLE_SPOT_INSTANCE_DRAINING=true - تشير المعلمة إلى أنه عند تلقي إشارة حول إيقاف تشغيل مثيل Spot ، يجب نقل جميع المهام الموجودة عليها إلى حالة Draining.

ECS_CONTAINER_STOP_TIMEOUT=1m - تحدد المعلمة أنه بعد استقبال إشارة SIGINT ، يكون أمام جميع المهام دقيقة واحدة قبل قتلها.

ECS_ENGINE_AUTH_TYPE=docker - تشير المعلمة إلى أن مخطط عامل الإرساء يُستخدم كآلية ترخيص

ECS_ENGINE_AUTH_DATA=... - معلمات الاتصال بسجل الحاوية الخاصة ، حيث يتم تخزين صور Docker الخاصة بك. إذا كان عامًا ، فلا داعي لتحديد أي شيء.

في هذه المقالة ، سأستخدم صورة عامة من Docker Hub ، لذا حدد المعلمات ECS_ENGINE_AUTH_TYPE и ECS_ENGINE_AUTH_DATA لا حاجة.

من الجيد أن نعرف: يوصى بتحديث AMI بانتظام ، لأن الإصدارات الجديدة تُحدِّث إصدارات Docker ، و Linux ، ووكيل ECS ، وما إلى ذلك. لوضع ذلك في الاعتبار ، يمكنك إعداد الإخطارات حول إصدار الإصدارات الجديدة. يمكنك تلقي الإشعارات عبر البريد الإلكتروني والتحديث يدويًا ، أو يمكنك كتابة وظيفة Lambda التي ستنشئ تلقائيًا إصدارًا جديدًا من نموذج التشغيل باستخدام AMI محدث.

مجموعة التحجيم التلقائي EC2

تعتبر مجموعة Auto Scaling Group مسئولة عن تشغيل المثيلات وتوسيع نطاقها. تتم إدارة المجموعات في EC2 -> التحجيم التلقائي -> قسم مجموعات القياس التلقائي.

نموذج الإطلاق - حدد النموذج الذي تم إنشاؤه في الخطوة السابقة. اترك الإصدار الافتراضي.

خيارات الشراء وأنواع المثيل - تحديد أنواع مثيلات الكتلة. يستخدم Adhere to launch template نوع المثيل من Launch Template. يتيح لك الجمع بين خيارات الشراء وأنواع المثيلات إمكانية تكوين أنواع المثيلات بمرونة. سوف نستخدمه.

قاعدة اختيارية عند الطلب - عدد المثيلات العادية غير الموضعية التي ستعمل دائمًا.

النسبة المئوية عند الطلب فوق القاعدة - النسبة المئوية للمثيلات العادية والموقعية ، سيتم توزيع 50-50 بالتساوي ، وسيتم رفع 20-80 لكل مثيل عادي 4 نقاط. في هذا المثال ، سأشير إلى 50-50 ، لكن في الواقع ، غالبًا ما نفعل 20-80 ، في بعض الحالات 0-100.

أنواع المثيل - هنا يمكنك تحديد أنواع إضافية من المثيلات التي سيتم استخدامها في الكتلة. لم نستخدمها أبدًا لأنني لا أفهم حقًا معنى هذه القصة. ربما تكون حدود أنواع معينة من الحالات ، لكنها تزيد بسهولة من خلال الدعم. إذا كنت تعرف التطبيق ، فسأكون سعيدًا بقراءته في التعليقات)

إنشاء واجهة برمجة تطبيقات قابلة للتطوير على مثيلات AWS Spot

شبكة - إعدادات الشبكة ، حدد VPC والشبكات الفرعية للأجهزة ، في معظم الحالات يجب عليك تحديد جميع الشبكات الفرعية المتاحة.

تحميل موازنة - إعدادات الموازن ، لكننا سنفعلها بشكل منفصل ، ولا نلمس أي شيء هنا. فحوصات طبية سيتم أيضًا تهيئتها لاحقًا.

حجم المجموعة - تحديد حدود عدد الآلات في الكتلة والعدد المطلوب من الآلات في البداية. لن يكون عدد الأجهزة في المجموعة أبدًا أقل من الحد الأدنى المحدد وأكبر من الحد الأقصى ، حتى لو كان يجب تغيير المقاييس.

سياسات التوسع - معلمات التحجيم ، لكننا سنقوم بالتوسيع بناءً على تشغيل مهام ECS ، لذلك سنقوم بتهيئة القياس لاحقًا.

حماية حجم المثيل - حماية الحالات من الحذف عند تصغيرها. نقوم بتمكينه بحيث لا يحذف ASG جهازًا به مهام قيد التشغيل. سيعطل ECS Capacity Provider الحماية للحالات التي ليس بها مهام.

اضف اشارة - يمكنك تحديد العلامات للمثيلات (لهذا ، يجب تحديد خانة اختيار العلامات الجديدة للمثيلات). أوصي بتحديد علامة الاسم ، وبعد ذلك سيكون لجميع المثيلات التي يتم تشغيلها داخل المجموعة نفس الاسم ، ومن الملائم عرضها في وحدة التحكم.

إنشاء واجهة برمجة تطبيقات قابلة للتطوير على مثيلات AWS Spot

بعد إنشاء مجموعة ، افتحها وانتقل إلى قسم التكوينات المتقدمة ، ولهذا السبب لا تظهر جميع الخيارات في وحدة التحكم في مرحلة الإنشاء.

سياسات الإنهاء - القواعد التي تؤخذ في الاعتبار عند حذف الحالات. يتم تطبيقها بالترتيب. عادة ما نستخدم تلك الموجودة في الصورة أدناه. أولاً ، يتم حذف المثيلات التي تحتوي على أقدم قالب تشغيل (على سبيل المثال ، إذا قمنا بتحديث AMI ، فقد أنشأنا إصدارًا جديدًا ، ولكن تم تحويل جميع المثيلات إليه). ثم يتم تحديد الحالات الأقرب إلى وقت الخروج التالي من حيث الفواتير. ثم يتم اختيار الأقدم حسب تاريخ الإطلاق.

إنشاء واجهة برمجة تطبيقات قابلة للتطوير على مثيلات AWS Spot

من الجيد أن نعرف: لتحديث جميع الآلات في الكتلة ، فهي مريحة للاستخدام تحديث المثيل. قم بدمج هذا مع وظيفة Lambda من الخطوة السابقة ولديك نظام تحديث مثيل مؤتمت بالكامل. قبل ترقية جميع الأجهزة ، يجب عليك تعطيل حماية توسيع المثيل لجميع الطبعات في المجموعة. ليس إعدادًا في مجموعة ، ولكن الحماية من الأجهزة نفسها ، يتم ذلك في علامة التبويب إدارة المثيل.

موازن تحميل التطبيق والمجموعة المستهدفة EC2

يتم إنشاء الموازن في قسم EC2 → Load Balancers → Load Balancers. سنستخدم Application Load Balancer ، ويمكن العثور على مقارنة بين أنواع مختلفة من موازنات الأحمال على صفحة الخدمة.

المستمعين - من المنطقي إنشاء المنفذين 80 و 443 وإعادة التوجيه من 80 إلى 443 لاحقًا باستخدام قواعد الموازن.

مناطق التوفر - في معظم الحالات ، نختار جميع مناطق الوصول.

تكوين إعدادات الأمان - هنا تحدد شهادة SSL الخاصة بالموازن ، الخيار الأكثر ملاءمة هو اصنع شهادة في ACM. حول الاختلافات السياسة الأمنية يمكن قراءتها توثيق، يمكنك تركه محددًا بشكل افتراضي ELBSecurityPolicy-2016-08. بعد إنشاء الموازن ، ستراه اسم DNS، والتي تحتاج إلى تكوين CNAME لمجالك. على سبيل المثال ، هذا ما يبدو عليه في Cloudflare.

إنشاء واجهة برمجة تطبيقات قابلة للتطوير على مثيلات AWS Spot

مجموعة الأمن - قم بإنشاء أو تحديد مجموعة أمان للموازنة ، لقد كتبت المزيد عن هذا بشكل أعلى قليلاً في قالب تشغيل EC2 → قسم إعدادات الشبكة.

المجموعة المستهدفة - نقوم بإنشاء مجموعة تكون مسؤولة عن توجيه الطلبات من الموازن إلى الأجهزة والتحقق من توفرها لاستبدالها في حالة حدوث مشاكل. نوع الهدف يجب أن يكون مثيلاً ، بروتوكول и ميناء أي ، إذا كنت تستخدم HTTPS للتواصل بين الموازن والمثيلات ، فأنت بحاجة إلى تحميل شهادة لهم. في هذا المثال ، لن نفعل ذلك ، بل سنترك المنفذ 80 فقط.

فحوصات طبية - معلمات فحص صحة الخدمة. في الخدمة الحقيقية ، يجب أن يكون هذا طلبًا منفصلاً يقوم بتنفيذ أجزاء مهمة من منطق الأعمال ، على سبيل المثال ، سأترك الإعدادات الافتراضية. بعد ذلك ، يمكنك تحديد الفاصل الزمني للطلب ، والمهلة ، وأكواد النجاح ، وما إلى ذلك. في مثالنا ، سنحدد رموز النجاح 200-399 ، لأن صورة Docker التي سيتم استخدامها تُرجع الرمز 304.

إنشاء واجهة برمجة تطبيقات قابلة للتطوير على مثيلات AWS Spot

تسجيل الأهداف - يتم تحديد آلات المجموعة هنا ، ولكن في حالتنا ، ستتعامل شركة ECS مع هذا الأمر ، لذلك نتخطى هذه الخطوة فقط.

من الجيد أن نعرف: على مستوى الموازن ، يمكنك تمكين السجلات التي سيتم حفظها في S3 بشكل معين شكل. من هناك ، يمكن تصديرها إلى خدمات الجهات الخارجية للتحليلات ، أو يمكنك إجراء استعلامات SQL مباشرة على البيانات في S3 باستخدام مساعدة أثينا. إنه ملائم ويعمل بدون أي كود إضافي. أوصي أيضًا بإعداد حذف السجلات من حاوية S3 بعد فترة زمنية محددة.

تعريف مهمة ECS

في الخطوات السابقة ، أنشأنا كل ما يتعلق بالبنية التحتية للخدمة ، والآن ننتقل إلى وصف الحاويات التي سنقوم بتشغيلها. يتم ذلك في قسم ECS → Task Definitions.

نوع التشغيل التوافق - حدد EC2.

دور IAM لتنفيذ المهام - يختار ecsTaskExecutionRole. باستخدامه ، تتم كتابة السجلات ، ويتم منح الوصول إلى المتغيرات السرية ، وما إلى ذلك.

في قسم "تعريفات الحاوية" ، انقر على "إضافة حاوية".

صورة - اربط الصورة برمز المشروع ، في هذا المثال سأستخدم صورة عامة من Docker Hub bitnami / مثال عقدة: 0.0.1.

حدود الذاكرة - حدود الذاكرة للحاوية. حد صعب - حد صارم ، إذا تجاوزت الحاوية القيمة المحددة ، فسيتم تنفيذ أمر Docker kill ، وستموت الحاوية على الفور. حد مرن - حد ضعيف ، يمكن أن تتجاوز الحاوية القيمة المحددة ، ولكن ستؤخذ هذه المعلمة في الاعتبار عند وضع المهام على الأجهزة. على سبيل المثال ، إذا كان الجهاز يحتوي على 4 جيجابايت من ذاكرة الوصول العشوائي ، وكان الحد الناعم للحاوية هو 2048 ميجابايت ، فيمكن أن يكون لهذا الجهاز مهمتان قيد التشغيل كحد أقصى مع هذه الحاوية. في الواقع ، 2 جيجا بايت من ذاكرة الوصول العشوائي أقل بقليل من 4 ميجابايت ، والتي يمكن عرضها على علامة تبويب مثيلات ECS في المجموعة. لا يمكن أن يكون الحد المرن أكبر من الحد الصعب. من المهم أن نفهم أنه إذا كان هناك عدة حاويات في مهمة واحدة ، فسيتم تلخيص حدودها.

تعيينات المنفذ - في استضافة الميناء حدد 0 ، مما يعني أنه سيتم تعيين المنفذ ديناميكيًا ، وسيتم تعقبه بواسطة Target Group. ميناء الحاويات - غالبًا ما يتم تعيين المنفذ الذي يعمل عليه التطبيق الخاص بك في أمر التنفيذ ، أو يتم تعيينه في رمز التطبيق الخاص بك ، أو Dockerfile ، إلخ. على سبيل المثال ، نستخدم 3000 لأنه محدد في Dockerfile الصورة المستخدمة.

فحص طبي - معلمات فحص صحة الحاوية ، لا ينبغي الخلط بينها وبين تلك التي تم تكوينها في Target Group.

البيئة - إعدادات البيئة. وحدات CPU - على غرار حدود الذاكرة ، فقط حول المعالج. يتكون كل نواة معالج من 1024 وحدة ، لذلك إذا كان الخادم يحتوي على معالج ثنائي النواة ، وكانت قيمة الحاوية 512 ، فيمكن تشغيل 4 مهام مع هذه الحاوية على خادم واحد. تتوافق وحدات وحدة المعالجة المركزية دائمًا مع عدد النوى ، ولا يمكن أن تكون أقل قليلاً ، كما في حالة الذاكرة.

أمر - الأمر لبدء الخدمة داخل الحاوية ، يتم فصل جميع المعلمات بفاصلات. يمكن أن يكون gunicorn ، npm ، إلخ. إذا لم يتم تحديده ، فسيتم استخدام قيمة توجيه CMD من Dockerfile. حدد npm,start.

متغيرات البيئة - متغيرات بيئة الحاوية. يمكن أن يكون إما مجرد بيانات نصية أو متغيرات سرية من مدير الأسرار أو متجر المعلمة.

التخزين والتسجيل - سنقوم هنا بتهيئة التسجيل في سجلات CloudWatch (خدمة التسجيل من AWS). للقيام بذلك ، ما عليك سوى تمكين مربع الاختيار تكوين سجلات CloudWatch تلقائيًا. بعد إنشاء تعريف المهمة ، سيتم إنشاء مجموعة من السجلات تلقائيًا في CloudWatch. بشكل افتراضي ، يتم تخزين السجلات فيه إلى أجل غير مسمى ، أوصي بتغيير فترة الاحتفاظ من عدم انتهاء الصلاحية إلى الفترة المطلوبة. يتم ذلك في مجموعات CloudWatch Log ، تحتاج إلى النقر فوق الفترة الحالية واختيار واحدة جديدة.

إنشاء واجهة برمجة تطبيقات قابلة للتطوير على مثيلات AWS Spot

مجموعة ECS ومزود قدرة ECS

انتقل إلى قسم ECS → Clusters لإنشاء كتلة. نختار EC2 Linux + Networking كقالب.

اسم الكتلة - مهم جدًا ، نحن نصنع نفس الاسم هنا كما هو محدد في نموذج التشغيل في المعلمة ECS_CLUSTER، في حالتنا هذه - DemoApiClusterProd. ضع علامة في المربع إنشاء كتلة فارغة. اختياريًا ، يمكنك تمكين Container Insights لعرض مقاييس الخدمة في CloudWatch. إذا فعلت كل شيء بشكل صحيح ، فسترى في قسم مثيلات ECS الأجهزة التي تم إنشاؤها في مجموعة Auto Scaling.

إنشاء واجهة برمجة تطبيقات قابلة للتطوير على مثيلات AWS Spot

انتقل إلى علامة التبويب مزودو القدرات وإنشاء واحدة جديدة. اسمحوا لي أن أذكركم أن هناك حاجة لإدارة إنشاء وإغلاق الآلات ، اعتمادًا على عدد مهام ECS قيد التشغيل. من المهم ملاحظة أنه لا يمكن ربط مقدم الخدمة إلا بمجموعة واحدة.

مجموعة التحجيم التلقائي - حدد المجموعة التي تم إنشاؤها مسبقًا.

التحجيم المُدار - التمكين حتى يتمكن المزود من توسيع نطاق الخدمة.

القدرة المستهدفة٪ - ما هي النسبة المئوية لتحميل السيارات بالمهام التي نحتاجها. إذا حددت 100٪ ، فستظل جميع الأجهزة مشغولة دائمًا بالمهام قيد التشغيل. إذا حددت 50٪ ، فسيكون نصف السيارات دائمًا مجانيًا. في هذه الحالة ، إذا كانت هناك قفزة حادة في الحمل ، فستحصل سيارات الأجرة الجديدة على سيارات مجانية على الفور ، دون الحاجة إلى انتظار نشر الحالات.

إدارة حماية الإنهاء - تمكين ، تسمح هذه المعلمة للمزود بإزالة حماية المثيلات من الحذف. يحدث هذا في حالة عدم وجود مهام نشطة على الجهاز ويسمح بالسعة المستهدفة٪.

خدمة ECS وإعداد التحجيم

الخطوة الأخيرة :) لإنشاء خدمة ، تحتاج إلى الانتقال إلى المجموعة التي تم إنشاؤها مسبقًا في علامة التبويب الخدمات.

نوع الإطلاق - تحتاج إلى النقر فوق التبديل إلى استراتيجية مزود السعة وتحديد الموفر الذي تم إنشاؤه مسبقًا.

إنشاء واجهة برمجة تطبيقات قابلة للتطوير على مثيلات AWS Spot

تعريف المهمة - حدد تعريف المهمة الذي تم إنشاؤه مسبقًا ومراجعته.

اسم الخدمة - حتى لا يتم الخلط بيننا ، نحدد دائمًا نفس تعريف المهمة.

نوع الخدمة - دائما نسخة طبق الأصل.

عدد المهام - العدد المطلوب من المهام النشطة في الخدمة. يتم التحكم في هذه المعلمة عن طريق القياس ، ولكن لا يزال يتعين تحديدها.

النسبة الصحية الدنيا и النسبة المئوية القصوى - تحديد سلوك المهام أثناء النشر. تشير القيمتان الافتراضيتان 100 و 200 إلى أنه في وقت النشر ، سيزداد عدد المهام بمعامل اثنين ، ثم يعود إلى المهمة المطلوبة. إذا كانت هناك مهمة واحدة تعمل من أجلك ، الحد الأدنى = 1 ، والحد الأقصى = 0 ، فسيتم قتلها أثناء النشر ، وبعد ذلك سيتم رفع مهمة جديدة ، أي ستكون بسيطة. إذا نجحت مهمة واحدة ، الحد الأدنى = 100 ، الحد الأقصى = 1 ، فلن يحدث النشر على الإطلاق ، لأنه لا يمكن تقسيم مهمة واحدة إلى النصف أو زيادتها بمقدار مرة ونصف.

نوع النشر - إجازة تحديث المتداول.

قوالب التنسيب - قواعد وضع المهام على السيارات. الافتراضي هو AZ Balanced Spread - وهذا يعني من سيتم وضع كل مهمة جديدة في مثيل جديد حتى ترتفع الأجهزة في جميع مناطق الإتاحة. عادةً ما نقوم بتطبيق BinPack - CPU و Spread - AZ ، مع هذه السياسة ، يتم وضع المهام بأكبر قدر ممكن من الكثافة على جهاز واحد لكل وحدة معالجة مركزية. إذا كانت هناك حاجة إلى إنشاء جهاز جديد ، فسيتم إنشاؤه في منطقة توفر جديدة.

إنشاء واجهة برمجة تطبيقات قابلة للتطوير على مثيلات AWS Spot

نوع موازن التحميل - حدد Application Load Balancer.

دور خدمة IAM - يختار ecsServiceRole.

اسم موازن التحميل - حدد الموازن الذي تم إنشاؤه مسبقًا.

فترة السماح للفحص الصحي - وقفة قبل إجراء الفحوصات الصحية بعد طرح مهمة جديدة ، عادة ما نحدد 60 ثانية.

حاوية لتحميل الميزان - في عنصر اسم المجموعة المستهدفة ، حدد المجموعة التي تم إنشاؤها مسبقًا ، وسيتم ملء كل شيء تلقائيًا.

إنشاء واجهة برمجة تطبيقات قابلة للتطوير على مثيلات AWS Spot

التحجيم التلقائي للخدمة - معلمات تحجيم الخدمة. حدد تكوين القياس التلقائي للخدمة لضبط العدد المطلوب لخدمتك. قم بتعيين الحد الأدنى والحد الأقصى لعدد المهام عند القياس.

دور IAM لتوسيع نطاق الخدمة تلقائيًا - يختار AWSServiceRoleForApplicationAutoScaling_ECSService.

سياسات تحجيم المهام التلقائي - قواعد القياس. هناك نوعان:

  1. تتبع الهدف - تتبع القياس المستهدف (استخدام وحدة المعالجة المركزية / ذاكرة الوصول العشوائي أو عدد الطلبات لكل مهمة). على سبيل المثال ، نريد أن يكون متوسط ​​حمل وحدة المعالجة المركزية 85٪ ، وعندما ترتفع ، ستتم إضافة مهام جديدة حتى تصل إلى القيمة المستهدفة. إذا كان الحمل أقل ، فستتم إزالة المهام ، على العكس من ذلك ، إذا لم يتم تمكين الحماية ضد التصغير (تعطيل التحجيم).
  2. التحجيم التدريجي - رد فعل لحدث عشوائي. هنا يمكنك إعداد رد فعل لأي حدث (CloudWatch Alarm) ، عند حدوثه ، يمكنك إضافة أو إزالة العدد المحدد من المهام ، أو تحديد العدد الدقيق للمهام.

يمكن أن تحتوي الخدمة على العديد من قواعد القياس ، وقد يكون هذا مفيدًا ، والشيء الرئيسي هو التأكد من عدم تعارضها مع بعضها البعض.

اختتام

إذا اتبعت التعليمات واستخدمت نفس صورة Docker ، فيجب أن تقوم خدمتك بإرجاع هذه الصفحة.

إنشاء واجهة برمجة تطبيقات قابلة للتطوير على مثيلات AWS Spot

  1. لقد أنشأنا نموذجًا تبدأ من خلاله جميع الأجهزة الموجودة في الخدمة. تعلمنا أيضًا كيفية تحديث السيارات عند تغيير النموذج.
  2. لقد قمنا بإعداد معالجة إشارة إيقاف مثيل Spot ، لذلك في غضون دقيقة واحدة بعد استلامها ، تتم إزالة جميع المهام قيد التشغيل من الجهاز ، لذلك لا يتم فقد أي شيء أو مقاطعته.
  3. لقد رفعنا الموازن لتوزيع الحمل بالتساوي عبر الآلات.
  4. لقد أنشأنا خدمة تعمل على Spot Instances ، ونتيجة لذلك ، تم تقليل تكلفة الأجهزة بحوالي 3 مرات.
  5. قمنا بإعداد القياس التلقائي في كلا الاتجاهين للتعامل مع الزيادة في الأحمال ، ولكن في نفس الوقت لا ندفع مقابل وقت التوقف عن العمل.
  6. نحن نستخدم مزود السعة بحيث يدير التطبيق البنية التحتية (الآلات) وليس العكس.
  7. نحن رائعون.

إذا كان لديك ارتفاع في التحميل يمكن التنبؤ به ، على سبيل المثال ، إذا كنت تعلن في حملة بريد إلكتروني كبيرة ، فيمكنك ضبط القياس عن طريق الجدول الزمني.

يمكنك أيضًا القياس استنادًا إلى البيانات من أجزاء مختلفة من نظامك. على سبيل المثال ، لدينا وظيفة إرسال العروض الترويجية الفردية بالبريد مستخدمو تطبيقات الجوال. في بعض الأحيان يتم إرسال الحملة إلى مليون + شخص. هناك دائمًا زيادة كبيرة في طلبات واجهة برمجة التطبيقات بعد هذه المراسلات ، حيث يصل العديد من المستخدمين إلى التطبيق في نفس الوقت. لذلك إذا رأينا أن قائمة الانتظار لإرسال الدفعات الترويجية أصبحت أكثر بكثير من المؤشرات القياسية ، فيمكننا على الفور إطلاق العديد من الآلات والمهام الإضافية لتكون جاهزة للتحميل.

سأكون سعيدًا إذا ذكرت في التعليقات حالات مثيرة للاهتمام لاستخدام Spot Instances و ECS ، أو شيء متعلق بالتدرج.

قريباً ستكون هناك مقالات حول كيفية قيامنا بمعالجة الآلاف من الأحداث التحليلية في الثانية على مكدس في الغالب بدون خادم (بالمال) وكيف يتم نشر الخدمات باستخدام GitLab CI و Terraform Cloud.

اشترك معنا ، سيكون ممتعًا!

يمكن للمستخدمين المسجلين فقط المشاركة في الاستطلاع. تسجيل الدخول، من فضلك.

هل تستخدم مثيلات موضعية في الإنتاج؟

  • 22,2%نعم 6

  • 66,7%رقم 18

  • 11,1%لقد علمت عنهم من المقالة ، وأخطط لاستخدامها 3

صوت 27 مستخدمين. امتنع 5 مستخدما عن التصويت.

المصدر: www.habr.com

إضافة تعليق