AWS اسپاٹ مثالوں پر ایک قابل توسیع API بنانا

سب کو سلام! میرا نام کیرل ہے، میں Adapty میں CTO ہوں۔ ہمارا زیادہ تر فن تعمیر AWS پر ہے، اور آج میں اس بارے میں بات کروں گا کہ کس طرح ہم نے پروڈکشن ماحول میں اسپاٹ انسٹینس کا استعمال کرکے سرور کی لاگت کو 3 گنا کم کیا، اور ساتھ ہی ان کی آٹو اسکیلنگ کو کیسے ترتیب دیا جائے۔ پہلے اس کے کام کرنے کے طریقہ کار کا ایک جائزہ ہوگا، اور پھر شروع کرنے کے لیے تفصیلی ہدایات دی جائیں گی۔

سپاٹ مثالیں کیا ہیں؟

سپاٹ مثالیں دیگر AWS صارفین کے سرور ہیں جو فی الحال بیکار ہیں، اور وہ انہیں بڑی رعایت پر فروخت کرتے ہیں (ایمیزون 90% تک لکھتا ہے، ہمارے تجربے میں ~3x، علاقے، AZ اور مثال کی قسم کے لحاظ سے مختلف ہوتا ہے)۔ عام لوگوں سے ان کا بنیادی فرق یہ ہے کہ وہ کسی بھی وقت بند ہو سکتے ہیں۔ لہذا، ایک طویل عرصے سے ہم سمجھتے تھے کہ ان کا استعمال کنواری ماحول کے لیے، یا کسی چیز کا حساب لگانے کے کاموں کے لیے، درمیانی نتائج کے ساتھ S3 پر یا ڈیٹا بیس میں محفوظ کیا جاتا ہے، لیکن فروخت کے لیے نہیں۔ فریق ثالث کے حل ہیں جو آپ کو پروڈکشن پر دھبوں کا استعمال کرنے کی اجازت دیتے ہیں، لیکن ہمارے کیس کے لیے بہت سی بیساکھییں ہیں، اس لیے ہم نے ان پر عمل درآمد نہیں کیا۔ مضمون میں بیان کردہ نقطہ نظر مکمل طور پر معیاری AWS فعالیت کے اندر کام کرتا ہے، بغیر کسی اضافی اسکرپٹ، کراؤن وغیرہ کے۔

ذیل میں چند اسکرین شاٹس ہیں جو اسپاٹ مثالوں کے لیے قیمت کی تاریخ کو ظاہر کرتے ہیں۔

m5.large eu-west-1 (آئرلینڈ) کے علاقے میں۔ قیمت 3 ماہ سے زیادہ تر مستحکم رہی ہے، فی الحال 2.9x بچت ہے۔

AWS اسپاٹ مثالوں پر ایک قابل توسیع API بنانا

m5.large в регионе us-east-1 (N. Virginia). Цена постоянно меняется на протяжении 3 месяцев, в настоящий момент экономия от 2.3x до 2.8x в зависимости от зоны доступности.

AWS اسپاٹ مثالوں پر ایک قابل توسیع API بنانا

t3.small in US-east-1 ریجن (N. ورجینیا)۔ قیمت 3 ماہ سے مستحکم ہے، فی الحال 3.4x بچت ہے۔

AWS اسپاٹ مثالوں پر ایک قابل توسیع API بنانا

سروس فن تعمیر

اس سروس کا بنیادی فن تعمیر جس کے بارے میں ہم اس مضمون میں بات کریں گے، نیچے دیے گئے خاکے میں دکھایا گیا ہے۔

AWS اسپاٹ مثالوں پر ایک قابل توسیع API بنانا

Application Load Balancer → EC2 Target Group → Elastic Container Service

ایپلیکیشن لوڈ بیلنسر (ALB) کو بیلنسر کے طور پر استعمال کیا جاتا ہے، جو EC2 ٹارگٹ گروپ (TG) کو درخواستیں بھیجتا ہے۔ TG ALBs کی مثالوں پر بندرگاہوں کو کھولنے اور انہیں لچکدار کنٹینر سروس (ECS) کنٹینرز کی بندرگاہوں سے جوڑنے کا ذمہ دار ہے۔ ECS AWS میں Kubernetes کا ایک اینالاگ ہے، جو Docker کنٹینرز کا انتظام کرتا ہے۔

На одном инстансе может быть несколько работающих контейнеров с одинаковыми портами, поэтому мы не можем задать их фиксировано. ECS сообщает TG, что он запускает новый таск (в терминологии Kubernetes это называется под), она делает проверку свободных портов на инстансе и назначает один из них для запускаемого таска. Также TG регулярно проверяет, работает ли инстанс и апи на нём с помощью health check, и если видит какие-то проблемы, то перестаёт передавать туда запросы.

EC2 آٹو اسکیلنگ گروپس + ECS صلاحیت فراہم کرنے والے

В приведённой выше диаграмме не показан сервис EC2 Auto Scaling Groups (ASG). Из названия можно понять, что он отвечает за масштабирование инстансов. При этом до недавнего времени в AWS не было встроенной возможности управлять количеством запущенных машин из ECS. ECS позволял масштабировать количество тасков, например, по использованию CPU, RAM или количеству запросов. Но если таски занимали все свободные инстансы, то новые машины автоматически не поднимались.

ECS کیپیسیٹی پرووائیڈرز (ECS CP) کی آمد کے ساتھ یہ بدل گیا ہے۔ اب ECS میں ہر ایک سروس کو ASG کے ساتھ منسلک کیا جا سکتا ہے، اور اگر ٹاسک چلتے ہوئے مثالوں پر فٹ نہیں ہوتے ہیں، تو نئے کام اٹھائے جائیں گے (لیکن ASG کی قائم کردہ حدود کے اندر)۔ یہ مخالف سمت میں بھی کام کرتا ہے، اگر ECS CP بغیر کاموں کے بیکار مثالیں دیکھتا ہے، تو یہ ASG کو انہیں بند کرنے کا حکم دے گا۔ ECS CP میں مثال کے بوجھ کے ہدف کا فیصد بتانے کی صلاحیت ہے، تاکہ مشینوں کی ایک مخصوص تعداد کو فوری طور پر سکیلنگ کے کاموں کے لیے ہمیشہ مفت رہیں؛ میں اس کے بارے میں تھوڑی دیر بعد بات کروں گا۔

