So hält man in AWS S3 seine Kosten niedrig

AWS S3 Exploding Buckets – so behältst Du die Kosten im Griff

Avatar von Andi + Micha

Die Sache mit Kosten für AWS S3 ist ja eine Geschichte voller Missverständnisse. Doch diese Woche ist auch an uns der Post von Maciej Pocwierz mit dem Titel “How an empty S3 bucket can make your AWS bill explode“ nicht spurlos vorüber gegangen. Klang zunächst reißerisch, ist in der Sache aber leider korrekt. Jeff Barr persönlich meldete sich zügig auf Twitter / X zu Wort und versprach baldige Hilfe zum Schutz vor künftigen, ähnlichen Angriffsszenarien.

Wir nehmen das heute zum Anlass, um Licht ins Dunkel zu bringen und beleuchten dabei Sicherheits- und Kostenaspekte beim Einsatz von Amazon S3. Und die Tipps darfst du gern ausprobieren und selbst umsetzen.

Faktencheck und ein bisschen Detailwissen

S3 ist einer der ältesten Webservices von Amazon überhaupt. Er ist public by design, was bedeutet, dass man grundsätzlich jedes namentlich bekannte Bucket wie folgt aufrufen kann:

## "Path Style":
https://s3.<region>.amazonaws.com/<bucket>/<key>

## "Virtual Host Style"
https://<bucket>.<region>.s3.amazonaws.com/<key>

Das heißt: kennt man den Namen und die Region des Buckets, kann man versuchen, auf diesen und seine Inhalte (Dateien) per HTTPS zuzugreifen.

So verringerst du die Wahrscheinlichkeit, dass jemand Bucket-Namen errät:

Tipp 1
Verwende einen zufälligen Prefix oder Suffix im Namen beim Erstellen deines Buckets. Beispiel (programmatisch):

uuidgen | cut -d"-" -f1,2,3 | tr 'A-Z' 'a-z'

Achtung: die maximale Länge des Namens darf 63 Zeichen nicht überschreiten!

Wie funktioniert überhaupt die S3-Abrechnung?

Abgerechnet wird hier nach S3 Storage Class, Datenvolumen und Transfer.

Ein Beispiel: Ein 20 GB großer Bucket in Frankfurt mit jeweils 2,5 Mio. PUT & GET Requests pro Monat – was in der Tat schon große Menge Request ist – schlägt wie folgt zu Buche …

Tiered price for: 20 GB
20 GB x 0.0245 USD = 0.49 USD
Total tier cost = 0.49 USD (S3 Standard storage cost)
2,500,000 PUT requests for S3 Standard Storage x 0.0000054 USD per request = 13.50 USD (S3 Standard PUT requests cost)
2,500,000 GET requests in a month x 0.00000043 USD per request = 1.075 USD (S3 Standard GET requests cost)
0.49 USD + 1.075 USD + 13.50 USD = 15.06 USD (Total S3 Standard Storage, data requests, S3 select cost)
S3 Standard cost (monthly): 15.06 USD

Kurz erwähnt sei die noch relativ neue Storage Class “Express One”. Sie bietet teilweise weniger Features als andere Classes, ist aber rasend schnell und z. B. interessant für Generative AI/ML-Daten. Mehr zu Express One findet ihr in unserem Blog.

Best Practices für mehr Sicherheit und Kostenkontrolle in AWS S3

Tipp 2

Block Public Access

Das verhindert zwar keine unautorisierten Zugriffsversuche, schützt aber in jedem Fall deine Daten im Bucket. Denn: Ohne entsprechende Berechtigung kommt man schlicht nicht “rein”.

Du kannst diese Einstellung global pro Account oder pro Bucket aktivieren.

Buckets immer als private konfigurieren, wenn sie nicht öffentlich zugänglich sein sollen (was im Übrigen selten der Fall sein sollte!). Anders gesagt: lasse nur authentifizierten Zugriff auf deine Buckets zu. In der AWS Management Console findest du diese Account-weite Einstellung hier:

Programmatisch geht das auch, und zwar so

resource "aws_s3_account_public_access_block" "s3_control" {
  block_public_acls       = true
  block_public_policy     = true
  ignore_public_acls      = true
  restrict_public_buckets = true
}
aws s3control put-public-access-block \
  --account-id <value> \
  --public-access-block-configuration \
  '{"BlockPublicAcls": true, \
    "BlockPublicPolicy": true, \
    "IgnorePublicAcls": true, \
    "RestrictPublicBuckets": true \
  }' 
Tipp 3

