GOOGLE CLOUD STORAGE → STACKIT OBJECT STORAGE · TUTORIAL

Google Cloud Storage zu STACKIT Object Storage

Ein Cloud-Storage-Bucket wird zu einem STACKIT-Object-Storage-Bucket, und der Lauf schreibt diesen Bucket mit seinem Namen und sonst nichts. Versionierung, Lifecycle-Regeln, CORS, die Website-Einstellung, öffentlicher Zugriff und Sperren werden über die S3-API oder das Projekt gesetzt; der Lauf führt jede auf, die er offen lässt. Dieses Tutorial begleitet eine Demo-Umgebung mit drei Buckets von der Eingabe bis zur To-do-Liste und zeigt dann die Aufrufe, die die Einstellungen übertragen, sowie die Grenzen, die Sie zuerst prüfen.

Drei Buckets hinein, drei Buckets heraus

Eine für diese Seite geschriebene Demo-Umgebung, am 4. November 2026 mit StackToIT bewertet, Google-Provider auf 8.4.0 festgelegt: ein Asset-Bucket mit Versionierung, Lifecycle-Regeln und CORS, ein Bucket, der eine Website für alle ausliefert, und ein Audit-Bucket mit gesperrter Aufbewahrungsrichtlinie. Links Asset- und Audit-Bucket aus der Eingabe. Rechts die drei Bucket-Blöcke, die die Engine geschrieben hat, in der Reihenfolge der Datei; die Prüfkommentare über jedem Block sind hier weggelassen. Die Eingabeblöcke stehen in main.tf nicht direkt hintereinander; jeder steht deshalb wörtlich in einem eigenen Ausschnitt.

Eingabe: google_storage_bucket.mediamain.tf
resource "google_storage_bucket" "media" {
  name                        = "media-prod-assets"
  location                    = "EUROPE-WEST3"
  storage_class               = "STANDARD"
  uniform_bucket_level_access = true
  public_access_prevention    = "enforced"

  versioning {
    enabled = true
  }

  lifecycle_rule {
    condition {
      age                = 30
      with_state         = "ARCHIVED"
      num_newer_versions = 3
    }
    action {
      type = "Delete"
    }
  }

  lifecycle_rule {
    condition {
      age = 365
    }
    action {
      type          = "SetStorageClass"
      storage_class = "COLDLINE"
    }
  }

  cors {
    origin          = ["https://www.example.com"]
    method          = ["GET", "HEAD"]
    response_header = ["Content-Type"]
    max_age_seconds = 3600
  }
}
Eingabe: google_storage_bucket.auditmain.tf
resource "google_storage_bucket" "audit" {
  name                        = "media-prod-audit"
  location                    = "EUROPE-WEST3"
  uniform_bucket_level_access = true

  retention_policy {
    retention_period = 31536000
    is_locked        = true
  }

  labels = {
    purpose = "audit"
  }
}
STACKIT-Terraform von StackToITterraform/storage.tf
resource "stackit_objectstorage_bucket" "audit" {
  project_id = var.project_id
  name       = "media-prod-audit"
}

resource "stackit_objectstorage_bucket" "media" {
  project_id = var.project_id
  name       = "media-prod-assets"
}

resource "stackit_objectstorage_bucket" "site" {
  project_id = var.project_id
  name       = "media-prod-site"
}
  • Die Bucket-Ressource ist ein Name

    Der Lauf hält fest, dass stackit_objectstorage_bucket nur einen Namen und eine Object-Lock-Einstellung kennt. Alles andere am Google-Bucket, von der Speicherklasse bis zur Aufbewahrung, wird über die S3-API gesetzt oder nicht übernommen.

  • Eine Einheit pro Bucket, eine Klasse

    Jeder Bucket ist eine eigene Einheit, klassifiziert als RECONFIGURE mit mittlerer Konfidenz. Der Service Account der Demo, der in den Asset-Bucket hochlädt, ist eine eigene Einheit und wird zu einem STACKIT-Service-Account.

  • Bucket-Namen gehören nicht Ihnen allein

    Bucket-Namen sind 3 bis 63 Zeichen lang. Zur Eindeutigkeit widersprechen sich die STACKIT-Seiten: Laut Limits-Seite muss ein Name im gesamten System eindeutig sein, auch über Projekte hinweg; laut Konzeptseite innerhalb einer Region, wobei EU01 und EU02 unabhängig sind. In beiden Fällen kann ein bei Google Cloud freier Name hier vergeben sein; sichern Sie ihn daher früh. Der Lauf bittet Sie, den Namen gegen die Anwendungen zu bestätigen, die ihn nutzen.