EC2 لانچ ٹیمپلیٹس

اس بنیادی ڈھانچے کو بنانے کے بارے میں تفصیل میں جانے سے پہلے میں جس آخری سروس کے بارے میں بات کروں گا وہ ہے EC2 لانچ ٹیمپلیٹس۔ یہ آپ کو ایک ٹیمپلیٹ بنانے کی اجازت دیتا ہے جس کے مطابق تمام مشینیں شروع ہو جائیں گی، تاکہ اسے ہر بار شروع سے نہ دہرایا جائے۔ یہاں آپ شروع کرنے کے لیے مشین کی قسم، سیکیورٹی گروپ، ڈسک امیج اور بہت سے دوسرے پیرامیٹرز کو منتخب کر سکتے ہیں۔ آپ صارف کے ڈیٹا کی بھی وضاحت کر سکتے ہیں جو تمام لانچ شدہ مثالوں پر اپ لوڈ کیا جائے گا۔ آپ صارف کے ڈیٹا میں اسکرپٹ چلا سکتے ہیں، مثال کے طور پر، آپ فائل کے مواد میں ترمیم کر سکتے ہیں۔ ای سی ایس ایجنٹ کنفیگریشنز.

اس مضمون کے لیے سب سے اہم کنفیگریشن پیرامیٹرز میں سے ایک ہے۔ ECS_ENABLE_SPOT_INSTANCE_DRAINING= سچ۔ اگر یہ پیرامیٹر فعال ہے، تو جیسے ہی ECS کو یہ اشارہ ملتا ہے کہ اسپاٹ انسٹینس کو ہٹایا جا رہا ہے، یہ ان تمام کاموں کو جو اس پر کام کرتے ہیں ڈریننگ سٹیٹس میں منتقل کر دیتا ہے۔ اس مثال کے لیے کوئی نیا کام تفویض نہیں کیا جائے گا؛ اگر ایسے کام ہیں جو ابھی اس کے لیے رول آؤٹ کرنا چاہتے ہیں، تو وہ منسوخ کر دیے جائیں گے۔ بیلنس سے درخواستیں بھی آنا بند ہو جاتی ہیں۔ مثال کو حذف کرنے کی اطلاع اصل واقعہ سے 2 منٹ پہلے آتی ہے۔ لہذا، اگر آپ کی سروس 2 منٹ سے زیادہ کام نہیں کرتی ہے اور ڈسک میں کچھ بھی محفوظ نہیں کرتی ہے، تو آپ ڈیٹا کھوئے بغیر اسپاٹ انسٹینس استعمال کر سکتے ہیں۔

ڈسک کے حوالے سے - حال ہی میں AWS کیا ECS کے ساتھ مل کر لچکدار فائل سسٹم (EFS) کا استعمال ممکن ہے؛ اس اسکیم کے ساتھ، یہاں تک کہ ڈسک بھی رکاوٹ نہیں ہے، لیکن ہم نے اس کی کوشش نہیں کی، کیونکہ اصولی طور پر ہمیں ریاست کو ذخیرہ کرنے کے لیے ڈسک کی ضرورت نہیں ہے۔ پہلے سے طے شدہ طور پر، SIGINT موصول ہونے کے بعد (جب ٹاسک کو ڈریننگ اسٹیٹس میں منتقل کیا جاتا ہے)، تمام چلنے والے کام 30 سیکنڈ کے بعد روک دیے جائیں گے، چاہے وہ ابھی تک مکمل نہ ہوئے ہوں؛ آپ پیرامیٹر کا استعمال کرتے ہوئے اس وقت کو تبدیل کر سکتے ہیں۔ ECS_CONTAINER_STOP_TIMEOUT. اہم بات یہ ہے کہ اسپاٹ مشینوں کے لیے اسے 2 منٹ سے زیادہ کے لیے سیٹ نہ کریں۔

Создание сервиса

آئیے بیان کردہ سروس بنانے کی طرف بڑھتے ہیں۔ اس عمل میں، میں مزید کئی مفید نکات بیان کروں گا جن کا اوپر ذکر نہیں کیا گیا۔ عام طور پر، یہ ایک مرحلہ وار ہدایات ہے، لیکن میں کچھ بہت ہی بنیادی یا اس کے برعکس، بہت مخصوص معاملات پر غور نہیں کروں گا۔ تمام کارروائیاں AWS بصری کنسول میں کی جاتی ہیں، لیکن CloudFormation یا Terraform کا استعمال کرتے ہوئے پروگرام کے لحاظ سے دوبارہ تیار کیا جا سکتا ہے۔ Adapty میں ہم Terraform استعمال کرتے ہیں۔

EC2 لانچ ٹیمپلیٹ

یہ سروس مشینوں کی ایک ترتیب بناتی ہے جو استعمال کی جائے گی۔ ٹیمپلیٹس کا انتظام EC2 -> مثالوں -> لانچ ٹیمپلیٹس سیکشن میں کیا جاتا ہے۔

Amazon machine image (AMI) - ڈسک امیج کی وضاحت کریں جس کے ساتھ تمام مثالیں شروع کی جائیں گی۔ ECS کے لیے، زیادہ تر صورتوں میں یہ Amazon کی طرف سے آپٹمائزڈ تصویر استعمال کرنے کے قابل ہے۔ یہ باقاعدگی سے اپ ڈیٹ ہوتا ہے اور ECS کے کام کرنے کے لیے ضروری ہر چیز پر مشتمل ہوتا ہے۔ موجودہ تصویر کی شناخت جاننے کے لیے، صفحہ پر جائیں۔ ایمیزون ای سی ایس کے لیے موزوں AMIs، وہ علاقہ منتخب کریں جسے آپ استعمال کر رہے ہیں اور اس کے لیے AMI ID کاپی کریں۔ مثال کے طور پر، US-east-1 خطے کے لیے، لکھنے کے وقت موجودہ ID ہے۔ ami-00c7c1cf5bdc913ed. اس ID کو اپنی مرضی کے مطابق ویلیو آئٹم کی وضاحت میں داخل کیا جانا چاہیے۔