IAM Access Analyzer spürt External Access auf

Dieser kostenlose Service ist unter IAM zu finden und pro Region aktivierbar.

Damit kannst du über deine gesamte AWS-Organisation mögliche, unbeabsichtigte Zugriffe analysieren und beheben.

Beispiel-Finding gefällig? Hier sitzt ein S3 Bucket offenbar hinter einer CloudFront-Distribution:

Tipp 4

Regelmäßiges Aufräumen von Partial Uploads

  • Sie entstehen durch fehlerhafte Uploads und belegen unnötigen Datenspeicher
  • Storage Lens unterstützt dabei solche Daten in den Buckets zu finden, mit Hilfe von S3 Lifecycle Rules können diese auch automatisiert entfernt werden

Durch die Lupe geschaut: Storage Lens Dashboard

Das Dashboard hilft dir dabei, Daten im S3 zu analysieren und zu verstehen. Daraus können Rückschlüsse gezogen werden, um Kosten einzusparen:

  • 60 Metriken sind für die Analyse kostenlos
  • Advanced-Metriken kosten extra
Tipp 5

Housekeeping S3 Focus Session

Widme eine ganze Housekeeping-Session dem Thema S3 allein. Vermittle deinem Team die Wichtigkeit von Kosten & Sicherheit bei der Nutzung von S3. Und bringe am besten alle Tipps aus diesem Beitrag mit.

Tipp 6

Cost Explorer: S3 Usage Reports

Behalte stets den Überblick über die S3-Ausgaben & -Nutzung.

Mit Hilfe von Cost Allocation Tags kannst du darüber hinaus noch detaillierter hinter die Kulissen blicken: Buckets können dann z. B. gezielt Teams, Projekten oder Kostenstellen zugeordnet werden.

Im folgenden Beispiel gruppieren wir die S3-Nutzung & -Ausgaben über die letzen 6 Monate:

Tipp 7
Versionierung mit Lifecycle Rules

Versionierung von Objekten ist eine prima Sache: versehentlich veränderte Dateien können so einfach wiederhergestellt oder zum Vergleich genutzt werden. Was aber, wenn sich viele Objekte (Dateien) sehr häufig ändern? Dann haben wir u. U. hunderte Objektversionen … und das wirkt sich natürlich auch auf die Kosten aus!

Lifecycle Rules helfen dir dabei, vollautomatisch ältere Versionen in günstigere Speicherklassen zu verschieben oder gar zu löschen. Und natürlich bleibt die aktuellste Version trotzdem immer erhalten!

Tipp 8
Unnötige Transferkosten durch Redirects sparen

In aller Kürze: Im programmatischen Umfeld immer die Region setzen!

Hier ein Beispiel, in dem ein HTTP Redirect (Location Header) ausgelöst wird:

Der Bucket liegt standardmäßig in der Region eu-central-1.

Der Entwickler hat keine Region gesetzt und sein Code wird zufällig in der Region eu-west-1 ausgeführt. Er möchte nun auf den Bucket zugreifen – AWS generiert passend zur aktuellen Region die URL https://s3.eu-west-1.amazonaws.com/<bucket>, was zum besagten Redirect führt, da der Bucket eigentlich in https://s3.eu-central-1.amazonaws.com/<bucket> angelegt ist.

Das ist nur ein einfacher Redirect mit sehr geringen Daten. Man stelle sich nun folgendes vor: bei jedem Zugriff auf das System – sei es durch die Benutzer, durch Cronjobs oder im schlimmsten Fall auf Grund eines unbekannten Bugs – wird dieser Redirect ausgeführt … Daraus werden schnell millionenfache Aufrufe, die dann spürbare Kosten verursachen.

Tipp 9
S3 Accesslogs aktivieren

Damit werden sämtliche Zugriffe ebenfalls in S3 geloggt. Du kannst die entstandenen Logfiles später auswerten, etwa mit Athena. Denk auch hier an die Lifecycle Rules!

Die Wahrheit am Ende

Richtig kontrollieren können wir S3 Requests und unerwünschten Traffic nur mittels AWS Shield Advanced oder CloudFront in Kombination mit WAF. Diese Services sind kostenintensiv, können aber im Bedarfsfall auch DDoS-Attacken mitigieren.

Mehr Infos dazu:

Avatar von Andi + Micha

Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert


Für das Handling unseres Newsletters nutzen wir den Dienst HubSpot. Mehr Informationen, insbesondere auch zu Deinem Widerrufsrecht, kannst Du jederzeit unserer Datenschutzerklärung entnehmen.