Was der Entwurf nicht übernimmt

Wörtliche Kommentarzeilen über dem Asset- und dem Website-Bucket in terraform/storage.tf, dann die beiden Befunde für den versionierten und den gesperrten Bucket so, wie assessment.json sie enthält, ohne ihre Beleglisten. Der letzte Ausschnitt zeigt die Konsolenzeilen des Laufs.

Kommentarzeilen im Entwurf (Asset-Bucket)terraform/storage.tf
# NOT CARRIED (google_storage_bucket.media): lifecycle_rule — stackit_objectstorage_bucket has a name and object_lock only (pinned provider): lifecycle rules (expiry, storage-class transitions) are not generated.
# NOT CARRIED (google_storage_bucket.media): cors — stackit_objectstorage_bucket has no CORS attribute (pinned provider): the CORS configuration is not generated.
# NOT CARRIED (google_storage_bucket.media): storage_class = STANDARD — stackit_objectstorage_bucket has a name and object_lock only (pinned provider): the bucket's storage class, Autoclass, hierarchical-namespace and requester-pays settings are not generated.
Kommentarzeilen im Entwurf (Website-Bucket)terraform/storage.tf
# NOT CARRIED (google_storage_bucket.site): website — stackit_objectstorage_bucket has no static-website setting (pinned provider): the index and error pages are not generated — serve the site through the STACKIT CDN or a web server.
Befunde (Auszug)assessment.json
{"check_id":"gcs-versioning","severity":"warning","message":"Object versioning is enabled. STACKIT Object Storage supports versioning through the S3 API (put-bucket-versioning; once enabled it can only be suspended), but stackit_objectstorage_bucket has no versioning attribute — enable it after the bucket exists."
{"check_id":"gcs-retention-lock","severity":"info","message":"A retention policy (WORM) is set; STACKIT Object Storage supports object lock — check the retention period against its limits."
Konsolenzusammenfassung (ausgewählte Zeilen)terminal output
Source        6 resources · 4 units · visibility: Complete
Migration     4 drafted (of 4 units the draft considered)
  • Lifecycle, CORS und Speicherklasse

    Drei Zeilen für den Asset-Bucket: Lifecycle-Regeln, CORS und Speicherklasse werden nicht erzeugt. Es sind kritische Einstellungen, die offen bleiben, bis eine Person sie am Bucket setzt oder festhält, dass die Produktion sie nicht braucht.

  • Die Website bleibt Sache eines Webservers

    STACKIT Object Storage führt keine Website-Operation auf, und der Lauf rät, den Inhalt über das STACKIT CDN mit dem Bucket als Origin oder über einen Webserver auszuliefern. Die Namen von Index- und Fehlerseite sind als nicht übernommen festgehalten.

  • Versionierung braucht einen Aufruf nach der Erstellung

    STACKIT unterstützt Versionierung über die S3-API, doch die Bucket-Ressource hat kein Versionierungsattribut; Sie aktivieren sie daher, sobald der Bucket existiert. Die Aufbewahrungssperre ist ein anderer Fall: Die Sperre bei STACKIT ist eine Eigenschaft des Buckets bei der Erstellung.

Cloud Storage, Einstellung für Einstellung

Cloud StorageSTACKIT Object StorageWas zu tun ist
Standort EUROPE-WEST3Region des Providers, eu01 oder eu02Residenz bestätigen; der Entwurf setzt keine Region am Bucket
Speicherklasse STANDARD, COLDLINE-RegelEine Klasse; kein Übergang dokumentiertKapazitätskosten vergleichen; Klassenregel streichen
VersionierungPut-bucket-versioning; nur aussetzen, nie abschaltenNach der Erstellung aktivieren; bis zu 1.000 Versionen pro Objekt
Löschregel für archivierte VersionenAblauf nicht aktueller Versionen in TagenNach Tagen nachbauen; eine Anzahl neuerer Versionen hat keine dokumentierte Entsprechung
CORS-RegelPut-bucket-cors, Regeln mit Origins, Methoden, HeadernGoogle gibt response_header sowohl in Access-Control-Allow-Headers als auch in Access-Control-Expose-Headers zurück; tragen Sie die Header daher unter AllowedHeaders und ExposeHeaders ein
Website-Hauptseite und 404Nicht unter den unterstützten OperationenCDN mit dem Bucket als Origin oder ein Webserver
IAM-Mitglied allUsers, objectViewerBucket-Policy mit Principal *Nur neu anlegen, wenn weiter gewollt
IAM-Mitglied Service Account, objectAdminCredentials-Gruppe und eine Bucket-Policy, die sie nenntZugangsdaten gelten pro Projekt
Gesperrte Aufbewahrungsrichtlinie, ein JahrObject Lock, bei der Bucket-Erstellung gesetzt, höchstens 365 TageBraucht zuerst einen Compliance Lock auf Projektebene

Klassen und offene Einstellungen, wie der Lauf sie entschieden hat; STACKIT-Grenzen aus den Referenzseiten zu Object Storage.

Einstellungen von Hand übertragen

Keine Engine-Ausgabe. Die Aufrufe folgen den STACKIT-Anleitungen zu Versionierung, CORS und Bucket-Policies sowie der Object-Lock-Seite für den Audit-Bucket. Die Werte stammen aus der Demo-Eingabe.

S3-API-Aufrufeshell
# Written by hand from the STACKIT documentation, not engine output.
# Endpoint of region eu01: https://object.storage.eu01.onstackit.cloud
EP=https://object.storage.eu01.onstackit.cloud

# 1. Versioning (media-prod-assets): once enabled it can only be suspended
aws s3api put-bucket-versioning --bucket media-prod-assets \
  --versioning-configuration Status=Enabled --endpoint-url $EP

# 2. CORS (media-prod-assets): cors-rules.json
# response_header in Google is returned as Access-Control-Allow-Headers and
# Access-Control-Expose-Headers (XML API), so list it in both
{
  "CORSRules": [{
    "AllowedOrigins": ["https://www.example.com"],
    "AllowedMethods": ["GET", "HEAD"],
    "AllowedHeaders": ["Content-Type"],
    "ExposeHeaders": ["Content-Type"],
    "MaxAgeSeconds": 3600
  }]
}
aws s3api put-bucket-cors --bucket media-prod-assets \
  --cors-configuration file://cors-rules.json --endpoint-url $EP

# 3. Public read (media-prod-site): policy.json
{
  "Statement": [{
    "Sid": "public-read",
    "Effect": "Allow",
    "Principal": "*",
    "Action": "s3:GetObject",
    "Resource": "urn:sgws:s3:::media-prod-site/*"
  }]
}
aws s3api put-bucket-policy --bucket media-prod-site \
  --policy file://policy.json --endpoint-url $EP
Object Lock für den Audit-Bucketapi
# Written by hand from the STACKIT documentation, not engine output.
# Project level, once: POST .../v1/project/{projectId}/compliance-lock
# Per bucket, at creation only:
POST https://object-storage.api.{region}.stackit.cloud/v1/project/{projectId}/bucket/media-prod-audit?objectLockEnabled=true
# Default retention (applies to objects uploaded after the update):
PUT  .../v1/project/{projectId}/bucket/media-prod-audit/default-retention
{ "mode": "COMPLIANCE", "days": 365 }
  • Die Sperre entscheidet sich bei der Erstellung

    Laut STACKIT lässt sich Object Lock nur bei der Erstellung des Buckets aktivieren und danach nicht mehr abschalten. Das Projekt braucht zuvor seinen Compliance Lock, und ein Projekt mit diesem Lock lässt sich nicht löschen. Entscheiden Sie das vor dem ersten Apply, nicht erst nach dem Datenumzug.

  • 365 Tage sind die Obergrenze

    Die Aufbewahrungsdauer der Demo beträgt 31.536.000 Sekunden, genau 365 Tage, und damit die maximale Aufbewahrung, die STACKIT für den Compliance Lock nennt. Eine Google-Richtlinie über ein Jahr hinaus übersteigt dieses Maximum. Die Standardaufbewahrung gilt zudem nur für Objekte, die nach ihrer Festlegung hochgeladen werden; planen Sie also, dass kopierte Objekte ihre Frist beim Hochladen beginnen, und testen Sie das an einem Übungs-Bucket.

  • Zugangsdaten gelten projektweit

    STACKIT-Zugangsdaten sind auf das Projekt begrenzt; ein Schlüssel erreicht daher jeden Bucket darin. Zur Trennung von Teams nutzen Sie Credentials-Gruppen in Bucket-Policies oder getrennte Projekte. Das Größenlimit einer Bucket-Policy liegt bei 20.480 Byte.

Die Migration der Reihe nach

  1. Buckets und Clients inventarisieren

    Erfassen Sie Buckets, Objektanzahlen und Größen sowie, wer liest oder schreibt. Finden Sie Anwendungen mit Google-Client-Bibliotheken oder Signed URLs: Sie brauchen eine Codeänderung hin zu einem S3-SDK. Der Lauf sieht weder Objekte noch Clients.

  2. Buckets anlegen, die Sperre zuerst entscheiden

    Wenden Sie die erzeugten Bucket-Blöcke in einem Testprojekt an. Legen Sie jeden Bucket, der Object Lock braucht, mit bereits bei der Erstellung aktivierter Sperre an. Prüfen Sie Namen und Region.

  3. Versionierung, Lifecycle, CORS und Policy setzen

    Führen Sie die S3-API-Aufrufe oben aus. Lesen Sie jede Konfiguration mit dem passenden get-Aufruf zurück und vergleichen Sie sie mit der Quelle.

  4. Zugangsdaten anlegen

    Erzeugen Sie Object-Storage-Zugangsdaten im STACKIT-Projekt und ersetzen Sie die HMAC-Schlüssel oder den Service-Account-Zugriff, den Anwendungen bei Google Cloud nutzten.

  5. Daten kopieren

    Kopieren Sie mit einem Werkzeug, das beide Seiten spricht, zum Beispiel rclone mit einem Google-Cloud-Storage-Remote und einem S3-Remote für den STACKIT-Endpunkt; der Lauf nennt rclone als Kopiermethode. S3-Werkzeuge können die Quelle auch über die XML-API mit HMAC-Schlüsseln lesen. Machen Sie zuerst eine Vollkopie, dann beim Cutover eine Delta-Kopie. Das ist allgemeine Praxis, kein Schritt, den die Engine ausführt.

  6. Prüfen, umstellen, Quelle behalten

    Vergleichen Sie Objektanzahlen und Prüfsummen, stellen Sie Endpunkte und Schlüssel der Anwendungen um und halten Sie die Google-Buckets schreibgeschützt, bis die neuen echten Verkehr getragen haben.

Fragen, die Storage-Teams stellen

Brauchen die Anwendungen Codeänderungen?

Clients, die schon die S3-kompatible XML-API mit HMAC-Schlüsseln nutzen, ändern Endpunkt und Schlüssel. Clients mit den Google-Cloud-Storage-Bibliotheken über die JSON-API und davon erzeugte Signed URLs wechseln auf ein S3-SDK. Der Lauf führt das als Prüfschritt.

Lassen sich Lifecycle-Regeln eins zu eins kopieren?

Nein. STACKIT dokumentiert den Ablauf aktueller Objekte und nicht aktueller Versionen in Tagen, mit Präfix- und Tag-Filtern, bis zu 1.000 Regeln. Speicherklassen-Übergänge und Zählungen neuerer Versionen stehen nicht in dieser Referenz; solche Regeln werden neu gebaut oder gestrichen.

Was passiert mit der statischen Website?

STACKIT Object Storage führt keine Website-Operation auf. Liefern Sie den Inhalt über das STACKIT CDN mit dem Bucket als Origin oder über einen Webserver aus und legen Sie die öffentliche Leserichtlinie nur neu an, wenn sie weiter gewollt ist.

Zieht die gesperrte Aufbewahrungsrichtlinie um?

Nicht als Einstellung. Object Lock wird bei der Erstellung eines Buckets aktiviert, braucht den Compliance Lock des Projekts und erlaubt höchstens 365 Tage. Vergleichen Sie Ihre Aufbewahrungsanforderung damit, bevor Sie sich entscheiden.

Quellen

Ihr nächster Schritt: STACKIT.

Erzählen Sie uns von Ihrer Umgebung. Wir zeigen Ihnen, was StackToIT dafür liefert: Zielarchitektur, Terraform-Artefakte und einen strukturierten Migrationsplan.