مثال کی قسم — указываем тип инстанса. Выбираете тот, который лучше всего подходит для вашей задачи.

کلیدی جوڑا (لاگ ان) — ایک سرٹیفکیٹ کی وضاحت کریں جس کے ساتھ آپ SSH کے ذریعے مثال سے جڑ سکتے ہیں، اگر ضروری ہو۔

نیٹ ورک کی ترتیبات - نیٹ ورک کے پیرامیٹرز کی وضاحت کریں۔ نیٹ ورکنگ پلیٹ فارم زیادہ تر معاملات میں ورچوئل پرائیویٹ کلاؤڈ (VPC) ہونا چاہیے۔ سیکیورٹی گروپس — группы безопасности для ваших инстансов. Так как мы будем использовать балансировщик перед инстансами, то рекомендую указывать здесь группу, которая разрешает входящие соединения только с балансировщика. То есть у вас будет 2 группы безопасности, одна для балансировщика, которая разрешает входящие (inbound) соединения отовсюду по портам 80 (http) и 443 (https), а вторая для машин, которая разрешает входящие соединения по любым портам от группы балансировщика. Исходящие (outbound) соединения в обеих группах нужно открыть по TCP протоколу на все порты на все адреса. Можно ограничить порты и адреса для исходящих соединений, но тогда нужно постоянно мониторить, что вы не пытаетесь обратиться куда-то по закрытому порту.

Storage (volumes) — указываем параметры дисков для машин. Объём диска не может быть меньше того, что задан в AMI, для ECS Optimized — 30 GiB.

اعلی درجے کی تفصیلات - اضافی پیرامیٹرز کی وضاحت کریں۔

خریداری کا اختیار - چاہے ہم اسپاٹ انسٹینس خریدنا چاہتے ہیں۔ ہم چاہتے ہیں، لیکن ہم یہاں اس باکس کو چیک نہیں کریں گے؛ ہم اسے آٹو اسکیلنگ گروپ میں کنفیگر کریں گے، وہاں مزید آپشنز موجود ہیں۔

IAM مثال کا پروفائل - اس کردار کی نشاندہی کریں جس کے ساتھ مثالیں شروع کی جائیں گی۔ مثال کے طور پر ECS میں چلنے کے لیے، انہیں اجازتوں کی ضرورت ہوتی ہے، جو عام طور پر کردار میں پائی جاتی ہیں۔ ecsInstanceRole. بعض صورتوں میں اسے بنایا جا سکتا ہے، اگر نہیں، تو یہاں ہدایات یہ کیسے کرنا ہے. تخلیق کے بعد، ہم ٹیمپلیٹ میں اس کی نشاندہی کرتے ہیں۔
اس کے بعد بہت سے پیرامیٹرز ہیں، بنیادی طور پر آپ ہر جگہ ڈیفالٹ ویلیوز چھوڑ سکتے ہیں، لیکن ان میں سے ہر ایک کی وضاحت واضح ہے۔ میں ہمیشہ EBS-آپٹمائزڈ مثال اور T2/T3 لامحدود اختیارات کو فعال کرتا ہوں اگر استعمال کیا جائے پھٹنے کے قابل مثالیں

صارف کا ڈیٹا - صارف کے ڈیٹا کی نشاندہی کریں۔ ہم فائل میں ترمیم کریں گے۔ /etc/ecs/ecs.config، جس میں ECS ایجنٹ کنفیگریشن شامل ہے۔
Пример того, как может выглядеть user data:

#!/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 - پیرامیٹر بتاتا ہے کہ جب اسپاٹ انسٹینس کو آف کرنے کے لیے سگنل موصول ہوتا ہے، تو اس کے تمام کاموں کو ڈریننگ اسٹیٹس میں منتقل کیا جانا چاہیے۔

ECS_CONTAINER_STOP_TIMEOUT=1m - پیرامیٹر بتاتا ہے کہ SIGINT سگنل موصول ہونے کے بعد، تمام کاموں کو مارے جانے سے پہلے 1 منٹ ہوتا ہے۔

ECS_ENGINE_AUTH_TYPE=docker - پیرامیٹر اشارہ کرتا ہے کہ ڈوکر اسکیم کو اجازت کے طریقہ کار کے طور پر استعمال کیا جاتا ہے۔

ECS_ENGINE_AUTH_DATA=... - پرائیویٹ کنٹینر رجسٹری سے کنکشن کے پیرامیٹرز، جہاں آپ کی ڈاکر کی تصاویر محفوظ ہیں۔ اگر یہ عوامی ہے، تو آپ کو کچھ بھی بتانے کی ضرورت نہیں ہے۔

В рамках данной статьи я буду использовать публичный образ из Docker Hub, поэтому указывать параметры ECS_ENGINE_AUTH_TYPE и ECS_ENGINE_AUTH_DATA کوئی ضرورت نہیں.

جاننا اچھا ہے: AMI کو باقاعدگی سے اپ ڈیٹ کرنے کی سفارش کی جاتی ہے، کیونکہ نئے ورژن ڈوکر، لینکس، ای سی ایس ایجنٹ وغیرہ کے ورژن کو اپ ڈیٹ کرتے ہیں۔ اطلاعات مرتب کریں۔ о выходе новых версий. Вы можете получать уведомления на email и обновлять руками, а можете написать Lambda-функцию, которая будет автоматически создавать новую версию Launch Template с обновлённым AMI.

EC2 آٹو اسکیلنگ گروپ

