Στις 17 Ιουλίου, το AWS Cost Explorer έδειξε σε πελάτες εκτιμώμενους λογαριασμούς εκατομμυρίων, δισεκατομμυρίων και, σε ορισμένα screenshots, τρισεκατομμυρίων δολαρίων. Οι αριθμοί ήταν λανθασμένοι, κανείς δεν χρεώθηκε, και η AWS διόρθωσε τα δεδομένα μέσα σε μία ημέρα. Η λεπτομέρεια που αξίζει να κρατήσουμε: όσοι το αντιλήφθηκαν πρώτοι ήταν εκείνοι που είχαν ρυθμισμένες ειδοποιήσεις χρέωσης. Αυτό το άρθρο είναι τα βασικά για να τις στήσετε με το aws_budgets_budget του Terraform, από μια απλή μηνιαία ειδοποίηση κόστους μέχρι προϋπολογισμούς χρήσης και παρακολούθηση αξιοποίησης Savings Plan.

Όποιος άνοιξε το LinkedIn ή το X εκείνο το πρωί είδε το ίδιο feed: screenshots από εκτιμήσεις χρέωσης AWS με περισσότερα ψηφία από ορισμένους εθνικούς προϋπολογισμούς. Ένας χρήστης που είχε πληρώσει 0,19 δολάρια τον προηγούμενο μήνα είδε εκτίμηση σχεδόν 2,5 δισεκατομμυρίων δολαρίων. Άλλοι δημοσίευσαν αριθμούς έως και 2,5 τρισεκατομμύρια.

Τι συνέβη

Στη 1:33 π.μ. ώρα Ειρηνικού, η AWS ανάρτησε στο Health Dashboard ότι το Cost Explorer εμφάνιζε ανακριβή εκτιμώμενα δεδομένα χρέωσης, στα δικά της λόγια "reflecting inaccurate estimated billing data". Η βασική αιτία, πάλι με τη διατύπωση της AWS, ήταν "an issue with unit pricing within the estimated billing computation subsystem", δηλαδή πρόβλημα στην τιμή μονάδας μέσα στο υποσύστημα υπολογισμού εκτιμώμενης χρέωσης. Εν συντομία:

  • Οι αριθμοί ήταν εκτιμήσεις, όχι πραγματική χρήση ή χρεώσεις.
  • Κανείς δεν χρεώθηκε και δεν χρειαζόταν καμία ενέργεια από τους πελάτες.
  • Η AWS συμπλήρωσε ξανά τα δεδομένα και οι αριθμοί επανήλθαν στο κανονικό μέχρι τις 18 Ιουλίου.

Εδώ είναι το ενδιαφέρον σημείο: πολλοί έμαθαν για το bug από ένα email υπέρβασης ορίου χρέωσης. Οι λογαριασμοί με ρυθμισμένες ειδοποιήσεις εντόπισαν την ανωμαλία μέσα σε λίγα λεπτά. Οι λογαριασμοί χωρίς αυτές το έμαθαν από τα social media, ή και καθόλου.

Αυτή τη φορά επρόκειτο για ψευδή συναγερμό. Ένα ξεχασμένο NAT Gateway, μια Lambda κολλημένη σε retry loop ή ένα access key που διέρρευσε παράγουν λογαριασμό απολύτως πραγματικό. Οπότε αυτή είναι μια καλή εβδομάδα για να στήσετε ειδοποιήσεις χρέωσης, και να το κάνετε με κώδικα αντί για κλικ στην κονσόλα.

Γιατί IaC και όχι η κονσόλα

Μια ειδοποίηση που δημιουργήθηκε στην κονσόλα ζει σε έναν λογαριασμό και στη μνήμη ενός ανθρώπου. Με Terraform:

  • Ζει στο version control. Ποιος άλλαξε τι, και πότε, είναι ορατό.
  • Νέος λογαριασμός; Εφαρμόζετε το ίδιο module και κρατάτε το ίδιο πρότυπο.
  • Μια αλλαγή ορίου είναι ένα pull request που περνά από review.

Το resource που κάνει τη δουλειά είναι το aws_budgets_budget, το οποίο τυλίγει το AWS Budgets.

1. Μηνιαίος προϋπολογισμός κόστους με ειδοποίηση μέσω email

