FinOps روڈ میپ ٹو 2026: لاگت سے آگاہ انجینئرز سے کلاؤڈ فنانشل مینیجرز تک

میرا پہلا AWS بل $23,000 تھا۔ میں کمپنی میں 3 ہفتوں سے کام کر رہا ہوں۔

مجھے کسی نے نہیں بتایا۔ جب کہ مجھے اپنی فراہم کردہ خصوصیات پر فخر تھا، بل خاموشی سے پس منظر میں بڑھتا گیا۔ ایک لیمبڈا فنکشن جس نے صارف کے تمام ایونٹس کے لیے ایک بیرونی افزودگی API کہا۔ اپنا کوڈ صاف کریں۔ ٹھوس ٹیسٹنگ۔ اس مہینے 32 ملین واقعات ہوئے۔ $0.0007 فی API کال۔

میرے انجینئرنگ مینیجر نے مجھے دو الفاظ کے ساتھ ایک رسید دیا: "براہ کرم وضاحت کریں۔”

یہی وہ لمحہ تھا جب میں نے FinOps کو دریافت کیا۔ کسی کانفرنس ٹاک یا سرٹیفیکیشن کے عمل سے نہیں، بلکہ مہنگا کوڈ لکھنے اور سمجھوتہ مکمل ہونے تک اس کے بارے میں نہ جاننے کی مخصوص شرمندگی سے۔

اس روڈ میپ کی مجھے اس دن ضرورت تھی۔ انجینئر بنانے والی چیزوں سے کام کرنے والے انجینئروں کو کام کرنے والی چیزوں میں تبدیل کرنے کے لئے مکمل، دیانت دار گائیڈ۔ اور ان کی کیا قیمت ہونی چاہیے۔ اس گائیڈ کے اختتام تک، آپ کلاؤڈ اخراجات کے بارے میں اس طرح بات کرنے کے لیے مہارتوں، اسکرپٹس اور الفاظ سے لیس ہو جائیں گے جس طرح CFOs اور CTOs دونوں سننا چاہتے ہیں۔

انڈیکس

جو آپ سیکھیں گے۔

  • ایک غیر فعال مبصر کے بجائے بطور انجینئر اپنے AWS بل کو کیسے پڑھیں

  • لاگت کے انتساب کو فعال کرنے کے لیے درست ٹیگنگ کی حکمت عملی

  • آپ کے پاس پہلے سے موجود CloudWatch ڈیٹا کا استعمال کرتے ہوئے EC2 اور RDS مثالوں کی پیمائش کیسے کریں۔

  • سیونگس پلان کی خریداریوں کا مناسب آرڈر – ڈسکاؤنٹ ریٹ سے آرڈر کیوں زیادہ اہم ہے۔

  • یتیم وسائل کے لیے خودکار صفائی کا نظام کیسے بنایا جائے۔

  • فیصلوں کو چلانے کے لیے ڈیٹا کا استعمال کرتے ہوئے انجینئرنگ لیڈرشپ کو کلاؤڈ لاگت کی تحقیق کیسے پیش کی جائے۔

  • لاگت کے احتساب کو یقینی بنانے کے لیے چارج بیک اور شو بیک ماڈل

آئیے شروع کرتے ہیں۔

شرطیں

اس روڈ میپ پر عمل کرنے سے پہلے، آپ کو کچھ مہارتیں اور اوزار تیار کرنے کی ضرورت ہوگی۔

علم:

  • آپ اپنی درخواست AWS (EC2، Lambda، یا کنٹینرز) پر تعینات کر سکتے ہیں۔

  • بنیادی AWS خدمات کو سمجھیں: S3، RDS، EC2، VPC، اور IAM۔

  • Python کو پڑھنے اور سادہ bash اسکرپٹ لکھنے میں ماہر

  • آپ جانتے ہیں کہ پل کی درخواست کیا ہے اور آپ کم از کم ایک کوڈ کے جائزے سے گزر چکے ہیں۔

پوزیشن:

  • AWS بلنگ کنسول اور Cost Explorer تک صرف پڑھنے کے لیے رسائی

  • کم سے کم ترتیب شدہ AWS CLI v2 ReadOnlyAccess پالیسی منسلک کریں۔

  • اس گائیڈ میں آڈٹ اسکرپٹ چلانے کے لیے Python 3.9 یا اس سے زیادہ۔

ذہنیت: آپ کو مالیاتی ماہر بننے کی ضرورت نہیں ہے۔ لیکن آپ کو ان نمبروں کو دیکھنے کے لیے تیار رہنے کی ضرورت ہے جو غیر آرام دہ ہو سکتے ہیں۔ ہر وہ انجینئر جس کے ساتھ میں نے کام کیا FinOps میں مہارت حاصل کی ان میں ایک چیز مشترک تھی: وہ یہ پوچھنے کے لیے تیار ہیں، "اور اس کی قیمت کتنی ہے؟” ایک کمرے میں کوئی نہیں چاہتا۔

تخمینی وقت: یہ روڈ میپ 24 مہینوں کے دوران جان بوجھ کر مہارت کی تعمیر کا احاطہ کرتا ہے۔ آپ جو کچھ پڑھتے ہیں اسے چند شاموں میں جذب کر سکتے ہیں۔ تربیت کا دورانیہ 24 ماہ ہے۔