آٹو اسکیلنگ گروپ مثالوں کو شروع کرنے اور اسکیلنگ کرنے کا ذمہ دار ہے۔ گروپس کا انتظام EC2 -> آٹو اسکیلنگ -> آٹو اسکیلنگ گروپس سیکشن میں کیا جاتا ہے۔

ٹیمپلیٹ لانچ کریں۔ — выбираем созданный на предыдущем шаге шаблон. Версию оставляем дефолтную.

خریداری کے اختیارات اور مثال کی اقسام - کلسٹر کے لیے مثالوں کی اقسام کی وضاحت کریں۔ ایڈور ٹو لانچ ٹیمپلیٹ لانچ ٹیمپلیٹ سے مثال کی قسم کا استعمال کرتا ہے۔ خریداری کے اختیارات اور مثال کی اقسام کو یکجا کرنا آپ کو مثال کی اقسام کو لچکدار طریقے سے ترتیب دینے کی اجازت دیتا ہے۔ ہم اسے استعمال کریں گے۔

اختیاری آن ڈیمانڈ بیس - باقاعدہ، غیر اسپاٹ مثالوں کی تعداد جو ہمیشہ کام کرے گی۔

آن ڈیمانڈ فیصد بیس سے اوپر - ریگولر اور اسپاٹ مثالوں کا فیصد تناسب، 50-50 کو یکساں طور پر تقسیم کیا جائے گا، 20-80 ہر ریگولر مثال کے لیے 4 اسپاٹ والے بڑھائے جائیں گے۔ اس مثال کے مقاصد کے لیے، میں 50-50 کی نشاندہی کروں گا، لیکن حقیقت میں ہم اکثر 20-80 کرتے ہیں، بعض صورتوں میں 0-100۔

مثال کی اقسام۔ — یہاں آپ اضافی اقسام کی مثالیں بتا سکتے ہیں جو کلسٹر میں استعمال ہوں گی۔ ہم نے اسے کبھی استعمال نہیں کیا کیونکہ میں واقعی کہانی کا مطلب نہیں سمجھتا ہوں۔ شاید یہ مخصوص قسم کی مثالوں کی حدود کی وجہ سے ہے، لیکن انہیں آسانی سے سپورٹ کے ذریعے بڑھایا جا سکتا ہے۔ اگر آپ ایپلی کیشن کو جانتے ہیں تو مجھے تبصرے میں اسے پڑھ کر خوشی ہوگی)

AWS اسپاٹ مثالوں پر ایک قابل توسیع API بنانا

نیٹ ورک — نیٹ ورک سیٹنگز، مشینوں کے لیے VPC اور سب نیٹس کو منتخب کریں، زیادہ تر معاملات میں آپ کو تمام دستیاب سب نیٹس کو منتخب کرنا چاہیے۔

وزن کو متوازن کرنا - بیلنس کی ترتیبات، لیکن ہم یہ الگ سے کریں گے، ہم یہاں کسی چیز کو ہاتھ نہیں لگائیں گے۔ صحت کی جانچ также будут настроены позже.

گروپ سائز - ہم کلسٹر میں مشینوں کی تعداد کی حد اور شروع میں مشینوں کی مطلوبہ تعداد کی نشاندہی کرتے ہیں۔ کلسٹر میں مشینوں کی تعداد کبھی بھی کم سے کم متعین اور زیادہ سے زیادہ سے زیادہ نہیں ہوگی، چاہے اسکیلنگ میٹرکس کے مطابق ہی کیوں نہ ہو۔

اسکیلنگ کی پالیسیاں - اسکیلنگ کے پیرامیٹرز، لیکن ہم چل رہے ECS کاموں کی بنیاد پر اسکیل کریں گے، لہذا ہم بعد میں اسکیلنگ کو ترتیب دیں گے۔

مثال کے پیمانے پر تحفظ - اسکیل کرتے وقت حذف ہونے سے مثالوں کا تحفظ۔ ہم اسے فعال کرتے ہیں تاکہ ASG اس مشین کو حذف نہ کرے جس میں کام چل رہے ہیں۔ ای سی ایس کیپیسیٹی پرووائیڈر ان مثالوں کے لیے تحفظ کو غیر فعال کر دے گا جن کے پاس کام نہیں ہیں۔

ٹیگ شامل کریں — можно указать теги для инстансов (для этого должна стоять галочка Tag new instances). Рекомендую указать тег Name, тогда все инстансы, которые запускаются в рамках группы, будут одинаково называться, их удобно смотреть в консоли.

AWS اسپاٹ مثالوں پر ایک قابل توسیع API بنانا

گروپ بنانے کے بعد اسے کھولیں اور Advanced configurations کے سیکشن میں جائیں۔ تخلیق کے مرحلے پر کنسول میں تمام آپشنز کیوں نظر نہیں آتے۔

ختم کرنے کی پالیسیاں - وہ قواعد جو مثالوں کو حذف کرتے وقت مدنظر رکھے جاتے ہیں۔ ان کا اطلاق ترتیب سے ہوتا ہے۔ ہم عام طور پر نیچے دی گئی تصویر میں استعمال کرتے ہیں۔ سب سے پہلے، قدیم ترین لانچ ٹیمپلیٹ والی مثالیں حذف ہو جاتی ہیں (مثال کے طور پر، اگر ہم نے AMI کو اپ ڈیٹ کیا، تو ہم نے ایک نیا ورژن بنایا، لیکن تمام مثالیں اس پر سوئچ کرنے میں کامیاب ہوئیں)۔ پھر اگلے بلنگ گھنٹے کے قریب ترین مثالوں کا انتخاب کیا جاتا ہے۔ اور پھر سب سے پرانے کو لانچ کی تاریخ کی بنیاد پر منتخب کیا جاتا ہے۔

AWS اسپاٹ مثالوں پر ایک قابل توسیع API بنانا