Ένας μηνιαίος προϋπολογισμός 100 δολαρίων που σας στέλνει email όταν η πραγματική δαπάνη περάσει το 80%:

resource "aws_budgets_budget" "monthly_cost" {
  name         = "monthly-cost-budget"
  budget_type  = "COST"
  limit_amount = "100"
  limit_unit   = "USD"
  time_unit    = "MONTHLY"

  notification {
    comparison_operator        = "GREATER_THAN"
    threshold                  = 80
    threshold_type             = "PERCENTAGE"
    notification_type          = "ACTUAL"
    subscriber_email_addresses = ["ops@example.com"]
  }
}

2. Έγκαιρη προειδοποίηση βάσει πρόβλεψης

Με notification_type = "FORECASTED", η AWS σας προειδοποιεί πριν ξοδευτούν τα χρήματα, όταν η πρόβλεψη για το τέλος του μήνα δείχνει ότι ο προϋπολογισμός θα ξεπεραστεί. Ο συνδυασμός με μια ειδοποίηση ACTUAL καλύπτει και τις δύο κατευθύνσεις:

resource "aws_budgets_budget" "with_forecast" {
  name         = "monthly-cost-budget"
  budget_type  = "COST"
  limit_amount = "100"
  limit_unit   = "USD"
  time_unit    = "MONTHLY"

  # Έγκαιρη προειδοποίηση αν η πρόβλεψη ξεπεράσει τον προϋπολογισμό
  notification {
    comparison_operator        = "GREATER_THAN"
    threshold                  = 100
    threshold_type             = "PERCENTAGE"
    notification_type          = "FORECASTED"
    subscriber_email_addresses = ["ops@example.com"]
  }

  # Νέα προειδοποίηση όταν η πραγματική δαπάνη περάσει το 90%
  notification {
    comparison_operator        = "GREATER_THAN"
    threshold                  = 90
    threshold_type             = "PERCENTAGE"
    notification_type          = "ACTUAL"
    subscriber_email_addresses = ["ops@example.com"]
  }
}

3. Slack ή PagerDuty μέσω SNS

Τα email χάνονται. Στείλτε την ειδοποίηση σε ένα SNS topic και συνδέστε το topic με ένα Slack webhook ή με το PagerDuty:

resource "aws_sns_topic" "billing_alerts" {
  name = "billing-alerts"
}

resource "aws_budgets_budget" "sns_alert" {
  name         = "monthly-cost-budget-sns"
  budget_type  = "COST"
  limit_amount = "100"
  limit_unit   = "USD"
  time_unit    = "MONTHLY"

  notification {
    comparison_operator       = "GREATER_THAN"
    threshold                 = 80
    threshold_type            = "PERCENTAGE"
    notification_type         = "ACTUAL"
    subscriber_sns_topic_arns = [aws_sns_topic.billing_alerts.arn]
  }
}

Το σημείο αποτυχίας εδώ: το topic policy πρέπει να παραχωρεί SNS:Publish στο service principal budgets.amazonaws.com. Χωρίς αυτό, το Budgets δεν μπορεί να παραδώσει το μήνυμα και οι ειδοποιήσεις σας εξαφανίζονται σιωπηλά. Από την πλευρά του budget δεν εμφανίζεται κανένα σφάλμα.

4. Προϋπολογισμός ανά υπηρεσία

Για να παρακολουθήσετε μία μόνο υπηρεσία, ας πούμε το EC2, προσθέστε ένα cost_filter:

resource "aws_budgets_budget" "ec2_only" {
  name         = "ec2-monthly-budget"
  budget_type  = "COST"
  limit_amount = "50"
  limit_unit   = "USD"
  time_unit    = "MONTHLY"

  cost_filter {
    name   = "Service"
    values = ["Amazon Elastic Compute Cloud - Compute"]
  }

  notification {
    comparison_operator        = "GREATER_THAN"
    threshold                  = 80
    threshold_type             = "PERCENTAGE"
    notification_type          = "ACTUAL"
    subscriber_email_addresses = ["ops@example.com"]
  }
}

5. Προϋπολογισμός χρήσης: 3 GB στο S3