مرحلہ 4 جائزہ

اس سے پہلے کہ ہم کھودیں، منزل کی مکمل تصویر یہ ہے:

Stage 1 — Cost-Aware Engineer (Months 1–3)
├── Read your cloud bill and understand it
├── Tag every resource with meaningful metadata
├── Identify your top 5 cost drivers
└── Block your first expensive PR with cost justification

Stage 2 — Optimisation Specialist (Months 4–8)
├── Right-size every over-provisioned resource
├── Implement storage lifecycle policies
├── Move non-production to Spot instances
└── Purchase your first Savings Plan in the right order

Stage 3 — Automation Architect (Months 9–15)
├── Build automated cleanup for orphaned resources
├── Add cost estimation to your CI/CD pipeline
├── Create cost-aware auto-scaling triggers
└── Deploy a self-service FinOps dashboard

Stage 4 — Cloud Financial Manager (Months 16–24)
├── Lead monthly FinOps reviews with engineering leadership
├── Build chargeback models for departments
├── Negotiate enterprise agreements with AWS
└── Forecast cloud spend within 5% variance

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

مرحلہ 1: لاگت سے آگاہی انجینئر – 1-3 ماہ

1.1 ایک انجینئر کی طرح بل پڑھیں، اکاؤنٹنٹ کی طرح نہیں۔

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

ایک مناسب تجزیہ کرکے شروع کریں۔

# Pull last month's cost breakdown grouped by service
# Run this before touching any optimisation — this is your baseline
aws ce get-cost-and-usage \
  --time-period Start=\((date -d 'last month' +%Y-%m-01),End=\)(date +%Y-%m-01) \
  --granularity MONTHLY \
  --group-by Type=DIMENSION,Key=SERVICE \
  --metrics UnblendedCost \
  --query 'ResultsByTime[0].Groups[*].{Service:Keys[0],Cost:Metrics.UnblendedCost.Amount}' \
  --output table | sort -k3 -rn

آؤٹ پٹ کو محفوظ کریں۔ فائل کا نام بتائیں aws-baseline-YYYY-MM.txt. آپ آگے بڑھتے ہوئے ہر ماہ اس نمبر کا موازنہ کریں گے۔ بیس لائن کے بغیر، آپ ترقی کی پیمائش نہیں کر سکتے، اور قابل پیمائش پیش رفت کے بغیر، آپ قیادت کے سامنے یہ ظاہر نہیں کر سکتے کہ کام انجینئرنگ کے وقت کی سرمایہ کاری کے قابل ہے۔

سرفہرست پانچ خدمات کے بارے میں تین سوالات:

زیادہ تر انجینئر "یہ سروس کیا ہے؟” پر رک جاتے ہیں۔ مفید سوال پر مت پہنچیں۔ کسی اکاؤنٹ کا پہلی بار آڈٹ کرتے وقت ہم جو فریم ورک استعمال کرتے ہیں وہ ہے:

پہلا سوال یہ ہے کہ کیا آپ جانتے ہیں کہ یہ سروس کون سا مخصوص کاروباری کام انجام دیتی ہے۔ یہ ایک خصوصیت ہے، پروڈکٹ کا نام نہیں۔ "S3” جواب نہیں ہے۔ "غیر پروسیس شدہ اپ لوڈ کردہ ویڈیوز کو 90 دنوں تک اسٹور کرنا اس سے پہلے کہ کوئی انہیں دیکھ سکے” اس کا جواب ہے۔

دوسرا سوال یہ ہے کہ اگر آپ پچھلے تین مہینوں پر نظر ڈالیں تو کیا اخراجات بڑھ رہے ہیں، مستحکم ہو رہے ہیں یا کم ہو رہے ہیں؟ ایک مستحکم \(12,000/مہینہ) \)12,000/ماہ لائن سے ایک مختلف معاملہ ہے جو 6 مہینے پہلے $4,000 تھی۔

تیسرا سوال یہ ہے کہ یہ سروس کل بل کے کتنے فیصد کی نمائندگی کرتی ہے؟ 1% لائن آئٹمز کو بہتر بنانا جب کہ 40% بغیر چیک کیے چل رہے ہیں وقت ضائع کرنے کا ایک عام جال ہے۔

1.2 ٹیگ کرنے کی حکمت عملی جو حقیقت میں زندہ رہتی ہیں۔

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

کم از کم قابل عمل ٹیگ سیٹ ہے (انتساب کی ضروریات کے 90% کو پورا کرنے کے لیے 6 ٹیگ):

# These six tags enable cost attribution, accountability, and automated remediation
# Add these to every resource in your AWS account — EC2, RDS, S3, Lambda, everything

Environment: "production" | "staging" | "dev"
Team: "platform" | "backend" | "data" | "ml"
Service: "payment-api" | "fraud-detection" | "user-service"
Owner: "ayo@cloudfrugal.com"     # Person responsible for this resource
CostCenter: "engineering"         # For chargeback reporting
AutoShutdown: "true" | "false"    # Enables automated remediation

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

# variables.tf
# Add this to your Terraform root module
# Any plan that creates a resource without these tags will fail validation

variable "required_tags" {
  description = "Tags required on every resource in this account"
  type = map(string)
  
  validation {
    condition = contains(keys(var.required_tags), "Environment") &&
                contains(keys(var.required_tags), "Team") &&
                contains(keys(var.required_tags), "Owner")
    error_message = "required_tags must include Environment, Team, and Owner."
  }
}