جاننا اچھا ہے: تمام مشینوں کو کلسٹر میں اپ ڈیٹ کرنے کے لیے، استعمال میں آسان مثال کے طور پر ریفریش کریں۔. اگر آپ اسے پچھلے مرحلے سے لیمبڈا فنکشن کے ساتھ جوڑتے ہیں، تو آپ کے پاس ایک مکمل خودکار مثال اپ ڈیٹ سسٹم ہوگا۔ تمام مشینوں کو اپ ڈیٹ کرنے سے پہلے، آپ کو گروپ میں موجود تمام مثالوں کے لیے انسٹینس اسکیل ان پروٹیکشن کو غیر فعال کرنا چاہیے۔ گروپ میں کنفیگریشن نہیں بلکہ خود مشینوں سے تحفظ، یہ انسٹینس مینجمنٹ ٹیب پر کیا جاتا ہے۔

ایپلیکیشن لوڈ بیلنسر اور EC2 ٹارگٹ گروپ

Балансировщик создаётся в разделе EC2 → Load Balancing → Load Balancers. Мы будем использовать Application Load Balancer, сравнение разных типов балансировщиков можно прочитать на سروس صفحہ.

سنا - بندرگاہوں کو 80 اور 443 بنانا اور بعد میں بیلنسر رولز کا استعمال کرتے ہوئے 80 سے 443 تک ری ڈائریکٹ کرنا سمجھ میں آتا ہے۔

دستیابی زون — زیادہ تر معاملات میں، ہم ہر ایک کے لیے قابل رسائی زون منتخب کرتے ہیں۔

سیکیورٹی کی ترتیبات کو ترتیب دیں۔ - بیلنسر کے لیے SSL سرٹیفکیٹ یہاں اشارہ کیا گیا ہے، سب سے آسان آپشن ہے۔ сделать сертификат ACM میں اختلافات کے بارے میں سیکورٹی پالیسی میں پڑھا جا سکتا ہے۔ دستاویزات، آپ اسے بطور ڈیفالٹ منتخب چھوڑ سکتے ہیں۔ ELBSecurityPolicy-2016-08. بیلنسر بنانے کے بعد، آپ اسے دیکھیں گے DNS نامجو آپ کو اپنے ڈومین کے لیے CNAME کو کنفیگر کرنے کی ضرورت ہے۔ مثال کے طور پر، یہ Cloudflare میں اس طرح نظر آتا ہے۔

AWS اسپاٹ مثالوں پر ایک قابل توسیع API بنانا

سیکورٹی گروپ - بیلنسر کے لیے ایک سیکیورٹی گروپ بنائیں یا منتخب کریں، میں نے اس کے بارے میں مزید EC2 لانچ ٹیمپلیٹ → نیٹ ورک سیٹنگز سیکشن میں لکھا ہے۔

ھدف گروپ - ہم ایک گروپ بناتے ہیں جو بیلنسر سے مشینوں تک درخواستوں کو روٹ کرنے اور ان کی دستیابی کو جانچنے کے لیے ذمہ دار ہے تاکہ مسائل کی صورت میں انہیں تبدیل کیا جا سکے۔ ہدف کی قسم مثال ہونی چاہیے، پروٹوکول и پورٹ کوئی بھی، اگر آپ بیلنسر اور مثالوں کے درمیان مواصلت کے لیے HTTPS استعمال کرتے ہیں، تو آپ کو ان پر ایک سرٹیفکیٹ اپ لوڈ کرنے کی ضرورت ہے۔ اس مثال کے مقاصد کے لیے، ہم ایسا نہیں کریں گے، ہم صرف پورٹ 80 کو چھوڑ دیں گے۔

صحت کی جانچ - سروس کی فعالیت کو جانچنے کے لیے پیرامیٹرز۔ ایک حقیقی سروس میں، یہ ایک علیحدہ درخواست ہونی چاہیے جو کاروباری منطق کے اہم حصوں کو نافذ کرتی ہے؛ اس مثال کے مقاصد کے لیے، میں پہلے سے طے شدہ ترتیبات کو چھوڑ دوں گا۔ اس کے بعد، آپ درخواست کا وقفہ، ٹائم آؤٹ، کامیابی کے کوڈز وغیرہ کو منتخب کر سکتے ہیں۔ ہماری مثال میں، ہم کامیابی کے کوڈز 200-399 کی نشاندہی کریں گے، کیونکہ ڈوکر امیج جو استعمال کی جائے گی وہ 304 کوڈ لوٹاتا ہے۔

AWS اسپاٹ مثالوں پر ایک قابل توسیع API بنانا

اہداف کو رجسٹر کریں۔ — یہاں گروپ کے لیے کاروں کا انتخاب کیا گیا ہے، لیکن ہمارے معاملے میں یہ ECS کے ذریعے کیا جائے گا، اس لیے ہم صرف اس مرحلے کو چھوڑ دیتے ہیں۔

جاننا اچھا ہے: بیلنسر کی سطح پر آپ لاگ ان کو فعال کر سکتے ہیں جو S3 میں ایک مخصوص میں محفوظ کیے جائیں گے۔ فارمیٹ. وہاں سے انہیں تجزیات کے لیے فریق ثالث کی خدمات میں برآمد کیا جا سکتا ہے، یا آپ S3 میں ڈیٹا پر براہ راست ایس کیو ایل کے سوالات کر سکتے ہیں۔ ایتھینا کا استعمال کرتے ہوئے. Это удобно и работает без какого-то дополнительного кода. Также рекомендую настроить удаление логов из бакета S3 по истечение заданного периода времени.

ECS Task Definition

پچھلے مراحل میں، ہم نے سروس کے بنیادی ڈھانچے سے متعلق ہر چیز بنائی ہے؛ اب ہم ان کنٹینرز کی وضاحت کرتے ہیں جنہیں ہم لانچ کریں گے۔ یہ ECS → Task Definitions سیکشن میں کیا جاتا ہے۔

Launch type compatibility — выбираем EC2.

