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.
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
}
}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"
}
}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.
# 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.# 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.{"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."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 Storage | STACKIT Object Storage | Was zu tun ist |
|---|---|---|
| Standort EUROPE-WEST3 | Region des Providers, eu01 oder eu02 | Residenz bestätigen; der Entwurf setzt keine Region am Bucket |
| Speicherklasse STANDARD, COLDLINE-Regel | Eine Klasse; kein Übergang dokumentiert | Kapazitätskosten vergleichen; Klassenregel streichen |
| Versionierung | Put-bucket-versioning; nur aussetzen, nie abschalten | Nach der Erstellung aktivieren; bis zu 1.000 Versionen pro Objekt |
| Löschregel für archivierte Versionen | Ablauf nicht aktueller Versionen in Tagen | Nach Tagen nachbauen; eine Anzahl neuerer Versionen hat keine dokumentierte Entsprechung |
| CORS-Regel | Put-bucket-cors, Regeln mit Origins, Methoden, Headern | Google 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 404 | Nicht unter den unterstützten Operationen | CDN mit dem Bucket als Origin oder ein Webserver |
| IAM-Mitglied allUsers, objectViewer | Bucket-Policy mit Principal * | Nur neu anlegen, wenn weiter gewollt |
| IAM-Mitglied Service Account, objectAdmin | Credentials-Gruppe und eine Bucket-Policy, die sie nennt | Zugangsdaten gelten pro Projekt |
| Gesperrte Aufbewahrungsrichtlinie, ein Jahr | Object Lock, bei der Bucket-Erstellung gesetzt, höchstens 365 Tage | Braucht 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.
# 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# 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
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.
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.
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.
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.
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.
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
- STACKIT Object Storage: Konzepte
- STACKIT Object Storage: Limits
- STACKIT: Referenz zur Lifecycle-Konfiguration
- STACKIT: Object Lock anlegen und verwalten
- STACKIT: Bucket-Policies verwalten
- STACKIT Object Storage: unterstützte Operationen auf Buckets und Objekten
- Google Cloud: Cross-origin resource sharing (CORS)
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.