6.5
Auto Scaling Group আর Scaling Policy
min/desired/max, launch template, target tracking, step, scheduled আর predictive scaling, cooldown, health check আর lifecycle hook।
33 মিনিট পড়া + Animation
টিপস: ডটেড-আন্ডারলাইন করা যেকোনো শব্দে ট্যাপ বা Hover করলে তার অর্থ দেখবে।
এই লেসন শেষে তুমি যা পারবে
- Auto Scaling group (ASG) আসলে কী করে, বুঝিয়ে বলতে পারবে: min আর max-এর মাঝে সুস্থ instance-এর সংখ্যা ধরে রাখা, নষ্টগুলো বদলে দেওয়া, আর Availability Zone জুড়ে ছড়িয়ে রাখা।
- launch configuration-এর জায়গা কেন launch template নিল, আর কোন কাজগুলো শুধু launch template-ই পারে, বলতে পারবে।
- ASG-কে load balancer-এর সাথে জুড়তে পারবে, ঠিক health check type আর grace period বেছে নিতে পারবে, আর “load balancer বলছে unhealthy, অথচ কিছুই বদলাচ্ছে না” সমস্যাটা ঠিক করতে পারবে।
- target tracking, step, simple, scheduled আর predictive scaling-এর মধ্যে ঠিকটা বেছে নিতে পারবে, ভালো metric চিনতে পারবে, আর queue-র backlog দেখে group-এর আকার হিসাব করতে পারবে।
- cooldown আর default instance warm-up ঠিকভাবে ব্যবহার করতে পারবে, আর runaway scaling থামাতে পারবে।
- একটা instance-এর পুরো lifecycle ধরে ধরে বলতে পারবে: lifecycle hook, standby, detach, scale-in protection, termination policy, instance refresh আর warm pool।
- একই group-এ On-Demand আর Spot মিশিয়ে capacity rebalancing দিয়ে চালাতে পারবে, আর সবসময় চালু থাকা অংশটা Reserved Instance বা Savings Plan দিয়ে ঢাকতে পারবে।
#নিজে নিজে scale হওয়া কেন দরকার
লেসন ৬.১-এ দেখেছ web tier কেন horizontally scale করে: load বাড়লে server যোগ করো, কমলে সরিয়ে দাও। লেসন ৬.২ থেকে ৬.৪-এ সামনে একটা load balancer বসানো হয়েছে, যাতে সব server মিলে একটার মতো দেখায়। বাকি রইল আসল কাজটা: কয়টা server থাকা উচিত সেটা ঠিক করা, আর রাত ৩টায় কেউ dashboard-এর দিকে তাকিয়ে না থাকলেও নিজে নিজে server বানানো বা সরানো।
বাস্তবের load কখনো এক রকম থাকে না। একটা দোকান রাতে ফাঁকা, দুপুরে ব্যস্ত, আর sale-এর দিনে পাগলের মতো ভিড়। সারাদিন peak-এর মাপে server চালালে বেশিরভাগ সময় বসে থাকা মেশিনের টাকা দিতে হয়। গড়ের মাপে চালালে peak-এর সময় site ধীর হয়ে যায়, নয়তো পড়েই যায়। data centre-এ উপায় ছিল না, একটা server কিনতেই কয়েক সপ্তাহ লাগত। AWS-এ একটা instance মোটামুটি এক মিনিটে চালু হয়, আর terminate করার সেকেন্ড থেকেই টাকা লাগা বন্ধ, তাই server-এর সংখ্যা load-এর পেছনে পেছনে চলতে পারে।
#Auto Scaling group আসলে কী
Auto Scaling group হলো কতগুলো EC2 instance-এর একটা দল, যেটাকে EC2 Auto Scaling একসাথে একটা জিনিস হিসেবে সামলায়। তুমি তাকে তিনটা সংখ্যা আর একটা রেসিপি দাও:
| Setting | মানে | উদাহরণ |
|---|---|---|
| Minimum capacity | load যাই হোক, এর চেয়ে কম instance কখনো না | ২ |
| Desired capacity | এই মুহূর্তে কয়টা চলা উচিত। scaling policy, schedule আর তুমি এই সংখ্যাটা বদলাও; group তারপর launch বা terminate করে সংখ্যাটার সাথে মিলিয়ে নেয় | ৪ |
| Maximum capacity | policy যত চাক, এর বেশি কখনো না: তোমার bill আর quota-র জন্য একটা নিরাপত্তা সীমা | ১০ |
| Launch template | প্রতিটা নতুন instance-এর রেসিপি: AMI, instance type, security group, IAM role, user data… | web-lt, version $Default |
| Subnet | instance কোথায় কোথায় যেতে পারবে; দুই বা তার বেশি AZ-এর subnet দাও | ৩টা AZ-এর প্রতিটায় একটা private subnet |
এগুলো দিয়ে group যা করে:
- সংখ্যাটা desired-এ ধরে রাখে। কোনো instance terminate হলে (নষ্ট হয়ে, Spot interruption-এ, বা কেউ ভুল করে terminate চাপলে), group তার জায়গায় নতুন একটা চালু করে।
- অসুস্থ instance বদলে দেয়। নিয়মিত প্রতিটা instance পরীক্ষা করে, যেগুলো ফেল করে সেগুলো terminate করে নতুন চালায় (পরের অংশে বিস্তারিত)।
- Scale out আর scale in করে, যখন কোনো scaling policy বা schedule desired capacity বদলায়, কিন্তু সবসময় min আর max-এর ভেতরে থাকে।
- তোমার বেছে দেওয়া AZ-গুলোতে instance সমানভাবে ছড়িয়ে রাখে, প্রতিটা নতুন instance চালায় যে AZ-এ সবচেয়ে কম আছে সেখানে। একটা AZ নষ্ট হলে বাকিগুলোতে চালায়; AZ ঠিক হলে আবার rebalance করে।
- load balancer-এ instance নিজেই register করে, যখন তুমি একটা target group জুড়ে দাও, আর terminate করার আগে deregister করে।
একটা ASG থাকে একটা Region-এ, ওই Region-এর সব AZ জুড়ে ছড়াতে পারে, কিন্তু কখনো দুটো Region-এ না। group-টার নিজের কোনো দাম নেই, ফ্রি: টাকা দাও শুধু যে instance আর অন্যান্য resource সে চালায় সেগুলোর (EBS volume, data transfer, CloudWatch detailed monitoring)।
#রেসিপি: launch template
একটা instance চালু করতে group-এর জানতে হয় কোন AMI, কোন instance type, কোন security group, কোন key pair, কোন IAM role, কোন user data, কোন EBS volume। এই রেসিপিটাই launch template, যেটা লেসন ৪.৩-এ বিস্তারিত দেখেছ: নম্বর দেওয়া, বদলানো যায় না এমন version, একটা default version, আর $Default / $Latest। ASG একটা template আর একটা version ধরে রাখে; নিরাপদ নিয়ম হলো $Default (বা নির্দিষ্ট একটা নম্বর) দেওয়া, আর নতুন version জেনে-বুঝে promote করা।
launch template আসার আগে ছিল launch configuration। এগুলো এখন legacy, আর AWS ধাপে ধাপে এদের বিদায় দিচ্ছে:
| তারিখ | launch configuration-এর জন্য কী বদলাল |
|---|---|
| ৩১ ডিসেম্বর ২০২২ | এই তারিখের পরে আসা কোনো EC2 instance type আর সমর্থিত না |
| ১ জুন ২০২৩ | এই তারিখ থেকে খোলা account console-এ আর বানাতে পারে না |
| ১ অক্টোবর ২০২৪ | এই তারিখ থেকে খোলা account কোনো উপায়েই বানাতে পারে না (console, CLI, API, CloudFormation) |
পুরনো account-গুলো নিজেদের আগের launch configuration চালাতে পারে, কিন্তু AWS সবাইকে migrate করতে বলছে। আর launch configuration যা কখনো পারত না, পরীক্ষার প্রশ্ন ঠিক সেটাই চায়:
| দরকার | Launch template | Launch configuration |
|---|---|---|
| Version, default version, rollback | হ্যাঁ | না: বদলানো যায় না, প্রতিবার নতুন একটা |
| Mixed instances policy: কয়েক ধরনের instance type, একই group-এ On-Demand আর Spot | হ্যাঁ | না |
| একদম নতুন instance type আর feature (IMDSv2 option, capacity reservation, placement group…) | হ্যাঁ | না |
| EC2 Fleet, Spot Fleet আর সাধারণ launch-এও ব্যবহার করা যায় | হ্যাঁ | শুধু Auto Scaling |
#Load balancer-এর সাথে ASG
বেশিরভাগ ASG থাকে একটা Application বা Network Load Balancer-এর পেছনে। group-এর সাথে একটা target group জুড়ে দাও (লেসন ৬.২ আর ৬.৩), তারপর থেকে:
register হয় নিজে নিজে
group যে instance-ই চালু করুক, service-এ ঢোকার সময় সেটা target group-এ register হয়ে যায়। হাতে করে কখনো load balancer-এ instance যোগ করতে হয় না, আর যেখানে প্রতি ঘণ্টায় instance আসে-যায়, সেখানে এটাই আসল সুবিধা।
terminate-এর আগে deregister
group যখন scale in করে বা কোনো instance বদলায়, আগে সেটাকে deregister করে। load balancer নতুন request পাঠানো বন্ধ করে, আর চলতি request-গুলো শেষ করতে দেয় deregistration delay পর্যন্ত (connection draining, default ৩০০ সেকেন্ড, লেসন ৬.৪)। তারপরই instance terminate হয়। scale in-এর সময় user-রা error দেখলে deregistration delay বাড়াও।
group চাইলে load balancer-এর health check মানতে পারে
load balancer তো আগে থেকেই প্রতিটা target পরীক্ষা করে (যেমন প্রতি ৩০ সেকেন্ডে
GET /health)। ASG-কেও বলা যায় ওই রায় মেনে নিতে। মানবে কি না, সেটাই health check type, আর পুরো বিষয়টায় সবচেয়ে বেশি ভুল হয় ঠিক এখানেই।
#Health check type
সব instance শুরু করে সুস্থ হিসেবে। চালু থাকা কোনো একটা উৎস যখন বলে instance unhealthy, তখনই সে অসুস্থ, আর group তাকে terminate করে নতুন একটা চালায়:
| Health check | কী ধরে | default-এ চালু? |
|---|---|---|
| EC2 status check আর scheduled event | instance running অবস্থায় নেই (stopped, terminated, shutting down), তার system বা instance status check impaired, অথবা AWS তার জন্য retirement event ঠিক করেছে | হ্যাঁ, সবসময়, বন্ধ করা যায় না। এটাই default type |
| ELB | load balancer target-কে unhealthy বলছে: application তার health check-এর উত্তর দিচ্ছে না | না, নিজে চালু করতে হয় |
| VPC Lattice | VPC Lattice target group instance-কে unhealthy বলছে | না |
| EBS | লাগানো কোনো EBS volume-এ পৌঁছানো যাচ্ছে না, বা তার I/O status check ফেল করছে | না |
| Custom | তোমার নিজের monitoring set-instance-health ডেকে instance-কে unhealthy চিহ্নিত করে | যখনই তুমি ডাকো |
মূল কথাটা হলো: default EC2 type-এ group শুধু জানে মেশিনটা বেঁচে আছে কি না। আটকে যাওয়া web server, crash করা application process বা ভরে যাওয়া disk user-কে error দেয়, কিন্তু instance থাকে running, status check-ও পাস। load balancer গোলমালটা দেখে traffic পাঠানো বন্ধ করে, অথচ ASG instance-টাকে সুস্থই রেখে দেয়: একটা zombie, যার টাকা তুমি দিয়েই যাচ্ছ। ELB health check type চালু করলে load balancer-এর রায়ও যোগ হয় (EC2 check-ও চালু থাকে), ফলে group instance-টা terminate করে বদলে দেয়।
আরও কয়েকটা খুঁটিনাটি জানা ভালো:
- যে instance
runningঅবস্থা ছেড়ে যায়, সেটা সাথে সাথে বদলানো হয়। status check ফেল করলে আগে কয়েক মিনিট ধৈর্য ধরা হয়, যদি AWS নিচের সমস্যাটা ঠিক করে ফেলে। - একসাথে অনেক instance অসুস্থ হলে group ধাপে ধাপে বদলায় (default-এ একবারে desired capacity-র সর্বোচ্চ ১০%, প্রতিটা ধাপ warm-up শেষ করা পর্যন্ত অপেক্ষা করে), যাতে একটা ভাঙা health check page এক ধাক্কায় পুরো fleet মুছে না দেয়।
- health check-এর হাতে না মরে কোনো instance-এ কাজ করতে চাইলে সেটাকে standby-তে রাখো (এই লেসনেই পরে আছে), নয়তো
HealthCheckআরReplaceUnhealthyprocess দুটো suspend করো।
#Health check grace period
নতুন instance-এর বুট হতে আর application চালু হতে সময় লাগে, আর সেই সময়টায় load balancer-এর check ফেল করে। health check grace period হলো instance service-এ ঢোকার পর ব্যর্থ health check-এর ওপর ব্যবস্থা নেওয়ার আগে group কতক্ষণ অপেক্ষা করবে।
- Console-এ default ৩০০ সেকেন্ড। CLI আর SDK-তে default ০, মানে বন্ধ। CLI দিয়ে বানানো, ELB type-ওয়ালা একটা group, যার application চালু হতে চার মিনিট লাগে, সে প্রতিটা নতুন instance তৈরি হওয়ার আগেই terminate করে দেবে, অনন্তকাল।
- আসল start-up সময়ের চেয়ে একটু বেশি দাও। বেশি লম্বা দিলে সত্যিই নষ্ট একটা নতুন instance ততক্ষণ বেঁচে থাকবে।
- এটা খাটে নতুন চালু হওয়া instance-এ, standby থেকে ফেরা instance-এ, আর হাতে attach করা instance-এ।
- যে instance stop হয়ে গেছে, তাকে এটা কখনো বাঁচায় না: grace period থাকুক বা না থাকুক, সেটা সাথে সাথে বদলানো হয়।
- এমন একটা launch lifecycle hook থাকলে, যেটা instance পুরো তৈরি না হওয়া পর্যন্ত আটকে রাখে, grace period ০ রাখলেও চলে।
ASG অসুস্থ instance বদলে দেয়
desired capacity ৩, প্রতি AZ-এ একটা instance, সবগুলো ALB-এর target group-এ registered। ASG কাকে অসুস্থ ধরবে, তা নির্ভর করে তার health check type-এর ওপর।
পরিস্থিতি
default health check type, EC2, ধরে ফেলে কোন instance আর চলছে না।
তিনটা সুস্থ instance, প্রতি AZ-এ একটা। ALB request-গুলো তাদের মধ্যে ভাগ করে দেয়। ASG-এর কাজ হলো সুস্থ instance-এর সংখ্যা desired capacity, মানে ৩-এ ধরে রাখা।
#ASG ঠিকমতো না চললে
| লক্ষণ | সম্ভাব্য কারণ | সমাধান |
|---|---|---|
| load balancer একটা target-কে ঘণ্টার পর ঘণ্টা unhealthy দেখাচ্ছে, অথচ ASG কিছুই করছে না | health check type শুধু EC2 | group-এর health check type ELB করো |
| নতুন instance এক-দুই মিনিটের মধ্যে terminate হচ্ছে, বারবার | ELB type-এর সাথে grace period ০ (বা start-up-এর চেয়ে কম), নয়তো health check path ভুল | grace period start-up সময়ের চেয়ে বেশি দাও, launch hook ব্যবহার করো, target group-এর health check path আর security group দেখো |
| প্রতিটা নতুন instance unhealthy | security group load balancer-কে health check port-এ ঢুকতে দিচ্ছে না, বা বুটের সময়ই application ভেঙে পড়ছে (ভুল user data, secret নেই) | ওই port-এ load balancer-এর security group-কে অনুমতি দাও; instance-এর console log আর ASG-এর activity history পড়ো |
| group desired-এর নিচে আটকে আছে, activity-তে launch failure | কোনো AZ-এ ওই instance type-এর capacity নেই, AMI deregister হয়ে গেছে, quota শেষ, launch template version ভুল | আরও instance type বা AZ যোগ করো (mixed instances policy), template ঠিক করো, quota বাড়ানোর অনুরোধ করো |
| scale in-এর সময় user-রা error দেখছে | চলতি request থাকা অবস্থায় instance terminate হচ্ছে | target group-এর deregistration delay বাড়াও; application-এর সুন্দরভাবে বন্ধ হওয়া দরকার হলে terminating lifecycle hook যোগ করো |
| group কখনো scale in করে না | min-এ পৌঁছে গেছে, target tracking policy-তে scale-in বন্ধ, সব instance scale-in protection-এ, বা instance এখনো warm-up-এ | min, policy, instance protection আর warm-up দেখো |
নিজেকে যাচাই করোপ্রশ্ন
একটা Auto Scaling group শুধু default EC2 health check ব্যবহার করে। নিচের কোন গোলমালটা সে নিজে থেকে ধরতে আর ঠিক করতে পারবে না?
#Scaling policy
desired capacity বদলায় তিনটার যেকোনো একটা কারণে: তুমি বদলাও (manual scaling), কোনো schedule বদলায়, অথবা metric দেখে কোনো policy বদলায়। হাতে যা যা আছে:
| ধরন | কিসের ভিত্তিতে চলে | কোথায় সবচেয়ে ভালো |
|---|---|---|
| Target tracking (dynamic) | একটা metric-কে একটা target মানের কাছে রাখো, thermostat-এর মতো। CloudWatch alarm AWS নিজেই বানায় আর সামলায় | বেশিরভাগ workload। load-এর অনুপাতে যা scale করে, তার জন্য AWS-এর recommendation |
| Step scaling (dynamic) | তোমার CloudWatch alarm; কতটা ছাড়িয়ে গেল তার ওপর adjustment ঠিক হয় (“CPU 70–85%: ১টা যোগ; 85%-এর ওপরে: ৩টা”) | কতটা যোগ বা বাদ হবে, সেটা নিজের হাতে স্পষ্টভাবে ঠিক করতে চাইলে |
| Simple scaling (dynamic) | তোমার CloudWatch alarm; একটাই নির্দিষ্ট adjustment, তারপর একটা cooldown | Legacy। AWS এর বদলে target tracking বা step scaling recommend করে |
| Scheduled action | তারিখ আর সময়, একবার বা বারবার (cron) | জানা ঘটনা: অফিস-সময়, সাপ্তাহিক sale, batch-এর সময় |
| Predictive scaling | metric-এর ইতিহাস থেকে বানানো machine learning forecast | নিয়মিত দৈনিক বা সাপ্তাহিক চক্র, ধীরে চালু হওয়া application |
একসাথে কয়েকটা policy চালু থাকতে পারে। প্রত্যেকে নিজের হিসাবে capacity চায়, আর group নেয় সবচেয়ে বড়টা: যেকোনো একটা policy বললেই scale out করে, আর scale in করে শুধু যখন সবাই রাজি।
#Target tracking
একটা metric আর একটা target মান বেছে নাও, যেমন গড় CPU ৫০%। Auto Scaling তখন হিসাব করে কয়টা instance থাকলে metric target-এ থাকবে। ৪টা instance গড়ে ৭৫% CPU-তে চললে আর target ৫০% হলে, একই কাজ ৫০% করে ভাগ করতে লাগবে ৪ × ৭৫ ÷ ৫০ = ৬টা instance, তাই desired যায় ৬-এ। load অর্ধেক হলে গড় আবার ৫০%-এর কাছে না আসা পর্যন্ত instance সরাতে থাকে।
পর্দার আড়ালে Auto Scaling দুটো alarm বানায়: একটা scale-out alarm, যেটা metric কয়েক মিনিট target-এর ওপরে থাকলেই সাড়া দেয় (এক মিনিটের ৩টা data point), আর একটা scale-in alarm, যেটা অনেক বেশি অপেক্ষা করে (১৫টা data point)। ধীরে scale in করাটা ইচ্ছাকৃত: তাড়াতাড়ি capacity সরালে user কষ্ট পায়, একটু বেশি যোগ হলে খরচ হয় সামান্য। চাইলে কোনো policy-র scale-in বন্ধও করা যায়, যেমন deployment-এর সময়, আর capacity কমানোর কাজটা অন্য কাউকে দেওয়া যায়।
ভালো metric হলো সেগুলো, যেগুলো প্রতিটা instance কতটা ব্যস্ত তার অনুপাতে ওঠানামা করে:
| Metric | Predefined নাম | কখন ব্যবহার করবে |
|---|---|---|
| group-এর গড় CPU | ASGAverageCPUUtilization | CPU-নির্ভর application: সাধারণত এটাই প্রথম পছন্দ |
| ALB থেকে প্রতি instance-এ request | ALBRequestCountPerTarget | এমন web app, যেখানে একটা instance কতগুলো request আরামে সামলায় জানা আছে। target হলো প্রতি target-এ প্রতি মিনিটে request, যেমন ১,০০০ (একটা instance মোটামুটি ২০ RPS সামলালে মিনিটে ১,২০০ তার সীমা, তাই target একটু কম রাখো) |
| গড় network in / out | ASGAverageNetworkIn / ASGAverageNetworkOut | network-নির্ভর workload (streaming, proxy, file transfer) |
| তোমার নিজের metric | custom CloudWatch metric | প্রতি instance হিসাবের অন্য যেকোনো কিছু: memory (CloudWatch agent পাঠায়), প্রতি instance-এ active session, প্রতি instance-এ queue backlog |
target tracking-এ যে metric চলে না, কারণ instance যোগ করলেও সেগুলো কমে না: load balancer-এর মোট RequestCount, response-এর latency, আর SQS queue-তে থাকা message-এর কাঁচা সংখ্যা। মোটকে প্রতি instance-এ ভাগ করো (প্রতি target-এ request, প্রতি instance-এ backlog), তখন চলবে।
দুটো কাজের কথা। detailed monitoring (১ মিনিট) চালু না করলে EC2 CPU পাঠায় প্রতি ৫ মিনিটে, আর policy তার data যত দ্রুত আসে তার চেয়ে দ্রুত সাড়া দিতে পারে না, তাই scaling group-এ এটা চালু রাখো। আর খুব লাফিয়ে ওঠা traffic-এর জন্য target tracking কয়েক সেকেন্ড পরপর পাঠানো high-resolution custom metric-ও ব্যবহার করতে পারে, তখন এক মিনিটেরও অনেক কমে সাড়া দেয়।
Target tracking simulator
একটা load-এর ধরন আর setting বেছে নাও, তারপর play চাপো। policy-টা desired capacity বদলে গড় CPU-কে target-এর কাছাকাছি রাখে, সবসময় min আর max-এর ভেতরে।
Load-এর ধরন
Target গড় CPU
Capacity (min ২)
তৈরি হতে কত সময়
Default instance warm-up
মিনিট
0
Load (কয়টা instance-এর সমান)
0.6
Desired
2
Serving
2
policy যে CPU দেখে
30%
Scaling activity
এখনো কিছু হয়নি। play চাপো।
দুটো instance একটা শান্ত site চালাচ্ছে। play চাপো, দেখো desired capacity (কমলা) load-এর পেছনে ছুটছে, আর serving instance (সবুজ) কয়েক মিনিট পরে পিছু নিচ্ছে।
simulator-এ এগুলো চালিয়ে দেখো: “max-এর চেয়েও বেশি” দেখায় policy যখন max-এর চেয়ে বেশি চায় তখন কী হয় (load না কমা পর্যন্ত CPU target-এর ওপরে থাকে); “হঠাৎ flash sale”-এ ৬ মিনিটের start-up দিলে দেখবে ধীর একটা AMI user-দের কতক্ষণ অপেক্ষা করায়; আর একই spike-এ warm-up ০ দিলে দেখবে runaway scaling, যেটা একটু পরেই বুঝিয়ে বলা হয়েছে।
#CloudWatch alarm দিয়ে step আর simple scaling
এখানে CloudWatch alarm-টা তুমি বানাও, যেমন “group-এর গড় CPU পরপর ২ মিনিট 70%-এর ওপরে”, আর তার সাথে একটা policy জুড়ে দাও। সাধারণত এক জোড়া বানানো হয়: উঁচু alarm-এ একটা scale-out policy আর নিচু alarm-এ একটা scale-in policy (“30%-এর নিচে, ১টা সরাও”)।
- Step scaling দেখে metric সীমা কতটা ছাড়িয়েছে, আর সেই মাপে একটা ধাপ বেছে নেয়: 70–85% → ১টা যোগ, 85% বা তার বেশি → ৩টা যোগ। adjustment হতে পারে কয়টা instance, একটা নির্দিষ্ট capacity, বা group-এর একটা শতাংশ। প্রতিটা নতুন ছাড়িয়ে যাওয়ায় সাথে সাথে সাড়া দেয়, আর warm-up-এ থাকা instance-গুলোকে আগেই যোগ হওয়া capacity ধরে, তাই মাত্রা ছাড়িয়ে যায় না।
- Simple scaling-এর থাকে একটাই adjustment (“২টা যোগ করো”), তারপর আবার কিছু করার আগে cooldown শেষ হওয়া পর্যন্ত বসে থাকে। load বাড়তেই থাকলে এজন্য এটা ধীর, আর সেই কারণেই AWS এটা না নিতে বলে।
#Scheduled action
scheduled action একটা নির্দিষ্ট সময়ে min, max আর/অথবা desired বদলে দেয়, একবার (“১১ নভেম্বর সকাল ৮টায় min ২০”) অথবা cron expression আর time zone দিয়ে বারবার (“প্রতি শুক্রবার ১৬:৪৫-এ min ১০”)। load যে আসছে, সেটা যখন তুমি জানো, তখন এটাই: action ভিড়ের আগেই capacity বাড়িয়ে দেয়, আর আরেকটা action পরে min আবার নামিয়ে আনে। scheduled action কোনো cooldown-এর অপেক্ষা না করে সাথে সাথে শুরু হয়, আর এর ওপরেও dynamic policy কাজ চালিয়ে যায়।
#Predictive scaling
predictive scaling ইতিহাস থেকে ধরনটা শিখে load আসার আগেই scale করে:
- forecast শুরু করতে metric-এর অন্তত ২৪ ঘণ্টার data লাগে, আর সে সর্বোচ্চ ১৪ দিন পর্যন্ত দেখে (পুরো দুই সপ্তাহ পেলে forecast সবচেয়ে ভালো হয়)।
- সামনের ৪৮ ঘণ্টার ঘণ্টাভিত্তিক forecast বানায়, প্রতি ৬ ঘণ্টায় নতুন করে।
- শুরু হয় forecast only mode-এ, যাতে তুমি forecast-কে বাস্তবের সাথে মিলিয়ে দেখতে পারো; তারপর যাও forecast and scale-এ।
- প্রতিটা forecast ঘণ্টার শুরুতে launch করে, অথবা একটা pre-launch buffer (
SchedulingBufferTime) দিলে আরও আগে, যাতে ঘণ্টা শুরু হওয়ার সময় instance তৈরি থাকে। - এটা শুধু scale out করে। কখনো capacity সরায় না, তাই এর সাথে একটা target tracking policy জুড়ে দাও, যেটা scale in করবে (আর forecast যা দেখেনি, এমন হঠাৎ ঘটনাও সামলাবে)।
- default-এ max ছাড়াতে পারে না; চাইলে নিজে নিজে max বাড়ানোর অনুমতি দেওয়া যায় (
MaxCapacityBreachBehavior), কিন্তু বাড়ানো max ততদিন থেকে যায় যতদিন না তুমি নিজে কমাও।
যেখানে খাপ খায়: অফিস-সময়ের application, দৈনিক batch-এর সময়, আর যে application চালু হতে অনেক মিনিট লাগে। যেখানে খাপ খায় না: এলোমেলো, অনিয়মিত traffic, আর এমন mixed group যার instance type-গুলোর আকারে অনেক পার্থক্য।
#Queue দেখে scaling: প্রতি instance-এ backlog
যে worker fleet একটা SQS queue থেকে কাজ পড়ে, তাদের scale করা উচিত প্রতি instance-এ backlog দেখে, queue-র দৈর্ঘ্য দেখে না। দেখা যাওয়া message-এর কাঁচা সংখ্যা worker-এর সংখ্যার অনুপাতে বদলায় না, তাই target tracking এটা ব্যবহার করতে পারে না। প্রতি instance-এ backlog পারে:
- কতটা দেরি মেনে নেওয়া যায় ঠিক করো: একটা message সর্বোচ্চ ধরো ২০ সেকেন্ড অপেক্ষা করতে পারবে।
- processing time মাপো: একটা worker একটা message শেষ করে ০.২ সেকেন্ডে, মানে প্রতি সেকেন্ডে ৫টা।
- প্রতি instance-এ target backlog = মেনে নেওয়া দেরি ÷ processing time = ২০ ÷ ০.২ = ১০০টা message।
- queue-তে ১,৮০০টা message থাকলে policy চাইবে ১,৮০০ ÷ ১০০ = ১৮টা instance।
এটা custom metric হিসেবে পাঠাতে পারো, নয়তো target tracking-কে metric math দিয়ে হিসাব করতে দাও: queue-র দেখা যাওয়া message-এর সংখ্যা ভাগ group-এর in-service instance-এর সংখ্যা। processing time বদলালে (বড় ছবি, ধীর কোনো dependency), target আবার দেখো।
CloudWatch alarm দিয়ে scaling
প্রতিটা dynamic policy চলে CloudWatch দিয়ে। step আর simple policy তোমার বানানো alarm ব্যবহার করে; target tracking নিজের alarm নিজেই বানায় আর সামলায়।
পরিস্থিতি
Alarm: গড় CPU 70%-এর ওপরে। ধাপ: 70–85% হলে ১টা যোগ, 85% বা তার বেশি হলে ৩টা যোগ।
চারটা instance CPU জানায়। CloudWatch পুরো group-এর গড় করে: 74%।
#Cooldown আর warm-up
group instance যোগ করার পর সেগুলো কাজে লাগতে একটু সময় লাগে: launch হয়, বুট হয়, application চালু হয়, load balancer-এ register হয়, তারপর traffic নেয়। এই সময়টায় policy যদি metric দেখতেই থাকে, সে পুরনো, উঁচু মানটাই দেখবে আর আরও instance যোগ করবে। এটা সামলাতে দুটো setting আছে, আর পরীক্ষা এই দুটো গুলিয়ে দিতে খুব পছন্দ করে।
| Default cooldown | Default instance warm-up | |
|---|---|---|
| কোথায় খাটে | Simple scaling policy-তে (আর manual scaling-এ শুধু তুমি চাইলে) | Target tracking আর step scaling policy, instance refresh, instance বদলানো |
| কী করে | একটা scaling activity-র পর cooldown শেষ না হওয়া পর্যন্ত simple policy আর কিছু launch বা terminate করতে পারে না | warm-up শেষ না হওয়া পর্যন্ত নতুন instance group-এর মোট metric-এ ঢোকে না, আর পথে থাকা capacity হিসেবে গোনা হয় |
| Default মান | ৩০০ সেকেন্ড | default-এ দেওয়া থাকে না। না দিলে target tracking আর step scaling cooldown-এর মানটাই নেয়, আর instance refresh নেয় grace period |
| AWS-এর পরামর্শ | পারলে simple scaling আর cooldown এড়িয়ে চলো | জোর দিয়ে recommend করে: একটা instance তৈরি হতে যত সময় লাগে তত দাও (৩০০ সেকেন্ড দিয়ে শুরু করে ঠিকঠাক করো) |
warm-up ঠিক কী বদলায়:
- instance warm-up-এ থাকার সময় group আবার scale out করে শুধু যদি বাকি instance-গুলোর metric এখনো target-এর ওপরে থাকে, আর warm-up-এ থাকাগুলোকে capacity-র অংশ ধরে। তাই পরপর কয়েকটা alarm মিলে একটা বুদ্ধিমান scale out হয়, স্তূপ জমে না।
- নতুন instance-গুলোর warm-up শেষ না হওয়া পর্যন্ত scale in আটকে থাকে।
- scheduled action, অসুস্থ instance বদলানো আর হাতে করা পরিবর্তন কখনো এই দুটোর কোনোটার জন্য অপেক্ষা করে না।
#Runaway scaling
Runaway scaling মানে আগের instance-গুলো কাজ শুরু করার আগেই group একটার পর একটা instance চালু করে যাচ্ছে। চেনা কারণটা হলো: নতুন instance-গুলো লম্বা একটা user data script চালায় (package install, asset download, compile), CPU থাকে অনেক বেশি। warm-up না থাকলে, বা script-এর চেয়ে অনেক কম থাকলে, তাদের ব্যস্ত CPU group-এর গড়ে ঢুকে পড়ে, scale out-এর ঠিক পরেই গড় আরও খারাপ হয়, আর policy আরও যোগ করে। group দৌড়ে max-এ পৌঁছায়, বাড়তিটার টাকা তুমি দাও, আর পরে scale in করে সেটা ফেরাতে ১৫ মিনিট বা তার বেশি লাগে।
সমাধান, সবচেয়ে ভালোটা আগে:
- instance-কে দ্রুত তৈরি করো। software আগে থেকে বসানো একটা ready-to-serve (golden) AMI ব্যবহার করো (লেসন ৪.৩), আর user data ছোট রাখো। এতে সবকিছুই কমে: warm-up, grace period আর user-দের কাজে লাগতে যত সময়।
- default instance warm-up দাও, service-এ ঢোকা থেকে traffic নেওয়া পর্যন্ত আসল সময়টা।
- simple scaling-এর জন্য cooldown বাড়াও।
- launch lifecycle hook ব্যবহার করো, যাতে instance পুরো তৈরি হলে তবেই service-এ ঢোকে।
নিজেকে যাচাই করোপ্রশ্ন
কোন ধরনের scaling policy আবার scale করার আগে ৩০০ সেকেন্ডের default cooldown-এর জন্য অপেক্ষা করে?
#Instance-এর lifecycle
ASG-র ভেতরের একটা instance সাধারণ EC2 অবস্থাগুলোর ওপর আরও কিছু নিজস্ব অবস্থার মধ্য দিয়ে যায়:
| অবস্থা | কী ঘটছে |
|---|---|
Pending | launch হচ্ছে, বুট হচ্ছে। launch hook থাকলে: Pending:Wait, তারপর Pending:Proceed |
InService | চলছে, load balancer-এ registered, capacity-তে গোনা, health check হচ্ছে |
Standby | সাময়িকভাবে service-এর বাইরে: load balancer থেকে deregistered, health check হয় না, কিন্তু group-এরই অংশ |
Terminating | সরানোর জন্য বাছাই হয়েছে: deregister (draining), তারপর terminate। terminating hook থাকলে: Terminating:Wait, তারপর Terminating:Proceed |
Detaching | চিরতরে group ছেড়ে যাচ্ছে; এরপর এটা সাধারণ একটা instance, চলতেই থাকে |
Warmed:* | warm pool-এ আছে (নিচে দেখো), stopped, hibernated বা running, ডাক পড়ার অপেক্ষায় |
#Lifecycle hook
lifecycle hook launch বা terminate-এর সময় instance-কে থামিয়ে রাখে, যাতে তুমি নিজের কোনো কাজ চালাতে পারো:
- Launching hook (
autoscaling:EC2_INSTANCE_LAUNCHING): load balancer-এ register হওয়ার আগে instance অপেক্ষা করেPending:Wait-এ। একটা script software install করে, cache ভরে, self-test চালায়, তারপরcomplete-lifecycle-actionডাকেCONTINUEদিয়ে।ABANDONদিলে group instance-টা terminate করে আবার চেষ্টা করে। - Terminating hook (
autoscaling:EC2_INSTANCE_TERMINATING): deregister হওয়ার পর instance অপেক্ষা করেTerminating:Wait-এ। সাধারণ কাজ: log S3-তে কপি করা, হাতের job শেষ করা বা ফেরত দেওয়া, service registry বা DNS থেকে নাম সরানো, শেষ একটা backup নেওয়া। terminating hook-এ দুটো result-এর শেষেই terminate হয়; hook-টা যতটা পারে ততটা চেষ্টা। - hook একটা event পাঠায় EventBridge-এ (বা SNS বা SQS-এ notification), যেটা একটা Lambda function, একটা SSM Run Command বা একটা script চালু করতে পারে। instance নিজেও instance metadata থেকে নিজের target lifecycle অবস্থা পড়ে নিতে পারে।
- Heartbeat timeout: default ১ ঘণ্টা। কেউ action শেষ না করলে সময় ফুরালে default result (
ABANDONবাCONTINUE) কাজ করে। script চাইলেrecord-lifecycle-action-heartbeatদিয়ে অপেক্ষা বাড়াতে পারে, সর্বোচ্চ ৪৮ ঘণ্টা বা ১০০টা heartbeat, যেটা আগে আসে।
#Standby, detach আর scale-in protection
- Standby (
enter-standby): patch দিতে বা সমস্যা খুঁজতে instance-কে service থেকে সরিয়ে রাখো। load balancer থেকে সরে যায়, health check হয় না। তুমি ঠিক করো desired একটা কমবে, নাকি তার জায়গায় নতুন একটা চালু হবে।exit-standbyতাকে ফিরিয়ে আনে (grace period আবার খাটে)। - Detach (
detach-instances): instance-কে চিরতরে group থেকে বের করে দাও। সে সাধারণ instance হিসেবে চলতে থাকে; চাইলে group তার জায়গায় নতুন একটা চালাক, নয়তো desired কমাও। Attach ঠিক উল্টোটা করে। - Scale-in protection (
set-instance-protection, বা group-এর সব নতুন instance-এর জন্য একসাথে): scale in এই instance-কে বাছবে না, যেমন সে যখন লম্বা কোনো job চালাচ্ছে। তবে অসুস্থ হলে বদলানো, Spot interruption বা হাতে terminate থেকে এটা বাঁচায় না।
#Scale in-এ কোন instance যাবে
group scale in করলে কোন instance যাবে, সেটা ঠিক করে termination policy। default policy এই ক্রমে কাজ করে:
- সবার আগে Availability Zone-এর ভারসাম্য। যে AZ-এ সবচেয়ে বেশি instance আছে (আর অন্তত একটা protection ছাড়া), সেটা বাছো। তুমি যে termination policy-ই দাও, এই নিয়ম সবসময় প্রথমে।
- পুরনো configuration। ওই AZ-এর ভেতরে আগে সেই instance, যেটা launch configuration থেকে চালু, তারপর বর্তমানটার বদলে অন্য কোনো launch template থেকে, তারপর বর্তমান template-এর সবচেয়ে পুরনো version থেকে।
- পরের billing hour-এর সবচেয়ে কাছে যে, তবুও সমান হলে এলোমেলোভাবে একটা। (এখন বেশিরভাগ EC2 প্রতি সেকেন্ডে bill হয়, তাই এই নিয়মের গুরুত্ব আগের চেয়ে কম।)
mixed instances group-এ group আগে ঠিক করে On-Demand সরাবে না Spot (ঠিক করা অনুপাত বজায় রাখতে), আর কোন instance allocation strategy-র সাথে সবচেয়ে ভালো মেলে।
অন্য predefined policy: OldestInstance, NewestInstance, OldestLaunchTemplate, OldestLaunchConfiguration, ClosestToNextInstanceHour, AllocationStrategy, অথবা Lambda function দিয়ে বানানো custom termination policy। অসুস্থ instance policy-র ধারই ধারে না: সেগুলো সোজা বদলানো হয়।
#Fleet-কে টাটকা আর দ্রুত রাখা
- Instance refresh ধাপে ধাপে instance বদলায়, যেমন patch করা AMI-সহ নতুন launch template version promote করার পরে। তুমি একটা minimum healthy percentage দাও (default ৯০%), আর চাইলে ১০০%-এর ওপরে একটা maximum, যাতে terminate-এর আগে launch করে; আগে থেকেই মিলে যাওয়া instance বাদ দিতে পারে, checkpoint-এ থামতে পারে, আর health check ফেল করলে নিজে নিজে rollback করতে পারে।
- Instance maintenance policy: group যত instance বদলায় (অসুস্থ instance, rebalance), সবগুলোর জন্য একই min/max healthy percentage, যেমন “আগে launch, পরে terminate, কখনো ১০০%-এর নিচে না”।
- Maximum instance lifetime: প্রতিটা instance ধরো ৭ দিন পরপর বদলে দাও (কমপক্ষে ১ দিন), যাতে কিছুই মাসের পর মাস patch ছাড়া না চলে।
- Warm pool: group-এর পাশে আগে থেকে তৈরি করে রাখা কিছু instance, stopped (তখন টাকা দাও শুধু তাদের EBS volume-এর), hibernated বা running অবস্থায়। scale out হলে শূন্য থেকে বুট না করে pool থেকে একটা তুলে নেয়, ফলে যে application চালু হতে অনেক সময় লাগে, তার কয়েক মিনিট বেঁচে যায়।
- Process suspend করা: কোনো সমস্যা খুঁজতে গিয়ে আলাদা আলাদা process থামিয়ে রাখা যায় (
Launch,Terminate,HealthCheck,ReplaceUnhealthy,AZRebalance,AlarmNotification,ScheduledActions,AddToLoadBalancer,InstanceRefresh)।
Instance lifecycle, hook আর termination
দুটো AZ-এ পাঁচটা instance। নিচের ছোট লেখায় আছে কোনটা launch template-এর কোন version থেকে চালু হয়েছিল।
পরিস্থিতি
load কমল, একটা policy desired ৫ থেকে ৪ করল। কোন instance terminate হবে? ঠিক করে default termination policy, একটা নির্দিষ্ট ক্রমে।
#Mixed instances: On-Demand আর Spot একসাথে
একটা mixed instances policy (শুধু launch template দিয়ে) একটা group-কে কয়েক ধরনের instance type আর দুই ধরনের purchase option একসাথে চালাতে দেয়। Spot নিজে কী, তা লেসন ৪.৪-এ দেখেছ: প্রায় ৯০% পর্যন্ত ছাড়, সাথে দুই মিনিটের interruption notice। ASG-তে mix-টা তুমি ঠিক করো দুটো সংখ্যা দিয়ে:
| Setting | মানে | API default |
|---|---|---|
On-Demand base capacity (OnDemandBaseCapacity) | capacity-র প্রথম N ইউনিট সবসময় On-Demand | ০ |
base-এর ওপরে On-Demand শতাংশ (OnDemandPercentageAboveBaseCapacity) | base-এর ওপরে যা আছে, তার এত শতাংশ On-Demand; বাকিটা Spot | ১০০ (সব On-Demand) |
হাতে-কলমে উদাহরণ। base ২, base-এর ওপরে ২৫% On-Demand, desired ১০। প্রথম ২টা On-Demand। বাকি ৮টা ভাগ হয় ২৫% On-Demand (২টা) আর ৭৫% Spot (৬টা)। মোট: ৪টা On-Demand আর ৬টা Spot। desired ৪ হলে হতো ২ + (২-এর ২৫% → মোটামুটি ১টা On-Demand, বাকিটা Spot)।
group কীভাবে instance type আর pool বাছে (একটা pool মানে একটা AZ-এ একটা instance type):
- Spot allocation strategy:
price-capacity-optimizedrecommended: এমন pool বাছে যেগুলো সস্তাও, আবার interrupt হওয়ার সম্ভাবনাও সবচেয়ে কম।capacity-optimized(আর-prioritized) শুধু capacity দেখে। কিছু না বললে API ব্যবহার করেlowest-price, কিন্তু AWS এটা recommend করে না: এতে interruption-এর ঝুঁকি সবচেয়ে বেশি। - On-Demand allocation strategy:
prioritized(তোমার দেওয়া type-এর ক্রম, তোমার Reserved Instance যে type ঢাকে সেখানে instance ফেলতে কাজে লাগে) অথবাlowest-price। - অনেক ধরনের instance type দাও (অথবা vCPU আর memory দিয়ে attribute-ভিত্তিক বাছাই), কয়েকটা AZ জুড়ে। pool যত বেশি, একটার ঘাটতিতে ক্ষতি তত কম।
- Spot-এর maximum price দিয়ো না: এতে শুধু interruption বাড়ে। টাকা সবসময় দাও তখনকার Spot দামেই।
Capacity rebalancing। একটা Spot instance interrupt করার আগে EC2 একটা rebalance recommendation পাঠায় (ঝুঁকি বেড়েছে এমন একটা সংকেত, সাধারণত দুই মিনিটের notice-এর আগেই)। capacity rebalancing চালু থাকলে group আগে একটা ভালো pool-এ নতুন instance চালু করে, সেটা health check পাস করা পর্যন্ত অপেক্ষা করে, তারপর ঝুঁকিতে থাকা instance-টা terminate করে, তোমার terminating lifecycle hook থাকলে সেটার মধ্য দিয়ে (দুই মিনিটের কমে শেষ করো)। এই সময় কিছুক্ষণের জন্য max-কে desired-এর ১০% পর্যন্ত ছাড়িয়ে যেতে পারে। এটা না থাকলে group একটা Spot instance বদলায় সেটা interrupt হওয়ার পরে, তাই কয়েক মিনিট capacity কম থাকে।
একই group-এ On-Demand base আর Spot
Mixed instances policy: On-Demand base capacity ২, base-এর ওপরে 0% On-Demand (মানে সব Spot), allocation strategy price-capacity-optimized, কয়েক ধরনের instance type। desired ৫।
পরিস্থিতি
base আসে সবার আগে: capacity-র প্রথম ২ ইউনিট সবসময় On-Demand, AZ জুড়ে ছড়ানো। এটাই সেই মেঝে, যেটা কখনো হারানো চলবে না।
#মেঝের দাম: Reserved Instance আর Savings Plan
Auto Scaling টাকা বাঁচায় যে instance লাগছে না সেগুলো সরিয়ে। কিন্তু minimum capacity কখনো যায় না: ওই instance-গুলো দিনে ২৪ ঘণ্টা, বছরে ৩৬৫ দিন চলে। যা সবসময় চলে তার জন্য On-Demand দামে টাকা দেওয়াটা দামি পথ। মেঝেটা একটা commitment দিয়ে ঢাকো (লেসন ৪.৪), আর তার ওপরের ওঠানামার অংশটা On-Demand বা Spot-এ চলতে দাও।
প্রশ্নটা
Triangle Sunglasses website চলছে একটা Application Load Balancer-এর পেছনের Auto Scaling group-এর EC2 instance-এ। টাকা বাঁচাতে group আগে থেকেই load balancer দিয়ে যাওয়া traffic দেখে scale করছে। high availability-র জন্য তার minimum capacity ২ করা হয়েছে। requirement মেনে খরচ আরও কীভাবে কমাবে? option: ALB সরিয়ে Elastic IP ব্যবহার করো; দুটো EC2 instance reserve করো; minimum capacity ১ করো; minimum capacity ০ করো।
প্রশ্নে লুকানো requirement-টা পড়ো
“high availability-র জন্য minimum capacity ২” মানে traffic থাকুক বা না থাকুক, অন্তত দুটো instance সারাক্ষণ চলছে। এটা একটা স্থির ভিত্তি, লম্বা মেয়াদের commitment-এর একদম পাঠ্যবইয়ের উদাহরণ।
উত্তর: দুটো instance reserve করো
group-এর instance type আর Region মিলিয়ে দুটো Reserved Instance কেনো (১ বা ৩ বছর, প্রায় ৭২% পর্যন্ত ছাড়), অথবা একই খরচের একটা Savings Plan (Compute Savings Plan প্রায় ৬৬% পর্যন্ত, EC2 Instance Savings Plan প্রায় ৭২% পর্যন্ত, আর পরে instance type বদলালেও নমনীয়)। দুটো requirement-ই টিকে থাকে: min ২ high availability রাখে, আর সবসময় চালু অংশটার খরচ অনেক কমে যায়। minimum-এর ওপরের instance-গুলো On-Demand (বা Spot)-এই থাকে।
অন্য option-গুলো কেন ভুল
- ALB সরিয়ে Elastic IP: একটা Elastic IP একবারে একটাই instance-কে দেখায়। কোনো load balancing নেই, নিজে নিজে failover নেই, তাই availability শেষ, আর group ALB traffic দেখে scale-ও করতে পারবে না।
- Minimum ১: সস্তা, কিন্তু একটা instance মানে single point of failure। সেটা crash করলে নতুনটা বুট না হওয়া পর্যন্ত site বন্ধ।
- Minimum ০: traffic না থাকলে কোনো instance-ই থাকবে না, প্রথম visitor-রা error পাবে। কোনো অর্থেই highly available না।
প্রশ্নটা আরেকটা জিনিস ধরে নিয়েছে: দুটো instance তখনই highly available, যখন তারা দুটো আলাদা AZ-এ থাকে। group-কে অন্তত দুটো AZ-এর subnet দাও, ASG প্রতিটায় একটা করে বসাবে।
#এক নজরে পরীক্ষার ধরন
| প্রশ্নে বলছে… | উত্তর |
|---|---|
| নষ্ট / impaired instance নিজে নিজে বদলাও, মানুষ ছাড়া | Auto Scaling group (min = max = ১ হলেও) |
| load balancer বলছে unhealthy, ASG বদলাচ্ছে না | ASG-তে ELB health check type চালু করো |
| নতুন instance চালু শেষ হওয়ার আগেই terminate হচ্ছে | health check grace period বাড়াও (বা launch lifecycle hook) |
| On-Demand আর Spot মিশিয়ে, কয়েক ধরনের instance type, বা launch setting-এর version control | Launch template (mixed instances policy) |
| গড় CPU ৫০%-এর আশেপাশে রাখো | গড় CPU-র ওপর target tracking |
| প্রতি instance-এ request-এর সংখ্যা স্থির রাখো | ALBRequestCountPerTarget-এর ওপর target tracking |
| SQS queue দেখে worker scale করো | প্রতি instance-এ backlog-এর ওপর target tracking |
| CPU > 70% হলে ২টা যোগ, CPU < 30% হলে ১টা বাদ | CloudWatch alarm-সহ step (বা simple) scaling |
| জানা সময়ে জানা ঘটনা | Scheduled action |
| দৈনিক/সাপ্তাহিক নিয়মিত ধরন, load-এর আগেই capacity তৈরি | Predictive scaling |
| আগেরগুলো কাজ শুরুর আগেই অনেক instance চালু হচ্ছে (runaway) | Cooldown (simple scaling) / instance warm-up (target tracking, step); ready-to-serve AMI |
| scale out-এর পরে instance আরও দ্রুত তৈরি হোক | Golden AMI, ছোট user data, warm pool |
| instance terminate হওয়ার আগে script চালাও / log বাঁচাও | Terminating lifecycle hook |
| একটা instance-এ patch দাও বা সমস্যা খোঁজো, যেন বদলে না যায় | Standby |
| scale in যেন লম্বা একটা job মেরে না ফেলে | Scale-in protection |
| scale in-এর সময় চলতি request হারাচ্ছে | deregistration delay বাড়াও |
| scale in-এ কোন instance আগে যাবে | default termination policy: AZ-এর ভারসাম্য, তারপর পুরনো configuration, তারপর billing hour |
| Spot instance বারবার interrupt হচ্ছে | price-capacity-optimized, আরও instance type আর AZ, capacity rebalancing |
| সবসময় চালু minimum capacity, খরচ কমাও | Reserved Instance / Savings Plan |
#System design-এ ASG কীভাবে ব্যবহার হয়
- Web আর API tier: তিনটা AZ জুড়ে private subnet-এ stateless instance-এর একটা ASG, public subnet-এর একটা ALB-এর পেছনে, CPU বা প্রতি target-এ request দেখে scale করে। session থাকে ElastiCache বা DynamoDB-তে (Chapter ৭), কখনো instance-এ না, তাই যেকোনো instance যেকোনো সময় terminate করা যায়।
- Worker fleet: instance-গুলো SQS থেকে job পড়ে আর প্রতি instance-এ backlog দেখে scale করে, প্রায়ই বেশিরভাগটা Spot-এ, capacity rebalancing-সহ।
- নিজে নিজে সেরে ওঠা single server: যে পুরনো application cluster করা যায় না, সেও ১-এর একটা ASG থেকে স্বয়ংক্রিয় বদল পায়, সাথে launch lifecycle hook-এ Elastic IP বা DNS update।
- Immutable deployment: নতুন AMI বানাও, একটা launch template version বানাও, instance refresh চালাও (অথবা নতুন একটা ASG বানিয়ে traffic সরাও)। instance-কে কখনো জায়গায় দাঁড়িয়ে patch করা হয় না।
- খরচের স্তর: Reserved Instance বা Savings Plan ঢাকে minimum, তার ওপরের base ঢাকে On-Demand, peak সামলায় Spot, আর জানা peak-এর জন্য আগেই তৈরি থাকে scheduled আর predictive scaling।
- EC2-এর বাইরে Application Auto Scaling একই target tracking, step আর scheduled ধারণা দেয় ECS service, DynamoDB table, Aurora replica, Lambda provisioned concurrency আর আরও অনেক কিছুকে।
#নিজে করে দেখো
# 1. A group of 2 to 6 instances across three private subnets, behind an existing target group,
# using launch template web-lt (lesson 4.3) at its default version
aws autoscaling create-auto-scaling-group --auto-scaling-group-name web-asg \
--launch-template 'LaunchTemplateName=web-lt,Version=$Default' \
--min-size 2 --max-size 6 --desired-capacity 2 \
--vpc-zone-identifier "subnet-0aaa1111,subnet-0bbb2222,subnet-0ccc3333" \
--target-group-arns "$TG_ARN" \
--health-check-type ELB --health-check-grace-period 300 \
--default-instance-warmup 180
# 2. Target tracking: keep average CPU at 50%
aws autoscaling put-scaling-policy --auto-scaling-group-name web-asg \
--policy-name cpu-50 --policy-type TargetTrackingScaling \
--target-tracking-configuration '{
"PredefinedMetricSpecification": {"PredefinedMetricType": "ASGAverageCPUUtilization"},
"TargetValue": 50.0 }'
# ...or keep about 1,000 requests per instance per minute
aws autoscaling put-scaling-policy --auto-scaling-group-name web-asg \
--policy-name req-1000 --policy-type TargetTrackingScaling \
--target-tracking-configuration '{
"PredefinedMetricSpecification": {"PredefinedMetricType": "ALBRequestCountPerTarget",
"ResourceLabel": "app/web-alb/50dc6c495c0c9188/targetgroup/web-tg/943f017f100becff"},
"TargetValue": 1000.0 }'
# 3. Scheduled actions: more capacity for the Friday sale, back to normal at night
aws autoscaling put-scheduled-update-group-action --auto-scaling-group-name web-asg \
--scheduled-action-name friday-sale --recurrence "45 16 * * 5" --time-zone "Asia/Dhaka" \
--min-size 4 --desired-capacity 4
aws autoscaling put-scheduled-update-group-action --auto-scaling-group-name web-asg \
--scheduled-action-name friday-night --recurrence "0 2 * * 6" --time-zone "Asia/Dhaka" \
--min-size 2
# 4. Predictive scaling, forecast only to start with
aws autoscaling put-scaling-policy --auto-scaling-group-name web-asg \
--policy-name predict-cpu --policy-type PredictiveScaling \
--predictive-scaling-configuration '{
"MetricSpecifications": [{"TargetValue": 50,
"PredefinedMetricPairSpecification": {"PredefinedMetricType": "ASGCPUUtilization"}}],
"Mode": "ForecastOnly", "SchedulingBufferTime": 600 }'
# 5. A terminating lifecycle hook (5-minute timeout), and how a script completes it
aws autoscaling put-lifecycle-hook --auto-scaling-group-name web-asg \
--lifecycle-hook-name save-logs \
--lifecycle-transition autoscaling:EC2_INSTANCE_TERMINATING \
--heartbeat-timeout 300 --default-result CONTINUE
aws autoscaling complete-lifecycle-action --auto-scaling-group-name web-asg \
--lifecycle-hook-name save-logs --instance-id i-0abc1234def567890 \
--lifecycle-action-result CONTINUE
# 6. Watch what the group is doing, and why
aws autoscaling describe-scaling-activities --auto-scaling-group-name web-asg --max-items 5 \
--query "Activities[].[StartTime,StatusCode,Description,Cause]"
aws autoscaling describe-auto-scaling-instances \
--query "AutoScalingInstances[].[InstanceId,AvailabilityZone,LifecycleState,HealthStatus]"
# 7. Protect, park and refresh
aws autoscaling set-instance-protection --auto-scaling-group-name web-asg \
--instance-ids i-0abc1234def567890 --protected-from-scale-in
aws autoscaling enter-standby --auto-scaling-group-name web-asg \
--instance-ids i-0abc1234def567890 --should-decrement-desired-capacity
aws autoscaling exit-standby --auto-scaling-group-name web-asg --instance-ids i-0abc1234def567890
aws autoscaling start-instance-refresh --auto-scaling-group-name web-asg \
--preferences '{"MinHealthyPercentage": 90, "InstanceWarmup": 180}'
# 8. Mixed instances: base 2 On-Demand, the rest 75% Spot, several types, capacity rebalancing
aws autoscaling update-auto-scaling-group --auto-scaling-group-name web-asg --capacity-rebalance \
--mixed-instances-policy '{
"LaunchTemplate": {"LaunchTemplateSpecification": {"LaunchTemplateName": "web-lt", "Version": "$Default"},
"Overrides": [{"InstanceType": "m7i.large"}, {"InstanceType": "m6i.large"}, {"InstanceType": "c7i.large"}]},
"InstancesDistribution": {"OnDemandBaseCapacity": 2, "OnDemandPercentageAboveBaseCapacity": 25,
"SpotAllocationStrategy": "price-capacity-optimized"} }'
#সারসংক্ষেপ
মূল কথাগুলো
- Auto Scaling group সুস্থ instance-এর সংখ্যা desired-এ ধরে রাখে, সবসময় min আর max-এর মাঝে, নষ্ট instance বদলে দেয়, একটা Region-এর AZ জুড়ে ছড়িয়ে রাখে আর rebalance করে। group নিজে ফ্রি; টাকা দাও instance-এর।
- instance চালু হয় একটা launch template থেকে। Launch configuration legacy: ২০২৩ থেকে নতুন instance type নেই, আর অক্টোবর ২০২৪ থেকে খোলা account-এ বানানোই যায় না। On-Demand/Spot mix আর version-এর জন্য launch template লাগে।
- load balancer থাকলে instance নিজে নিজে register আর deregister হয়। default health check type EC2 (মেশিন বেঁচে আছে কি না); ELB চালু করো, যাতে application ভেঙে পড়া instance-ও বদলায়। grace period (console-এ ৩০০ s, CLI-তে ০) নতুন instance-কে চালু হওয়ার সময় দেয়।
- Target tracking (recommended) প্রতি instance-এর একটা metric-কে target-এর কাছে রাখে: CPU,
ALBRequestCountPerTarget, network, অথবা SQS-এর প্রতি instance-এ backlog-এর মতো custom metric। দ্রুত scale out করে, ধীরে scale in। মোট সংখ্যা, latency আর queue-র কাঁচা দৈর্ঘ্য খারাপ metric। - Step আর simple scaling তোমার CloudWatch alarm-এ চলে; জানা সময় সামলায় scheduled action; predictive scaling সর্বোচ্চ ১৪ দিনের ইতিহাস থেকে ৪৮ ঘণ্টার forecast করে, শুরু হয় forecast only mode-এ, আর কখনো scale in করে না।
- cooldown (৩০০ s) খাটে simple scaling-এ। target tracking আর step scaling ব্যবহার করে default instance warm-up, যেটা দিতে AWS জোর দিয়ে বলে। runaway scaling থামে ঠিক warm-up (simple scaling-এ cooldown) আর একটা ready-to-serve AMI দিয়ে।
- Lifecycle hook instance-কে থামায় launch-এ (
Pending:Wait) বা terminate-এ (Terminating:Wait, default timeout ১ ঘণ্টা)। Standby instance-কে সরিয়ে রাখে, detach বের করে দেয়, scale-in protection scale in থেকে বাঁচায়। - default termination policy: আগে AZ-এর ভারসাম্য, তারপর পুরনো configuration (সবচেয়ে পুরনো template version), তারপর billing hour-এর সবচেয়ে কাছে যে। Instance refresh, maximum instance lifetime আর warm pool fleet-কে টাটকা আর দ্রুত রাখে।
- mixed instances policy ঠিক করে একটা On-Demand base আর তার ওপরে একটা শতাংশ; Spot-এর জন্য price-capacity-optimized আর capacity rebalancing নাও।
- minimum capacity সারাক্ষণ চলে: এটাকে Reserved Instance বা Savings Plan দিয়ে ঢাকো (Triangle Sunglasses: দুটো instance reserve করো), আর অন্তত দুটো AZ জুড়ে ছড়াও।
আগে নিজে উত্তর দাও, তারপর ব্যাখ্যাটা পড়ো। ঠিক হলেও পড়ো, কারণ ভুল Option-গুলো কেন ভুল, সেটাও ওখানে আছে।
নিজেকে যাচাই করোপ্রশ্ন
EC2 Auto Scaling group ব্যবহার করলে তুমি কিসের টাকা দাও?
নিজেকে যাচাই করোপ্রশ্ন
একটা group-এর min ২, desired ৪, max ৮। traffic হঠাৎ বাড়লে তার target tracking policy হিসাব করল ১১টা instance লাগবে। কী হবে?
নিজেকে যাচাই করোপ্রশ্ন
default-এ একটা Auto Scaling group কোন health check ব্যবহার করে?
নিজেকে যাচাই করোপ্রশ্ন
২০২৫-এ খোলা একটা AWS account-এর একটা টিম নতুন Auto Scaling group-এর জন্য AWS CLI দিয়ে launch configuration বানাতে চাইল। কী হবে, আর তাদের কী ব্যবহার করা উচিত?
নিজেকে যাচাই করোপ্রশ্ন
কোন দুটো requirement শুধু launch template দিয়েই মেটানো যায়, launch configuration দিয়ে না?
বেছে নাও ২
নিজেকে যাচাই করোপ্রশ্ন
একটা পুরনো application ঠিক একটা EC2 instance-এ চলতে হবে। instance impaired হলে কোনো মানুষের হাত ছাড়াই নিজে নিজে বদলাতে হবে। সবচেয়ে সহজ সমাধান কী?
নিজেকে যাচাই করোপ্রশ্ন
user-রা error পাচ্ছে। ALB console দেখাচ্ছে একটা target গত দুই ঘণ্টা ধরে unhealthy, কিন্তু Auto Scaling group এখনো instance-টাকে healthy দেখাচ্ছে, বদলায়নি। একজন solutions architect কী বদলাবে?
নিজেকে যাচাই করোপ্রশ্ন
AWS CLI দিয়ে বানানো একটা Auto Scaling group ELB health check ব্যবহার করে। প্রতিটা নতুন instance launch-এর মিনিটখানেক পরে terminate হয়ে বদলে যাচ্ছে, বারবার। application চালু হতে প্রায় ৪ মিনিট লাগে। সবচেয়ে সম্ভাব্য কারণ কী?
নিজেকে যাচাই করোপ্রশ্ন
EC2 Auto Scaling target tracking policy-র জন্য কোন দুটো metric predefined?
বেছে নাও ২
নিজেকে যাচাই করোপ্রশ্ন
নিচের কোন metric-টা সরাসরি target tracking policy-র metric হিসেবে ব্যবহার করা উচিত না?
নিজেকে যাচাই করোপ্রশ্ন
একটা target tracking policy গড় CPU ৫০%-এ রাখে। group-এ ৪টা instance গড়ে ৭৫% CPU-তে চলছে। policy মোটামুটি কয়টা instance চাইবে?
নিজেকে যাচাই করোপ্রশ্ন
একটা step scaling policy জোড়া আছে গড় CPU 70%-এর ওপরের একটা alarm-এ, ধাপগুলো: 70–85% হলে ১টা instance যোগ, 85% বা তার বেশি হলে ৩টা। group-এ ৪টা instance, কোনোটা warm-up-এ নেই, আর CPU পৌঁছাল 88%-এ। নতুন desired capacity কত?
নিজেকে যাচাই করোপ্রশ্ন
একটা image-processing fleet একটা SQS queue থেকে job পড়ে। প্রতিটা instance একটা message শেষ করে ০.২ সেকেন্ডে, আর একটা message ২০ সেকেন্ডের বেশি অপেক্ষা করা চলবে না। queue-তে আছে ১,৮০০টা message। প্রতি instance-এ backlog ধরে target tracking কয়টা instance-এর দিকে যাবে?
নিজেকে যাচাই করোপ্রশ্ন
একটা simple scaling policy CPU 70% ছাড়ালে ২টা instance যোগ করে। group default cooldown ব্যবহার করে। scale out-এর দুই মিনিট পরেও alarm, alarm অবস্থাতেই আছে। group কী করবে?
নিজেকে যাচাই করোপ্রশ্ন
একটা group CPU-র ওপর target tracking policy ব্যবহার করে। প্রতিটা নতুন instance traffic নেওয়ার আগে ৬ মিনিটের একটা user data script চালায়, CPU থাকে অনেক বেশি। প্রতিবার traffic বাড়লেই group দৌড়ে maximum-এ পৌঁছায়, তারপর ধীরে ধীরে scale in করে। একজন solutions architect কী করবে?
নিজেকে যাচাই করোপ্রশ্ন
নোটে লেখা: ‘আগের instance-গুলো কাজ শুরুর আগেই ASG অনেক instance চালু করে ফেললে (runaway scaling), cooldown period বাড়াও।’ সবচেয়ে সঠিক কথা কোনটা?
নিজেকে যাচাই করোপ্রশ্ন
predictive scaling নিয়ে কোন দুটো কথা সত্য?
বেছে নাও ২
নিজেকে যাচাই করোপ্রশ্ন
একটা online দোকান প্রতি শুক্রবার বিকেল ৫টায় sale দেয়। কয়েক মিনিটের মধ্যে traffic তিনগুণ হয়, আর নতুন instance তৈরি হতে ৫ মিনিট লাগে। সবচেয়ে কম ঝামেলায় কোন সমাধান সময়মতো capacity তৈরি রাখে?
নিজেকে যাচাই করোপ্রশ্ন
একটা business application প্রতি কর্মদিবসে সকাল ৯টা থেকে সন্ধ্যা ৬টা ব্যস্ত, রাতে প্রায় অলস, আর তার instance চালু হতে ১০ মিনিট লাগে। টিম চায় হাতে schedule না সামলেই সকালের load-এর আগে capacity তৈরি থাকুক। কী ব্যবহার করবে?
নিজেকে যাচাই করোপ্রশ্ন
Triangle Sunglasses website চলছে একটা ALB-এর পেছনের Auto Scaling group-এর EC2 instance-এ। group ALB দিয়ে যাওয়া traffic দেখে scale করে, আর high availability-র জন্য তার minimum capacity ২ করা হয়েছে। requirement মেনে খরচ আরও কীভাবে কমাবে?
নিজেকে যাচাই করোপ্রশ্ন
একটা group default termination policy আর launch template web-lt ব্যবহার করে। AZ a-তে তিনটা instance (একটা version ১ থেকে, দুটো version ২ থেকে), AZ b-তে দুটো (একটা version ১, একটা version ২)। desired ৫ থেকে ৪ হলো। কোন instance terminate হবে?
নিজেকে যাচাই করোপ্রশ্ন
scale in-এর সময় একটা Auto Scaling instance terminate হওয়ার আগে তার application log Amazon S3-তে কপি করতে হবে। সবচেয়ে ভালো সমাধান কী?
নিজেকে যাচাই করোপ্রশ্ন
একজন engineer-কে Auto Scaling group-এর একটা instance-এ patch দিয়ে কয়েকবার reboot করতে হবে। সেটা traffic পাওয়া বন্ধ করবে, health check-এর কারণে বদলাবে না, আর পরে group-এ ফিরে আসবে। engineer কী করবে?
নিজেকে যাচাই করোপ্রশ্ন
group-এর একটা instance দুই ঘণ্টার একটা reporting job চালাচ্ছে, group scale in করলে যেন সেটা থেমে না যায়। বাকি instance স্বাভাবিকভাবে সরানো যাবে। কী ব্যবহার করবে?
নিজেকে যাচাই করোপ্রশ্ন
একটা mixed instances policy-তে On-Demand base capacity ২ আর base-এর ওপরে On-Demand শতাংশ ২৫। desired capacity ১০। কয়টা On-Demand আর কয়টা Spot instance চলবে?
নিজেকে যাচাই করোপ্রশ্ন
Auto Scaling group-এ Spot instance নিয়ে কোন দুটো কথা সত্য?
বেছে নাও ২
নিজেকে যাচাই করোপ্রশ্ন
health check grace period নিয়ে কোন দুটো কথা সত্য?
বেছে নাও ২
নিজেকে যাচাই করোপ্রশ্ন
একটা group তিনটা AZ জুড়ে ছড়ানো, চলছে তার maximum ৬টা instance নিয়ে। একটা AZ নষ্ট হলো, group বাকি দুটোতে নতুন instance চালাল। AZ ঠিক হলে group কী করবে?
নিজেকে যাচাই করোপ্রশ্ন
একটা web tier-কে একটা Availability Zone নষ্ট হলেও চলতে হবে, আর খরচ হতে হবে যতটা সম্ভব কম। কোন configuration সবচেয়ে মানানসই?
নিজেকে যাচাই করোপ্রশ্ন
EC2 Auto Scaling group নিয়ে কোন কথাটা সত্য না?