Το FinOps δεν αφορά μόνο την παρακολούθηση δολαρίων· η παρακολούθηση της κατανάλωσης είναι μέρος της δουλειάς. Με budget_type = "USAGE" ο προϋπολογισμός ορίζεται σε μονάδες χρήσης αντί για νόμισμα. Ένας προϋπολογισμός που βάζει όριο 3 GB στην αποθήκευση S3:

resource "aws_budgets_budget" "s3" {
  name         = "s3-3GB-limit"
  budget_type  = "USAGE"
  limit_amount = "3"
  limit_unit   = "GB"
  time_unit    = "MONTHLY"

  notification {
    comparison_operator        = "GREATER_THAN"
    threshold                  = 80
    threshold_type             = "PERCENTAGE"
    notification_type          = "ACTUAL"
    subscriber_email_addresses = ["ops@example.com"]
  }
}

Χρήσιμο για side projects που θέλουν να μείνουν μέσα στο free tier, και για να πιάσετε το "γιατί μεγαλώνει αυτό το bucket" πριν γίνει γραμμή στον λογαριασμό.

6. Προϋπολογισμός αξιοποίησης Savings Plan

Το άλλο μισό του FinOps: το να πιάνεις την υπερβολική δαπάνη μετράει, αλλά το ίδιο μετράει και το να μη σπαταλάς την έκπτωση που έχεις προπληρώσει. Αν αγοράσατε ένα Savings Plan και η αξιοποίησή του είναι χαμηλή, η δέσμευση καίει χρήματα ενώ τα workloads σας τρέχουν on-demand αλλού. Ο τύπος προϋπολογισμού SAVINGS_PLANS_UTILIZATION παρακολουθεί ακριβώς αυτό:

resource "aws_budgets_budget" "savings_plan_utilization" {
  name         = "savings-plan-utilization"
  budget_type  = "SAVINGS_PLANS_UTILIZATION"
  limit_amount = "100.0"
  limit_unit   = "PERCENTAGE"
  time_unit    = "MONTHLY"

  cost_types {
    include_credit             = false
    include_discount           = false
    include_other_subscription = false
    include_recurring          = false
    include_refund             = false
    include_subscription       = true
    include_support            = false
    include_tax                = false
    include_upfront            = false
    use_blended                = false
  }

  notification {
    comparison_operator        = "LESS_THAN"
    threshold                  = 90
    threshold_type             = "PERCENTAGE"
    notification_type          = "ACTUAL"
    subscriber_email_addresses = ["finops@example.com"]
  }
}

Προσέξτε τον αντεστραμμένο τελεστή: comparison_operator = "LESS_THAN". Η ειδοποίηση δεν ενεργοποιείται όταν ανεβαίνει η δαπάνη, αλλά όταν η αξιοποίηση πέσει κάτω από το 90%. Το ίδιο μοτίβο λειτουργεί και για Reserved Instances με το RI_UTILIZATION.

Κλείνοντας

Τα screenshots των τρισεκατομμυρίων της 17ης Ιουλίου ήταν ένα bug εμφάνισης. Κανείς δεν πλήρωσε αυτά τα χρήματα και η AWS διόρθωσε τα δεδομένα μέσα σε μία ημέρα. Το μάθημα όμως παραμένει: μια ανωμαλία στον λογαριασμό σας πρέπει να σας φτάνει μέσα από τις δικές σας ειδοποιήσεις, όχι μέσα από το timeline σας.

  • Ορίστε έναν μηνιαίο προϋπολογισμό με το aws_budgets_budget.
  • Συνδυάστε ειδοποιήσεις FORECASTED και ACTUAL για προειδοποίηση δύο επιπέδων.
  • Δρομολογήστε τις ειδοποιήσεις μέσω SNS σε ένα κανάλι που η ομάδα σας όντως παρακολουθεί.
  • Ολοκληρώστε την εικόνα με προϋπολογισμούς χρήσης (3 GB στο S3) και παρακολούθηση αξιοποίησης Savings Plan.

Την επόμενη φορά που θα γίνει trending το "ο λογαριασμός μου στο AWS εκτοξεύτηκε", θα μπορείτε να το παρακολουθείτε πίνοντας τον καφέ σας. Για το ιστορικό του περιστατικού: το The Register και το TechCrunch το κάλυψαν όσο εξελισσόταν.

Διαβάστε στη συνέχεια

Αναφορές