# Apply in every resource
resource "aws_instance" "app_server" {
  ami           = data.aws_ami.amazon_linux.id
  instance_type = "t3.medium"

  tags = merge(var.required_tags, {
    Name    = "app-server-${var.environment}"
    Service = "payment-api"
  })
}

وہ تمام آئٹمز تلاش کریں جو فی الحال ٹیگ نہیں ہیں۔

# List EC2 instances missing the Team tag
# Run this weekly until you hit zero results
aws ec2 describe-instances \
  --query "Reservations[].Instances[?!not_null(Tags[?Key=='Team'].Value | [0])].[InstanceId, InstanceType, State.Name]" \
  --output table

جب آپ غیر ٹیگ شدہ وسائل کی تلاش شروع کرتے ہیں، تو آپ کو ایک نمونہ دریافت ہوگا۔ اس کا مطلب ہے کہ آپ کے اکاؤنٹ کے قدیم ترین وسائل اکثر کم سے کم ٹیگ کیے گئے اور مہنگے ہوتے ہیں۔ ٹیگنگ پالیسیوں سے پہلے 2021 میں EC2 مثالیں بالکل اسی قسم کی ہیں جو ہر ماہ $3,000 آئٹمز تیار کرتی ہیں جن کی کوئی وضاحت نہیں کر سکتا۔

1.3 لاگت سے متعلق آگاہی کوڈ کا جائزہ

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

اپنے PR ٹیمپلیٹ میں درج ذیل حصے شامل کریں:

## Cost Impact (required for infrastructure and data changes)

- [ ] This change does not affect cloud resource usage
- [ ] New API calls introduced: estimated cost per call $______, calls/month ______
- [ ] New data storage: estimated monthly delta $______
- [ ] Cross-region data transfer introduced: yes / no
- [ ] New external service dependency with per-call pricing: yes / no

If any box other than the first is checked, add a cost estimate before requesting review.

اصول یہ ہے کہ لاگت کے تخمینے کو سب سے اوپر نظرثانی کا مسئلہ بنایا جائے، نہ کہ ہر مہینے کی 15 تاریخ کو فنانس ٹیم کے ذریعے سوچنے کے بعد۔

مرحلہ 1 نتائج

تین ماہ کے اختتام تک، آپ کے پاس فائل پر لاگت کا ایک بنیادی تجزیہ ہونا چاہیے، فعال وسائل کے لیے 100% ٹیگ کوریج، مخصوص کمی کے اہداف کے ساتھ سرفہرست پانچ لاگت والے ڈرائیوروں کی شناخت، اور کم از کم ایک مہنگے PR کو بلاک کرنا چاہیے جس میں لاگت کا جواز برقرار رکھا گیا ہے۔

مرحلہ 2: اصلاح کا ماہر — 4-8 ماہ

2.1 رائٹ سائزنگ: کلاؤڈ لاگت میں کمی کا 80/20

کلاؤڈ ویسٹ کی سب سے قابل اعتماد وجہ میں نے ان تمام اکاؤنٹس میں پایا ہے جن کا میں آڈٹ کرتا ہوں اوور پروویژنڈ کمپیوٹ ہے۔

پیٹرن مسلسل ہے. انجینئر متوقع چوٹی کے بوجھ کو سنبھالنے کے لیے سائز کی مثالیں فراہم کرتے ہیں، لیکن چوٹی کا بوجھ کبھی بھی متوقع پیمانے پر پورا نہیں ہوتا، اور کوئی بھی مثال کے سائز پر نظرثانی نہیں کرتا ہے کیونکہ یہ کہنے کے لیے کوئی خودکار سگنل نہیں ہے کہ "یہ مشین %75 خالی ہے۔”

کسی بھی چیز کو تبدیل کرنے سے پہلے اپنے حقیقی استعمال کو چیک کریں۔

# rightsize_analyzer.py
# Finds EC2 instances running below 20% average CPU for 14 days
# These are right-sizing candidates — not automatic deletions

import boto3
from datetime import datetime, timedelta

def find_oversized_instances(region='us-east-1'):
    """
    Returns instances with average CPU below 20% for the last 14 days.
    Low CPU alone doesn't mean right-size — check memory too if CW agent installed.
    """
    ec2 = boto3.client('ec2', region_name=region)
    cw  = boto3.client('cloudwatch', region_name=region)

    reservations = ec2.describe_instances(
        Filters=[{'Name': 'instance-state-name', 'Values': ['running']}]
    )['Reservations']

    candidates = []

    for r in reservations:
        for inst in r['Instances']:
            iid  = inst['InstanceId']
            itype = inst['InstanceType']
            tags = {t['Key']: t['Value'] for t in inst.get('Tags', [])}

            # Pull 14-day average CPU from CloudWatch
            stats = cw.get_metric_statistics(
                Namespace="AWS/EC2",
                MetricName="CPUUtilization",
                Dimensions=[{'Name': 'InstanceId', 'Value': iid}],
                StartTime=datetime.utcnow() - timedelta(days=14),
                EndTime=datetime.utcnow(),
                Period=1209600,   # One 14-day period
                Statistics=['Average']
            )['Datapoints']

            avg_cpu = stats[0]['Average'] if stats else 0.0

            if avg_cpu < 20.0:
                candidates.append({
                    'instance_id':  iid,
                    'instance_type': itype,
                    'avg_cpu_pct':  round(avg_cpu, 1),
                    'environment':  tags.get('Environment', 'unknown'),
                    'owner':        tags.get('Owner', 'unknown'),
                    'team':         tags.get('Team', 'unknown'),
                })

    return sorted(candidates, key=lambda x: x['avg_cpu_pct'])