ٹاسک ایگزیکیوشن IAM رول --.منتخب کرنا ecsTaskExecutionRole. اس کے استعمال سے نوشتہ جات لکھے جاتے ہیں، خفیہ متغیرات تک رسائی دی جاتی ہے، وغیرہ۔

کنٹینر کی تعریف سیکشن میں، کنٹینر شامل کریں پر کلک کریں۔

تصویر — ссылка на образ с кодом проекта, в рамках данного примера я буду использовать публичный образ с Docker Hub bitnami/node-example:0.0.1.

یادداشت کی حدود - کنٹینر کے لئے میموری کی حدود۔ سخت حد — жёсткий лимит, если контейнер выйдет за указанное значение, то выполнится команда docker kill, контейнер сразу же умрёт. نرم حد - نرم حد، کنٹینر مخصوص قیمت سے آگے جا سکتا ہے، لیکن مشینوں پر کام کرتے وقت اس پیرامیٹر کو مدنظر رکھا جائے گا۔ مثال کے طور پر، اگر ایک مشین میں 4 GiB RAM ہے، اور ایک کنٹینر کی نرم حد 2048 MiB ہے، تو اس مشین میں اس کنٹینر کے ساتھ زیادہ سے زیادہ 2 چلنے والے کام ہو سکتے ہیں۔ حقیقت میں، 4 GiB RAM 4096 MiB سے تھوڑی کم ہے، اسے کلسٹر میں ECS Instances ٹیب پر دیکھا جا سکتا ہے۔ نرم حد سخت حد سے زیادہ نہیں ہو سکتی۔ یہ سمجھنا ضروری ہے کہ اگر ایک کام میں کئی کنٹینرز ہیں، تو ان کی حدود کا خلاصہ کیا جاتا ہے۔

پورٹ میپنگ - میزبان بندرگاہ ہم 0 کی نشاندہی کرتے ہیں، اس کا مطلب ہے کہ بندرگاہ کو متحرک طور پر تفویض کیا جائے گا اور ہدف گروپ کی طرف سے اس کی نگرانی کی جائے گی۔ کنٹینر پورٹ — وہ پورٹ جس پر آپ کی ایپلیکیشن چلتی ہے اکثر ایگزیکیوشن کمانڈ میں بتائی جاتی ہے، یا آپ کے ایپلیکیشن کوڈ، ڈاکر فائل وغیرہ میں تفویض کی جاتی ہے۔ ہماری مثال کے لیے ہم 3000 استعمال کریں گے کیونکہ یہ درج ہے۔ ڈاکر فائل используемого образа.

صحت کی جانچ کنٹینر ہیلتھ چیک پیرامیٹرز، ٹارگٹ گروپ میں کنفیگر کیے گئے ایک کے ساتھ الجھن میں نہ پڑیں۔

ماحولیات - ماحول کی ترتیبات۔ CPU units - میموری کی حدود کی طرح، صرف پروسیسر کے بارے میں۔ ہر پروسیسر کور 1024 یونٹس ہے، لہذا اگر سرور میں ڈوئل کور پروسیسر ہے اور کنٹینر 512 پر سیٹ ہے، تو اس کنٹینر کے ساتھ 4 کام ایک سرور پر شروع کیے جا سکتے ہیں۔ CPU یونٹس ہمیشہ cores کی تعداد کے مطابق ہوتے ہیں؛ ان میں سے کچھ کم نہیں ہوسکتے، جیسا کہ میموری کا معاملہ ہے۔

کمان - کنٹینر کے اندر سروس شروع کرنے کے لیے ایک کمانڈ، تمام پیرامیٹرز کوما سے الگ کر کے بتائے گئے ہیں۔ یہ گنی کارن، این پی ایم، وغیرہ ہو سکتا ہے۔ اگر متعین نہیں کیا گیا ہے تو، Dockerfile سے CMD ہدایت کی قدر استعمال کی جائے گی۔ ہم اشارہ کرتے ہیں۔ npm,start.

ماحولیاتی تغیرات - کنٹینر ماحولیاتی متغیرات۔ یہ یا تو سادہ ٹیکسٹ ڈیٹا ہو سکتا ہے یا اس سے خفیہ متغیرات سیکرٹس مینیجر یا پیرامیٹر اسٹور.

اسٹوریج اور لاگنگ — здесь настроим логирование в CloudWatch Logs (сервис для логов от AWS). Для этого достаточно включить галочку Auto-configure CloudWatch Logs. После создания Task Definition автоматически создастся группа логов в CloudWatch. По умолчанию логи в ней хранятся бесконечно, рекомендую изменить Retention period с Never Expire на требуемый срок. Это делается в CloudWatch Log groups, надо кликнуть на текущий период и выбрать новый.

AWS اسپاٹ مثالوں پر ایک قابل توسیع API بنانا

ای سی ایس کلسٹر اور ای سی ایس صلاحیت فراہم کرنے والا

کلسٹر بنانے کے لیے ECS → کلسٹرز سیکشن پر جائیں۔ ہم ٹیمپلیٹ کے طور پر EC2 لینکس + نیٹ ورکنگ کو منتخب کرتے ہیں۔

کلسٹر کا نام — очень важно, делаем здесь такое же имя, как указано в Launch Template в параметре ECS_CLUSTERہمارے معاملے میں - DemoApiClusterProd. ایک خالی کلسٹر بنائیں چیک باکس کو چیک کریں۔ اختیاری طور پر، آپ CloudWatch میں خدمات کے میٹرکس دیکھنے کے لیے کنٹینر انسائٹس کو فعال کر سکتے ہیں۔ اگر آپ نے سب کچھ صحیح طریقے سے کیا ہے، تو پھر ECS انسٹینس سیکشن میں آپ کو وہ مشینیں نظر آئیں گی جو آٹو اسکیلنگ گروپ میں بنائی گئی تھیں۔

AWS اسپاٹ مثالوں پر ایک قابل توسیع API بنانا

