Object Storage
Object Storage bietet eine S3-kompatible API für Dateien, Backups, Assets und andere unstrukturierte Daten. Es ist für Workloads gedacht, die einen bucket-basierten Objektspeicher benötigen, statt eines Dateisystems oder einer relationalen Datenbank.
| Eigenschaft | Wert | Hinweise |
|---|---|---|
| Providername | s3 | In Landscape-Provider-Definitionen verwenden. |
| Version | v1 | Aktuelle, vom Provider bereitgestellte Schemaversion. |
| Kategorie | Storage | Wird im Managed-Services-Katalog angezeigt. |
| Geltungsbereich | global | Auf Team-Ebene verfügbar, statt an eine einzelne Workspace-Runtime gebunden zu sein. |
| Team-Singleton | false | Teams können mehrere Object-Storage-Serviceinstanzen erstellen. |
| Pause-Unterstützung | false | Dieser Provider unterstützt kein Pausieren. |
Preview-Feature
Dieser Provider ist derzeit ein Preview-Feature. Er ist standardmäßig nicht aktiviert und muss vom Betreiber freigeschaltet werden. Als Preview befindet sich der Provider noch in der Weiterentwicklung; sein Schema, seine Pläne und sein Verhalten können sich in Zukunft ändern.
Funktionsumfang
Der Dienst ist hochverfügbar: Der zugrunde liegende Ceph-Speicher ist redundant aufgebaut und auf der Speicherebene repliziert.
| Funktion | Unterstützt | Hinweise |
|---|---|---|
| Backups | ✅ | Backups von Bucket-Daten werden für S3-kompatible Backup-Stores unterstützt. |
| Point-in-Time-Recovery | ❌ | Nicht unterstützt. Ein bestimmtes Backup kann wiederhergestellt werden, jedoch nicht zu einem beliebigen Zeitpunkt. |
Schema
Config
| Feld | Typ | Bei Erstellung erforderlich | Hinweise |
|---|---|---|---|
accessKey | string | Ja | Clusterweit eindeutiger Access Key. Muss genau 20 Großbuchstaben oder Ziffern umfassen. |
userDisplayName | string | Nein | Standard: My S3 User. Anzeigename für den generierten Benutzer. |
initialBucketName | string | Ja | Clusterweit eindeutiger, initialer Bucket-Name. Ist dieser bereits vergeben, wird der Bucket nicht erstellt. |
Secrets
| Feld | Typ | Bei Erstellung erforderlich | Hinweise |
|---|---|---|---|
secretKey | string | Ja | Secret Access Key. Muss genau 40 alphanumerische Zeichen umfassen. |
Details / Output
| Feld | Typ | Verfügbarkeit | Hinweise |
|---|---|---|---|
url | string | Nach der Provisionierung verfügbar | S3-kompatible Endpoint-URL. Bei Codesphere-verwaltetem S3 ist dies immer http://rgw-load-balancer.rook-ceph.svc.cluster.local. |
userId | string | Nach der Provisionierung verfügbar | Interne Kennung des generierten Object-Storage-Benutzers. |
Plan
Der Provider stellt einen Plan bereit, Generic (id: 0), bei dem alle Quota-Parameter angepasst werden können.
Beispielplan: Generic (id: 0).
| Parameter | Typ | Standard | Minimum | Maximum | Statisch | Hinweise |
|---|---|---|---|---|---|---|
maxBuckets | integer | 50 | 1 | 1000 | Nein | Maximale Anzahl an Buckets. |
maxObjects | integer | 100000 | 1 | 10000000 | Nein | Maximale Anzahl an Objekten. |
maxSizeKb | integer | 10000000 | 1 | 10000000000 | Nein | Gesamtgrößenlimit in KB. |
maxReadOpsPerS | integer | 1000 | 1 | 10000 | Nein | Maximale Leseoperationen pro Sekunde. |
maxWriteOpsPerS | integer | 1000 | 1 | 10000 | Nein | Maximale Schreiboperationen pro Sekunde. |
maxReadBytesPerS | integer | 100000000 | 1 | 10000000000 | Nein | Maximaler Lesedurchsatz in Bytes pro Sekunde. |
maxWriteBytesPerS | integer | 100000000 | 1 | 10000000000 | Nein | Maximaler Schreibdurchsatz in Bytes pro Sekunde. |
Beispiel in einer Landscape
schemaVersion: v0.2
run:
uploads:
provider:
name: s3
version: v1
plan:
id: 0
parameters:
maxBuckets: 50
maxObjects: 100000
maxSizeKb: 10000000
maxReadOpsPerS: 1000
maxWriteOpsPerS: 1000
maxReadBytesPerS: 100000000
maxWriteBytesPerS: 100000000
config:
accessKey: "${{ workspace.env.S3_ACCESS_KEY }}"
userDisplayName: "Landscape Upload User"
initialBucketName: "${{ workspace.env.S3_BUCKET }}"
secrets:
secretKey: "${{ vault.s3SecretKey }}"
Konfiguriere in anderen Runtimes deinen S3-Client mit der zurückgegebenen url, dem konfigurierten accessKey und dem gespeicherten secretKey.
Bei Codesphere-verwaltetem S3 lautet der Endpoint immer http://rgw-load-balancer.rook-ceph.svc.cluster.local.
Derselbe S3-kompatible Endpoint ist auch von anderen Codesphere-Runtimes aus erreichbar, einschließlich Reactives, Managed Containers und Workloads innerhalb eines Virtual Clusters.
Backups
Der Object-Storage-Provider unterstützt automatisierte Backups und die Wiederherstellung in einen anderen S3-kompatiblen Backup-Store. Die allgemeinen Konzepte werden unter Managed Service Backups beschrieben.
Im Hintergrund synchronisiert ein Backup deine Buckets mit einem versionierten Ziel-Bucket im Backup-Store und nutzt dabei die S3-Objektversionierung, um historische Kopien jedes Objekts vorzuhalten. Bei der Wiederherstellung werden die Objektversionen zum Zeitpunkt eines bestimmten Backups in deinen neuen Dienst kopiert.
Backups sind inkrementell: Nach dem ersten Backup werden nur Objekte synchronisiert, die seit dem vorherigen Backup hinzugefügt, geändert oder entfernt wurden. Dadurch bleiben regelmäßige Backups schnell und speichereffizient, unabhängig davon, wie viele Daten sich bereits in deinen Buckets befinden. Ein entferntes Objekt wird nicht aus dem Verlauf des Backup-Stores gelöscht; stattdessen wird es im Ziel-Bucket mit einem Delete-Marker versehen, sodass seine früheren Versionen weiterhin verfügbar bleiben, während zukünftige Backups widerspiegeln, dass es entfernt wurde. Da jedes Objekt unabhängig und nicht als eine einzelne atomare Operation synchronisiert wird, garantiert ein Backup keine objektübergreifende Konsistenz – werden Objekte geschrieben, während ein Backup läuft, kann es sein, dass manche davon vor und andere nach der Änderung erfasst werden.
Backups aktivieren
Backups können sowohl beim Erstellen eines neuen Object-Storage-Dienstes als auch durch Aktualisieren eines bestehenden aktiviert werden, entweder über die Benutzeroberfläche oder über die API. Das folgende Beispiel aktiviert Backups für einen bestehenden Dienst; derselbe backups-Block funktioniert auch beim Erstellen eines neuen Dienstes mit POST /managed-services.
curl -X PATCH "https://api.codesphere.com/managed-services/YOUR_SERVICE_ID" \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"backups": {
"enabled": true,
"intervalH": 12,
"deleteRetentionDays": 30,
"config": {
"endpointUrl": "https://s3.eu-central-1.amazonaws.com",
"path": "my-codesphere-backups/",
"accessKeyId": "YOUR_S3_ACCESS_KEY"
},
"secrets": {
"secretKey": "YOUR_S3_SECRET_KEY"
}
}
}'
Erforderliche S3-Berechtigungen
Die Zugangsdaten (Access Key und Secret Key) für den Zugriff auf deinen S3-kompatiblen Backup-Store müssen ausreichende Berechtigungen besitzen, um den Ziel-Bucket zu erstellen, dessen Versionierungs- und Lifecycle-Konfiguration zu verwalten sowie Objekte darin zu lesen, zu schreiben und zu löschen. Für AWS S3 bedeutet dies, dass der IAM-Benutzer bzw. die IAM-Rolle, die deinem Access Key zugeordnet ist, mindestens folgende Berechtigungen benötigt.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "BucketLevelOperations",
"Effect": "Allow",
"Action": [
"s3:CreateBucket",
"s3:ListBucket",
"s3:GetBucketVersioning",
"s3:PutBucketVersioning",
"s3:GetLifecycleConfiguration",
"s3:PutLifecycleConfiguration"
],
"Resource": "arn:aws:s3:::YOUR_BUCKET_NAME"
},
{
"Sid": "ObjectLevelOperations",
"Effect": "Allow",
"Action": [
"s3:AbortMultipartUpload",
"s3:DeleteObject",
"s3:GetObject",
"s3:ListMultipartUploadParts",
"s3:PutObject"
],
"Resource": "arn:aws:s3:::YOUR_BUCKET_NAME/*"
}
]
}
Keine verifizierte Minimalrichtlinie
Diese Liste wurde aus den Operationen abgeleitet, die die Backup-Implementierung gegenüber dem Ziel-Bucket ausführt, wurde jedoch nicht End-to-End als minimal funktionierende Richtlinie getestet – sie kann umfangreicher sein als unbedingt notwendig und ist nicht dieselbe Richtlinie wie die für PostgreSQL-Backups verwendete. Wenn du eine kleinere, funktionierende Richtlinie findest, lass es uns bitte wissen, damit diese Liste weiter eingeschränkt werden kann.
Wiederherstellung aus einem Backup
Eine Wiederherstellung erzeugt immer einen neuen Object-Storage-Dienst; der bestehende Dienst bleibt unverändert. Gib das wiederherzustellende Backup mit recoverFrom.id an:
curl -X POST "https://api.codesphere.com/managed-services" \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"teamId": 123,
"name": "my-object-storage-recovered",
"provider": {
"name": "s3",
"version": "v1"
},
"plan": {
"id": 0
},
"config": {
"accessKey": "YOUR_NEW_ACCESS_KEY",
"initialBucketName": "my-bucket"
},
"secrets": {
"secretKey": "YOUR_NEW_SECRET_KEY"
},
"recoverFrom": {
"id": "BACKUP_UUID_HERE",
"config": {
"endpointUrl": "https://s3.eu-central-1.amazonaws.com",
"path": "my-codesphere-backups/",
"accessKeyId": "YOUR_S3_ACCESS_KEY"
},
"secrets": {
"secretKey": "YOUR_S3_SECRET_KEY"
}
}
}'
Haftungsausschlüsse und Einschränkungen bei Backups
- Google Cloud Storage: Backups und Wiederherstellungen funktionieren mit einem Google Cloud Storage (GCS) Backup-Store, jedoch wird die automatische Aufbewahrung (
deleteRetentionDays) gegenüber einem GCS-basierten Store noch nicht erzwungen, und das Löschen einzelner Backups wird ebenfalls noch nicht unterstützt. Dies liegt an einer Einschränkung von GCS selbst und nicht an einem bestimmten Endpoint: GCS stellt eine andere, nicht S3-kompatible Lifecycle-/Versionierungs-API bereit, sodass dies unabhängig davon gilt, auf welchen GCS-Endpoint dieendpointUrldes Backup-Stores verweist. - Keine Komprimierung: Backup-Daten werden unverändert übertragen und gespeichert, ohne zusätzliche Komprimierung.
Verbindung zu einem Object Store herstellen
Voraussetzungen
Sobald dein Object Store bereitgestellt ist, kannst du dich von deinen Codesphere-Workspaces aus damit verbinden.
Jeder Dienst listet nicht-sensible Verbindungsdetails auf seiner jeweiligen Einstellungsseite im Overview-Tab (oder in der details-Eigenschaft im öffentlichen API-Payload).
info
Stelle vor der Verbindung sicher, dass der Dienst synchronisiert ist.
Verbindung über das Terminal (mc)
Der MinIO Client (mc) ist ein robustes Werkzeug für die Interaktion mit S3-kompatiblen APIs.
# mc installieren
nix-env -iA nixpkgs.minio-client
# Alias konfigurieren
mc alias set my-storage http://rgw-load-balancer.rook-ceph.svc.cluster.local "$ACCESS_KEY" "$SECRET_KEY"
# Buckets auflisten
mc ls my-storage
# Datei kopieren
mc cp myfile.txt my-storage/my-bucket/
Verbindung über Node.js
Mit dem AWS SDK für JavaScript v3 (@aws-sdk/client-s3):
const { S3 } = require("@aws-sdk/client-s3");
const s3 = new S3({
endpoint: "http://rgw-load-balancer.rook-ceph.svc.cluster.local",
region: "us-east-1",
credentials: {
accessKeyId: "YOUR_ACCESS_KEY",
secretAccessKey: "YOUR_SECRET_KEY"
},
forcePathStyle: true,
tls: false
});
const { Buckets } = await s3.listBuckets({});
console.log(Buckets);