if __name__ == '__main__':
    results = find_oversized_instances()
    print(f"\nFound {len(results)} right-sizing candidates:\n")
    for r in results:
        print(f"  {r['instance_id']} ({r['instance_type']}) — "
              f"{r['avg_cpu_pct']}% avg CPU — "
              f"owner: {r['owner']}")

نوٹ: 20% سے کم CPU کا استعمال ایک اشارہ ہے، فیصلہ نہیں۔ کچھ کام کا بوجھ زیادہ میموری یا I/O پابند ہوتے ہیں اور صحیح سائز کے باوجود کم CPU دکھاتے ہیں۔ مناسب سائز کی سفارشات کو نافذ کرنے سے پہلے میموری کے استعمال (کلاؤڈ واچ ایجنٹ کی ضرورت ہے) اور سی پی یو کے ساتھ نیٹ ورک I/O پیٹرن چیک کریں۔

2.2 سٹوریج ٹائرنگ: کولڈ ڈیٹا کے لیے ریٹیل کی ادائیگی بند کریں۔

S3 سٹینڈرڈ کی قیمت 0.023 وون فی GB فی مہینہ ہے۔ S3 گلیشیر ڈیپ آرکائیو کی قیمت 0.00099 وون فی GB فی ماہ ہے۔ فرق 23 گنا ہے۔ اگر آپ کے پاس ایسا ڈیٹا ہے جس تک آخری بار 6 ماہ قبل رسائی ہوئی تھی اور آپ اسے S3 سٹینڈرڈ میں رکھتے ہیں کیونکہ کسی نے بھی اس کے لیے لائف سائیکل پالیسی مرتب نہیں کی ہے، تو آپ اپنی ضرورت سے 23 گنا زیادہ ادائیگی کر رہے ہیں۔

انجینئرنگ ٹیموں کے لیے مکمل S3 لائف سائیکل پالیسی:

{
  "Rules": [
    {
      "ID": "application-logs-lifecycle",
      "Status": "Enabled",
      "Filter": {"Prefix": "logs/"},
      "Transitions": [
        {"Days": 30,  "StorageClass": "STANDARD_IA"},
        {"Days": 90,  "StorageClass": "GLACIER_IR"},
        {"Days": 365, "StorageClass": "DEEP_ARCHIVE"}
      ],
      "Expiration": {"Days": 2555},
      "AbortIncompleteMultipartUpload": {"DaysAfterInitiation": 7}
    },
    {
      "ID": "training-checkpoints-lifecycle",
      "Status": "Enabled",
      "Filter": {"Prefix": "ml-checkpoints/"},
      "Transitions": [
        {"Days": 7,  "StorageClass": "STANDARD_IA"},
        {"Days": 30, "StorageClass": "GLACIER_IR"}
      ],
      "Expiration": {"Days": 90}
    }
  ]
}
# Apply the lifecycle policy to a bucket
aws s3api put-bucket-lifecycle-configuration \
  --bucket your-logs-bucket \
  --lifecycle-configuration file://lifecycle.json

# Verify it applied correctly
aws s3api get-bucket-lifecycle-configuration \
  --bucket your-logs-bucket

2.3 بچت کا منصوبہ: آرڈر ہی سب کچھ ہے۔

بچت کا منصوبہ ایک یا تین سال کے لیے AWS کمپیوٹ پر فی گھنٹہ کم از کم رقم خرچ کرنے کا عہد ہے جس کے بدلے میں آن ڈیمانڈ نرخوں پر 30-70% رعایت ہے۔ رعایت حقیقی ہے۔ ٹریپ اصلاح کرنے سے پہلے خرید رہا ہے۔

غلط ترتیب: \(میرے پاس 50,000/ماہ کا EC2 بل ہے۔ \)ایک بچت کا منصوبہ خریدیں جو 35,000/گھنٹہ پر محیط ہو۔ پھر، اگر آپ مناسب سائز کے اسپاٹ انسٹینس کو نافذ کرتے ہیں، تو آپ کا اصل خرچ ₩(22,000/مہینہ) تک کم ہو جائے گا۔ ₩22,000 کی ضرورت کے لیے 12 ماہ کے لیے ₩35,000/ماہ ادا کرنے کا عہد کیا ہے۔ غیر استعمال شدہ حساب کے لیے، 30% رعایت کے ساتھ ₩13,000/ماہ ادا کریں۔ آپ کے فضلہ کی رعایت پر مبارکباد۔

درست ترتیب:

Month 1-2: Right-size all instances using VPA and CloudWatch data
Month 3:   Move staging and development to Spot instances
Month 4:   Migrate compatible workloads to Graviton (20% cheaper)
Month 5:   Add VPC endpoints to eliminate NAT Gateway charges
Month 6:   THEN look at your steady-state On-Demand spend
Month 6+:  Purchase Savings Plans covering 70% of that optimised baseline