ٹیب پر جائیں۔ صلاحیت فراہم کرنے والے اور ایک نیا بنائیں. میں آپ کو یاد دلاتا ہوں کہ مشینوں کی تخلیق اور بندش کو کنٹرول کرنے کے لیے ای سی ایس کے چلنے والے کاموں کی تعداد پر منحصر ہے۔ یہ نوٹ کرنا ضروری ہے کہ فراہم کنندہ صرف ایک گروپ کو تفویض کیا جا سکتا ہے۔

آٹو اسکیلنگ گروپ - پہلے سے بنائے گئے گروپ کو منتخب کریں۔

منظم اسکیلنگ - اسے فعال کریں تاکہ فراہم کنندہ سروس کی پیمائش کر سکے۔

Target capacity % - ہمیں کتنے فیصد کاموں سے لدی مشینوں کی ضرورت ہے۔ اگر آپ 100% بتاتے ہیں، تو تمام مشینیں ہمیشہ چلانے والے کاموں میں مصروف رہیں گی۔ اگر آپ 50% بتاتے ہیں، تو آدھی کاریں ہمیشہ مفت رہیں گی۔ اس صورت میں، اگر بوجھ میں تیز چھلانگ لگتی ہے، تو نئی ٹیکسیاں فوری طور پر مفت کاروں تک پہنچ جائیں گی، بغیر کسی مثال کے تعینات کیے جانے کا انتظار کیے بغیر۔

ٹرمنیشن پروٹیکشن کا انتظام — включаем, этот параметр разрешает провайдеру убирать защиту инстансов от удаления. Это происходит, когда на машине нет активных тасков и позволяет Target capacity %.

ای سی ایس سروس اور اسکیلنگ سیٹ اپ

آخری مرحلہ :) سروس بنانے کے لیے، آپ کو سروسز ٹیب پر پہلے سے بنائے گئے کلسٹر میں جانا ہوگا۔

لانچ کی قسم - آپ کو صلاحیت فراہم کرنے والے کی حکمت عملی پر سوئچ پر کلک کرنے اور پہلے سے بنائے گئے فراہم کنندگان کو منتخب کرنے کی ضرورت ہے۔

AWS اسپاٹ مثالوں پر ایک قابل توسیع API بنانا

ٹاسک کی تعریف - پہلے سے بنائی گئی ٹاسک ڈیفینیشن اور اس پر نظر ثانی کا انتخاب کریں۔

سروس کا نام - الجھن سے بچنے کے لیے، ہم ہمیشہ ٹاسک ڈیفینیشن کی طرح اشارہ کرتے ہیں۔

سروس کی قسم - ہمیشہ نقل۔

کاموں کی تعداد - خدمت میں فعال کاموں کی مطلوبہ تعداد۔ اس پیرامیٹر کو اسکیلنگ کے ذریعے کنٹرول کیا جاتا ہے، لیکن پھر بھی اس کی وضاحت ہونی چاہیے۔

Minimum healthy percent и زیادہ سے زیادہ فیصد - تعیناتی کے دوران کاموں کے رویے کا تعین کریں۔ پہلے سے طے شدہ قدریں 100 اور 200 ہیں، جس سے ظاہر ہوتا ہے کہ تعیناتی کے وقت کاموں کی تعداد کئی گنا بڑھ جائے گی، اور پھر مطلوبہ قدر پر واپس آجائے گی۔ اگر آپ کے پاس 1 ٹاسک چل رہا ہے، min=0، اور max=100، تو تعیناتی کے دوران اسے مار دیا جائے گا، اور اس کے بعد ایک نیا اٹھایا جائے گا، یعنی یہ ڈاؤن ٹائم ہوگا۔ اگر 1 ٹاسک چل رہا ہے، min=50، max=150، تو تعیناتی بالکل نہیں ہوگی، کیونکہ 1 ٹاسک کو نصف میں تقسیم یا ڈیڑھ گنا بڑھایا نہیں جا سکتا۔

تعیناتی کی قسم - رولنگ اپ ڈیٹ چھوڑ دیں۔

پلیسمنٹ ٹیمپلیٹس - مشینوں پر کام رکھنے کے اصول۔ پہلے سے طے شدہ AZ بیلنسڈ اسپریڈ ہے - اس کا مطلب ہے کہ ہر نیا کام اس وقت تک ایک نئی مثال پر رکھا جائے گا جب تک کہ تمام دستیابی زونز میں مشینیں نہیں بڑھ جاتیں۔ ہم عام طور پر BinPack - CPU اور Spread - AZ کرتے ہیں؛ اس پالیسی کے ساتھ، کاموں کو ہر CPU پر ایک مشین پر ہر ممکن حد تک گھنے رکھا جاتا ہے۔ اگر ایک نئی مشین بنانا ضروری ہو تو اسے ایک نئے دستیابی زون میں بنایا جاتا ہے۔

AWS اسپاٹ مثالوں پر ایک قابل توسیع API بنانا

لوڈ بیلنس کی قسم - ایپلیکیشن لوڈ بیلنس کو منتخب کریں۔

سروس IAM کردار --.منتخب کرنا ecsServiceRole.

لوڈ بیلنس کا نام - پہلے سے بنایا ہوا بیلنس منتخب کریں۔

صحت کی جانچ کی رعایتی مدت — пауза перед выполнением проверок работоспособности после выкатки нового таска, мы обычно ставим 60 секунд.

Container to load balance — ہدف گروپ کے نام کے آئٹم میں، پہلے سے بنائے گئے گروپ کو منتخب کریں، اور سب کچھ خود بخود بھر جائے گا۔

AWS اسپاٹ مثالوں پر ایک قابل توسیع API بنانا

سروس آٹو اسکیلنگ - سروس اسکیلنگ کے پیرامیٹرز۔ اپنی سروس کی مطلوبہ تعداد کو ایڈجسٹ کرنے کے لیے کنفیگر سروس آٹو اسکیلنگ کو منتخب کریں۔ ہم اسکیلنگ کرتے وقت کاموں کی کم سے کم اور زیادہ سے زیادہ تعداد مقرر کرتے ہیں۔