حساب لگائیں کہ آپ کیا وعدہ کریں گے۔

# Get your On-Demand EC2 spend for the last 30 days
# This is your rightsized baseline — the number to commit against
aws ce get-cost-and-usage \
  --time-period Start=\((date -d '30 days ago' +%Y-%m-%d),End=\)(date +%Y-%m-%d) \
  --granularity DAILY \
  --filter '{
    "And": [
      {"Dimensions": {"Key": "SERVICE",       "Values": ["Amazon Elastic Compute Cloud - Compute"]}},
      {"Dimensions": {"Key": "PURCHASE_TYPE", "Values": ["On-Demand"]}}
    ]
  }' \
  --metrics UnblendedCost \
  --query 'ResultsByTime[*].{Date:TimePeriod.Start,Cost:Total.UnblendedCost.Amount}' \
  --output table

# Get AWS's own recommendation for what to commit
aws savingsplans get-savings-plans-purchase-recommendation \
  --savings-plans-type COMPUTE_SP \
  --term-in-years ONE_YEAR \
  --payment-option NO_UPFRONT \
  --lookback-period-in-days THIRTY_DAYS

مرحلہ 3: آٹومیشن ڈیزائنر - 9-15 ماہ

3.1 یتیم وسائل کا مسئلہ – اور یہ خود حل کیوں نہیں کرتا ہے۔

یتیم وسائل جم کی رکنیت کے کلاؤڈ کے برابر ہیں جسے آپ منسوخ کرنا بھول گئے ہیں۔ وہ موجود ہیں، وہ آپ سے معاوضہ لیتے ہیں، لیکن سالانہ آڈٹ تک کوئی نوٹس نہیں کرتا۔

اصل وجہ سستی نہیں ہے۔ بنیادی ڈھانچے کی تہہ میں لائف سائیکل کا کوئی انتظام نہیں ہے۔ اگر کوئی انجینئر تجربہ کے ایک ہفتے کے لیے EC2 مثال کو گھماتا ہے اور پھر کمپنی چھوڑ دیتا ہے، تو اس بات کا کوئی خودکار سگنل نہیں ہے کہ مثال اب یتیم ہے۔ یہ وہاں بیٹھا ہے، مجھ سے ماہانہ $140 وصول کر رہا ہے، جب تک کہ کوئی اسے تلاش نہ کر لے۔

فکس ایک ہفتہ وار خودکار آڈٹ ہے جو حذف کرنے کے اہداف کی نشاندہی کرتا ہے اور رجسٹرڈ مالکان کو مطلع کرتا ہے، اور یہ عمل میں تبدیلی نہیں ہے جس کے لیے انجینئر کو صفائی یاد رکھنے کی ضرورت ہوتی ہے۔

# orphan_reporter.py
# Runs every Sunday via EventBridge → Lambda
# Posts a Slack report of orphaned resources for human review
# DOES NOT auto-delete — deletion requires a human decision

import boto3
import json
import urllib.request
from datetime import datetime, timedelta, timezone

SLACK_WEBHOOK = 'https://hooks.slack.com/services/YOUR/WEBHOOK/URL'
UNATTACHED_VOLUME_AGE_DAYS = 14
SNAPSHOT_AGE_DAYS = 90


def find_orphaned_resources():
    ec2 = boto3.client('ec2')
    report = {'monthly_waste_usd': 0, 'items': []}

    # Unattached EBS volumes
    for vol in ec2.describe_volumes(
        Filters=[{'Name': 'status', 'Values': ['available']}]
    )['Volumes']:
        age = (datetime.now(timezone.utc) - vol['CreateTime']).days
        if age >= UNATTACHED_VOLUME_AGE_DAYS:
            cost = round(vol['Size'] * 0.08, 2)  # gp3 rate
            tags = {t['Key']: t['Value'] for t in vol.get('Tags', [])}
            report['items'].append({
                'type':  'Unattached EBS Volume',
                'id':    vol['VolumeId'],
                'detail': f"{vol['Size']}GB {vol['VolumeType']} — {age} days old",
                'owner': tags.get('Owner', 'unknown'),
                'monthly_cost_usd': cost,
            })
            report['monthly_waste_usd'] += cost

    # Unassociated Elastic IPs
    for addr in ec2.describe_addresses()['Addresses']:
        if 'AssociationId' not in addr:
            report['items'].append({
                'type':  'Unassociated Elastic IP',
                'id':    addr.get('AllocationId', addr['PublicIp']),
                'detail': addr['PublicIp'],
                'owner': 'unknown',
                'monthly_cost_usd': 3.60,
            })
            report['monthly_waste_usd'] += 3.60

    # Old snapshots
    cutoff = (datetime.now(timezone.utc) - timedelta(days=SNAPSHOT_AGE_DAYS)).isoformat()
    for snap in ec2.describe_snapshots(OwnerIds=['self'])['Snapshots']:
        if snap['StartTime'].isoformat() < cutoff:
            cost = round(snap.get('VolumeSize', 0) * 0.05, 2)
            report['items'].append({
                'type':  f'Snapshot ({SNAPSHOT_AGE_DAYS}+ days old)',
                'id':    snap['SnapshotId'],
                'detail': f"Created {snap['StartTime'].strftime('%Y-%m-%d')}",
                'owner': 'unknown',
                'monthly_cost_usd': cost,
            })
            report['monthly_waste_usd'] += cost

    return report