سروس آٹو اسکیلنگ کے لیے IAM کا کردار --.منتخب کرنا AWSServiceRoleForApplicationAutoScaling_ECSService.

خودکار ٹاسک اسکیلنگ کی پالیسیاں - پیمانے کے لئے قواعد 2 قسمیں ہیں:

  1. ہدف سے باخبر رہنا — ٹریکنگ ٹارگٹ میٹرکس (CPU/RAM کا استعمال یا ہر کام کے لیے درخواستوں کی تعداد)۔ مثال کے طور پر، ہم چاہتے ہیں کہ پروسیسر کا اوسط بوجھ 85% ہو، جب یہ زیادہ ہو جائے گا، نئے کام اس وقت تک شامل کیے جائیں گے جب تک کہ یہ ہدف کی قیمت تک نہ پہنچ جائے۔ اگر بوجھ کم ہے، تو کاموں کو ہٹا دیا جائے گا، اس کے برعکس، جب تک کہ اسکیلنگ ڈاون کے خلاف تحفظ کو فعال نہ کیا جائے (اسکیل ان کو غیر فعال کریں۔).
  2. قدموں کی پیمائش - من مانی واقعہ پر ردعمل۔ یہاں آپ کسی بھی واقعہ (کلاؤڈ واچ الارم) کے رد عمل کو ترتیب دے سکتے ہیں، جب ایسا ہوتا ہے، آپ کاموں کی مخصوص تعداد کو شامل یا ہٹا سکتے ہیں، یا کاموں کی صحیح تعداد بتا سکتے ہیں۔

ایک سروس میں اسکیلنگ کے کئی اصول ہوسکتے ہیں، یہ کارآمد ثابت ہوسکتے ہیں، اہم بات یہ یقینی بنانا ہے کہ وہ ایک دوسرے سے متصادم نہ ہوں۔

حاصل يہ ہوا

اگر آپ نے ہدایات پر عمل کیا ہے اور وہی ڈوکر امیج استعمال کیا ہے، تو آپ کی سروس کو اس جیسا صفحہ واپس کرنا چاہیے۔

AWS اسپاٹ مثالوں پر ایک قابل توسیع API بنانا

  1. Мы создали шаблон, по которому запускаются все машины в сервисе. Мы также научились обновлять машины при изменении шаблона.
  2. ہم نے اسپاٹ انسٹینس سٹاپ سگنل کی پروسیسنگ کو کنفیگر کیا ہے، اس لیے اسے موصول ہونے کے ایک منٹ کے اندر، تمام چلنے والے کاموں کو مشین سے ہٹا دیا جاتا ہے، اس لیے کوئی چیز ضائع یا رکاوٹ نہیں بنتی ہے۔
  3. Мы подняли балансировщик, чтобы равномерно распределять нагрузку по машинам.
  4. Мы создали сервис, который работает на спотовых инстансах, за счёт этого сокращаются расходы на машины примерно в 3 раза.
  5. ہم نے دونوں سمتوں میں آٹو اسکیلنگ کو ترتیب دیا ہے تاکہ کام کے بڑھتے ہوئے بوجھ کو ڈاؤن ٹائم کے اخراجات اٹھائے بغیر ہینڈل کیا جا سکے۔
  6. ہم Capacity Provider کا استعمال کرتے ہیں تاکہ ایپلیکیشن انفراسٹرکچر (مشینوں) کا انتظام کرے نہ کہ دوسری طرف۔
  7. Мы молодцы.

اگر آپ کے پاس بوجھ میں متوقع اضافہ ہے، مثال کے طور پر آپ ایک بڑی ای میل مہم میں اشتہار دے رہے ہیں، تو آپ اسکیلنگ ترتیب دے سکتے ہیں نظام الاوقات.

Ещё можно делать масштабирование на основе данных из разных частей вашей системы. Например, у нас есть функционал انفرادی پروموشنل پیشکش بھیجنا موبائل ایپلیکیشن کے صارفین۔ بعض اوقات ایک مہم 1M+ لوگوں کو بھیجی جاتی ہے۔ اس طرح کی تقسیم کے بعد، API کی درخواستوں میں ہمیشہ بڑا اضافہ ہوتا ہے، کیونکہ بہت سے صارفین ایک ہی وقت میں درخواست میں لاگ ان ہوتے ہیں۔ لہذا اگر ہم دیکھتے ہیں کہ پروموشنل پش نوٹیفیکیشن بھیجنے کے لیے قطار میں نمایاں طور پر زیادہ معیاری اشارے موجود ہیں، تو ہم فوری طور پر کئی اضافی مشینیں اور کام شروع کر سکتے ہیں تاکہ لوڈ کے لیے تیار رہیں۔

مجھے خوشی ہوگی اگر آپ مجھے تبصروں میں اسپاٹ انسٹینس اور ای سی ایس کے استعمال کے دلچسپ معاملات یا اسکیلنگ کے بارے میں کچھ بتائیں۔

Скоро будут статьи про то, как мы обрабатываем тысячи аналитических эвентов в секунду на преимущественно serverless стэке (с деньгами) и как устроен деплой сервисов с помощью GitLab CI и Terraform Cloud.

ہمیں سبسکرائب کریں، یہ دلچسپ ہو جائے گا!

سروے میں صرف رجسٹرڈ صارفین ہی حصہ لے سکتے ہیں۔ سائن ان، برائے مہربانی.

کیا آپ پیداوار میں جگہ کی مثالیں استعمال کرتے ہیں؟

  • 22,2٪ہاں 6

  • 66,7٪نمبر 18

  • 11,1٪میں نے ان کے بارے میں ایک مضمون سے سیکھا اور ان کو استعمال کرنے کا ارادہ کیا۔

27 صارفین نے ووٹ دیا۔ 5 صارفین غیر حاضر رہے۔

ماخذ: www.habr.com

نیا تبصرہ شامل کریں