def post_to_slack(report):
    lines = [
        f":money_with_wings: *Weekly Orphaned Resource Report*",
        f"Found *{len(report['items'])} orphaned resources* "
        f"costing *${report['monthly_waste_usd']:.2f}/month*\n",
    ]
    for item in report['items'][:20]:  # Cap at 20 lines to stay readable
        lines.append(
            f"• `{item['type']}` {item['id']} — {item['detail']} "
            f"— *${item['monthly_cost_usd']:.2f}/mo* — owner: {item['owner']}"
        )
    lines.append("\nReview and delete anything no longer needed.")

    req = urllib.request.Request(
        SLACK_WEBHOOK,
        data=json.dumps({'text': '\n'.join(lines)}).encode(),
        headers={'Content-Type': 'application/json'}
    )
    urllib.request.urlopen(req)


def lambda_handler(event, context):
    report = find_orphaned_resources()
    post_to_slack(report)
    return {
        'items_found': len(report['items']),
        'monthly_waste': report['monthly_waste_usd'],
    }

3.2 CI/CD پائپ لائن کی لاگت کا تخمینہ

مقصد یہ ہے کہ بنیادی ڈھانچے میں ہونے والی مہنگی تبدیلیوں کو PR مرحلے پر ان کی تعیناتی سے پہلے اور اس سے پہلے کہ غیر متوقع اخراجات اٹھائے جائیں۔

# .github/workflows/cost-check.yml
# Runs on any PR that touches infrastructure files
# Uses Infracost to estimate the monthly cost delta

name: Infrastructure Cost Check

on:
  pull_request:
    paths:
      - 'terraform/**'
      - 'infrastructure/**'
      - '*.tf'

jobs:
  cost-estimate:
    name: Estimate monthly cost change
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4

      - name: Setup Infracost
        uses: infracost/actions/setup@v3
        with:
          api-key: ${{ secrets.INFRACOST_API_KEY }}

      - name: Generate cost estimate
        run: |
          infracost breakdown \
            --path terraform/ \
            --format json \
            --out-file /tmp/infracost.json

      - name: Post cost diff to PR
        uses: infracost/actions/comment@v3
        with:
          path: /tmp/infracost.json
          behavior: update

      - name: Block if monthly increase exceeds threshold
        run: |
          MONTHLY_DELTA=$(cat /tmp/infracost.json | \
            jq '.projects[0].diff.totalMonthlyCost' | tr -d '"')

          echo "Estimated monthly cost change: \$$MONTHLY_DELTA"

          # Fail the PR if this change adds more than $500/month
          python3 -c "
          import sys
          delta = float('$MONTHLY_DELTA')
          if delta > 500:
              print(f'PR blocked: estimated +\\({delta:.2f}/month exceeds \\)500 threshold')
              sys.exit(1)
          else:
              print(f'Cost check passed: estimated +\${delta:.2f}/month')
          "

مرحلہ 4: کلاؤڈ فنانشل مینیجر - 16-24 ماہ

4.1 ایگزیکٹوز کے ساتھ کلیدی FinOps جائزہ

ڈیٹا 16 ماہ میں دستیاب ہوگا۔ اسٹیج 4 میں کیا تبدیلی آتی ہے سامعین۔ مثال کی اقسام اور NAT گیٹ وے کی قیمتوں کو سمجھنے کے لیے انجینئرز کو مزید پیشکشیں نہیں ہیں۔ آپ ایک CTO کو پیش کر رہے ہیں جو یہ جاننا چاہتا ہے کہ آیا بنیادی ڈھانچے کی سرمایہ کاری ان کی تخلیق کردہ کاروباری قدر کے متناسب ہے، اور ایک CFO کو جو جاننا چاہتا ہے کہ لائن کی ترقی کب رکے گی۔

الفاظ کی تبدیلیاں سادہ لیکن اہم ہیں۔ یہ کہنے کے بجائے، "ہم نے اپنے EC2 مثالوں کو صحیح سائز دیا،" ہم کہنا شروع کرتے ہیں، "ہم نے اسی درخواست کے تھرو پٹ کو برقرار رکھتے ہوئے اپنے انفراسٹرکچر یونٹ کی لاگت میں 28٪ کمی کی۔" یہ کہنے کے بجائے، "ہم نے NAT گیٹ وے فیس کو ختم کر دیا،" وہ کہنا شروع کر دیتے ہیں، "ہم نے جو کچھ ادا کیا اور ہمیں کیا کرنا تھا اس کے درمیان $6,400 ماہانہ فرق کو ختم کر دیا۔"

ہر ایگزیکٹو FinOps گفتگو کے لیے بیس لائن میٹرک فی کاروباری یونٹ لاگت ہے۔ یہ کل بل نہیں ہے (فی API کال لاگت، فی صارف لاگت، فی ٹرانزیکشن لاگت، فی ماڈل کی قیمت)۔ یہ تناسب آپ کو بتاتا ہے کہ آیا آپ کے کاروبار کے بڑھنے کے ساتھ آپ کے بنیادی ڈھانچے کی کارکردگی بہتر ہوتی ہے۔

# unit_economics.py
# Calculate cost per transaction — the metric that matters to leadership

import boto3
from datetime import datetime, timedelta

def calculate_cost_per_transaction(service_name, transaction_count, days_back=30):
    """
    Returns cost per transaction for a given service over the last N days.
    transaction_count: total transactions for the same period (from your metrics)
    """
    ce = boto3.client('ce')

    response = ce.get_cost_and_usage(
        TimePeriod={
            'Start': (datetime.now() - timedelta(days=days_back)).strftime('%Y-%m-%d'),
            'End':   datetime.now().strftime('%Y-%m-%d'),
        },
        Granularity='MONTHLY',
        Metrics=['UnblendedCost'],
        Filter={
            'Tags': {
                'Key':    'Service',
                'Values': [service_name]
            }
        }
    )

    total_cost = sum(
        float(period['Total']['UnblendedCost']['Amount'])
        for period in response['ResultsByTime']
    )

    cost_per_txn = total_cost / transaction_count if transaction_count > 0 else 0

    return {
        'service':           service_name,
        'period_days':       days_back,
        'total_cost_usd':    round(total_cost, 2),
        'transactions':      transaction_count,
        'cost_per_txn_usd':  round(cost_per_txn, 6),
    }


# Example: payment service processed 4.2M transactions this month
result = calculate_cost_per_transaction('payment-api', 4_200_000)
print(f"Cost per transaction: ${result['cost_per_txn_usd']:.6f}")
print(f"Total infrastructure cost: ${result['total_cost_usd']:,.2f}")

4.2 چارج بیک اور شو بیک ماڈل

چارج بیک کا اصل مطلب ہے کلاؤڈ کے استعمال کے لیے اپنے ڈیپارٹمنٹ کو چارج کرنا۔ شو بیک کا مطلب ہے اندرونی رسیدیں بھیجے بغیر محکمہ کے استعمال کے اخراجات دکھانا۔ دونوں ایک ہی نتیجہ پیدا کرتے ہیں۔ انجینئرز اس بات کا خیال رکھنا شروع کر دیتے ہیں کہ وہ کیا استعمال کرتے ہیں کیونکہ جس کے ساتھ وہ کام کرتے ہیں وہ اس بات کی پرواہ کرتا ہے کہ وہ کیا کھاتے ہیں۔

# showback_report.py
# Generates monthly cost-by-team report for distribution to engineering leads

import boto3
from datetime import datetime

def generate_team_showback():
    ce = boto3.client('ce')

    response = ce.get_cost_and_usage(
        TimePeriod={
            'Start': datetime.now().replace(day=1).strftime('%Y-%m-%d'),
            'End':   datetime.now().strftime('%Y-%m-%d'),
        },
        Granularity='MONTHLY',
        Metrics=['UnblendedCost'],
        GroupBy=[
            {'Type': 'TAG',       'Key': 'Team'},
            {'Type': 'DIMENSION', 'Key': 'SERVICE'},
        ]
    )

    by_team = {}
    for group in response['ResultsByTime'][0].get('Groups', []):
        team    = group['Keys'][0].replace('Team$', '') or 'untagged'
        service = group['Keys'][1]
        cost    = float(group['Metrics']['UnblendedCost']['Amount'])

        if team not in by_team:
            by_team[team] = {'total': 0, 'services': {}}
        by_team[team]['total'] += cost
        by_team[team]['services'][service] = round(cost, 2)

    # Print sorted by total cost descending
    print(f"\n{'='*52}")
    print(f"  Month-to-Date Cloud Spend by Team")
    print(f"  Generated: {datetime.now().strftime('%Y-%m-%d')}")
    print(f"{'='*52}\n")

    for team, data in sorted(by_team.items(), key=lambda x: x[1]['total'], reverse=True):
        print(f"  {team:<20} ${data['total']:>10,.2f}/month")
        top_services = sorted(data['services'].items(), key=lambda x: x[1], reverse=True)[:3]
        for svc, cost in top_services:
            print(f"    └─ {svc:<30} ${cost:>8,.2f}")
    print()

generate_team_showback()

اس روڈ میپ کے ہر قدم کے لیے اہم ٹولز میں شامل ہیں:

قدم سامان یہ کیوں اہمیت رکھتا ہے۔
1 AWS لاگت ایکسپلورر کسی بھی قیمت کے تجزیہ کے لیے مفت، بلٹ ان، نقطہ آغاز
1 AWS CLI ce حکم اسکرپٹ ایبل لاگت کے سوالات - ڈیش بورڈز خودکار نہیں ہوسکتے ہیں۔
2 AWS کمپیوٹ آپٹیمائزر EC2 اور RDS کے لیے ML پر مبنی اسکیلنگ کی سفارشات
2 VPA (Kubernetes) اصل استعمال کا استعمال کرتے ہوئے پوڈ لیول سائزنگ کی سفارشات
3 بنیادی ڈھانچے کے اخراجات Terraform تبدیلیوں کے لیے PR سطح کی لاگت کا تخمینہ
3 AWS بجٹ فعال انتباہ - آپ کا ماہانہ بل جاری ہونے سے پہلے مسائل کو پکڑیں۔
4 AWS لاگت اور استعمال کی رپورٹ + ایتھینا کسی بھی گرانولیریٹی پر ایس کیو ایل لیول بلنگ کا تجزیہ
4 CloudHealth یا Vantage ملٹی اکاؤنٹ، ملٹی کلاؤڈ لاگت کا انتظام

آپ کے وقت کے قابل سرٹیفیکیشن: وہ FinOps فاؤنڈیشن سے FinOps مصدقہ پریکٹیشنر ہے۔ اسے تیار کرنے میں 20 گھنٹے لگتے ہیں اور بیٹھنے میں $300 خرچ ہوتے ہیں۔ یہ مینیجرز اور کلائنٹس کی خدمات حاصل کرنے کی طرف اشارہ کرتا ہے کہ آپ کو نظم و ضبط کی باضابطہ سمجھ ہے۔ یہ اس وقت اہم ہے جب آپ ایگزیکٹو سطح پر FinOps گفتگو کی رہنمائی کر رہے ہوں۔

90 دن کا ایکشن پلان

1 مہینہ - بنیادی باتیں:

Cost Explorer کو چالو کریں اگر یہ پہلے سے آن نہیں ہے۔ سیکشن 1.1 سے بیس لائن کمانڈ کو کھینچیں اور آؤٹ پٹ کو محفوظ کریں۔ سیکشن 1.2 میں، ہم غیر ٹیگ شدہ وسائل کے استفسار کو چلاتے ہیں اور گمشدہ ٹیگز والے وسائل کی تعداد کو دستاویز کرتے ہیں۔ اپنے سب سے اوپر تین لاگت والے ڈرائیور تلاش کریں۔ اپنے نتائج کو اپنے انجینئرنگ مینیجر کو ایک مسئلہ کے طور پر پیش کرنے کے بجائے، اسے ایک موقع کے طور پر ایک ڈالر کے اعداد و شمار کے ساتھ پیش کریں۔

2 ماہ - فوری جیت:

اپنے EC2 فلیٹ پر سیکشن 2.1 میں اسکیلنگ اینالائزر چلائیں۔ ہم تین سب سے معتبر امیدواروں تک محدود ہیں۔ دو بڑی بالٹیوں پر S3 لائف سائیکل پالیسی کا اطلاق کریں۔ S3، ECR، اور DynamoDB کے لیے VPC اینڈ پوائنٹس بنائیں۔ ہر ایک عمل سے بچت کا تخمینہ لگائیں اور انہیں بیس لائن کے مقابلے میں دستاویز کریں۔

3 ماہ - آٹومیشن اور عادات:

یتیم رپورٹر لیمبڈا کو اتوار کے شیڈول پر تعینات کریں۔ اپنے بنیادی ڈھانچے کے ذخیرے میں لاگت چیک GitHub ایکشن شامل کریں۔ ایک ماہانہ FinOps جائزہ میٹنگ شروع کریں، چاہے یہ صرف آپ اور ایک دوسرے انجینئر ہوں۔ آپ کو سامعین کی ضرورت سے پہلے عادات تیار کریں۔

بہترین طریقوں کا خلاصہ

کرنا: اصلاح کرنے سے پہلے لاگت کی بنیاد طے کریں۔ ان کا موازنہ کرنے کے بغیر نمبر بے معنی ہیں۔

کرنا: سیونگ پلان خریدنے سے پہلے مناسب سائز کا انتخاب کریں۔ ہمیشہ آرڈر کے نتائج کو تبدیل کرتا ہے۔

کرنا: اطلاعات پر کارروائی کرنے کی بجائے انفراسٹرکچر پرت (ٹیرافارم یا کلاؤڈ فارمیشن) پر ٹیگنگ کو نافذ کریں۔

کرنا: اسٹیجنگ اور ڈیولپمنٹ کو اسپاٹ مثالوں میں منتقل کریں۔ آپ بندش کی شرح کا انتظام کر سکتے ہیں، لیکن آپ 70% لاگت کے فرق کا انتظام نہیں کر سکتے۔

کرنا: ڈیٹا کی منتقلی کے اخراجات کا جائزہ لینے سے پہلے S3، ECR، اور DynamoDB کے لیے VPC اینڈ پوائنٹس شامل کریں۔ 30 منٹ یا اس سے کم میں ہزاروں ڈالر کی لائن آئٹمز حل کریں۔

کرنا: لاگت کے نتائج کل بل کے بجائے لاگت فی بزنس میٹرک کے طور پر پیش کیے جاتے ہیں۔ "ہم نے اپنی فی ٹرانزیکشن لاگت کو \(0.0021 سے \)0.0013 تک کم کر دیا" کاروباری نتیجہ ہے۔ "$38,000/ماہ کی بچت" اکاؤنٹنگ نتیجہ ہے۔

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

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

مت کرو: سب سے پہلے، یہ انسانی جائزے کے بغیر یتیم وسائل کی صفائی کرتا ہے۔ ہم اسے صرف رپورٹ موڈ میں دو ہفتوں تک چلاتے ہیں، چیک کرتے ہیں کہ آیا امیدوار واقعی یتیم ہیں، اور پھر حذف کرنے کی منطق شامل کریں۔

وسائل

ایوبامی اڈیجومو سینئر پلیٹ فارم انجینئر اور FinOps کنسلٹنٹ۔ اس نے 20 سیریز A اور سیریز B کمپنیوں کے لیے AWS انفراسٹرکچر کا آڈٹ کیا ہے۔ وہ FinOps فاؤنڈیشن کا ایک فعال حامی ہے۔

اوپر تک سکرول کریں۔