Dateien speichern und ausliefern
Am Ende dieser Anleitung nimmt deine App Datei-Uploads entgegen, legt sie im Speicher ab und liefert sie wieder aus – über dieselbe S3-Schnittstelle, die du vielleicht schon von AWS kennst.
1. Speicher anlegen
In der Console unter Speicher → Speicher anlegen. Der Name steht später in der
Adresse und darf Kleinbuchstaben, Ziffern und Bindestriche enthalten, etwa uploads.
Sollen die Dateien ohne Schlüssel lesbar sein – typisch für Bilder einer Website – setze das Häkchen bei öffentlich lesbar. Hochladen und Löschen bleibt in beiden Fällen geschützt.
2. Mit der App verknüpfen
Auf der Detailseite wählst du unter Verknüpfte Apps deine App aus. Beim nächsten Start stehen im Container diese Variablen bereit:
SPEICHER_ENDPUNKT=https://rechenhalle.de/s3
SPEICHER_BUCKET=uploads
SPEICHER_REGION=de-fal-1
SPEICHER_ZUGRIFFSSCHLUESSEL=RH…
SPEICHER_GEHEIMNIS=…
Zusätzlich werden die üblichen AWS-Namen gesetzt – AWS_ACCESS_KEY_ID,
AWS_SECRET_ACCESS_KEY, AWS_REGION und AWS_ENDPOINT_URL –, damit
Werkzeuge, die nur diese kennen, ohne Zutun funktionieren.
3. Hochladen und lesen
// Node.js mit @aws-sdk/client-s3
import { S3Client, PutObjectCommand, GetObjectCommand } from "@aws-sdk/client-s3";
const s3 = new S3Client({
endpoint: process.env.SPEICHER_ENDPUNKT,
region: process.env.SPEICHER_REGION,
forcePathStyle: true,
credentials: {
accessKeyId: process.env.SPEICHER_ZUGRIFFSSCHLUESSEL,
secretAccessKey: process.env.SPEICHER_GEHEIMNIS,
},
});
await s3.send(new PutObjectCommand({
Bucket: process.env.SPEICHER_BUCKET,
Key: "bilder/logo.png",
Body: datei,
ContentType: "image/png",
}));
const antwort = await s3.send(new GetObjectCommand({
Bucket: process.env.SPEICHER_BUCKET,
Key: "bilder/logo.png",
}));
# Python mit boto3
import os, boto3
s3 = boto3.client(
"s3",
endpoint_url=os.environ["SPEICHER_ENDPUNKT"],
region_name=os.environ["SPEICHER_REGION"],
aws_access_key_id=os.environ["SPEICHER_ZUGRIFFSSCHLUESSEL"],
aws_secret_access_key=os.environ["SPEICHER_GEHEIMNIS"],
)
s3.upload_file("logo.png", os.environ["SPEICHER_BUCKET"], "bilder/logo.png")
forcePathStyle beziehungsweise der Pfad-Stil ist nötig: Die Adresse lautet
/s3/<speicher>/<datei>, der Speichername steht also im Pfad und nicht im Hostnamen.
4. Bilder direkt auf der Website einbinden
Ist der Speicher öffentlich lesbar, zeigt ein gewöhnlicher Link auf die Datei:
<img src="https://rechenhalle.de/s3/uploads/bilder/logo.png" alt="Logo">
Das spart den Umweg über die App: Das Bild kommt direkt vom Speicher, ohne eine Instanz zu beschäftigen.
5. Mit rclone sichern
Für Sicherungen und Umzüge eignet sich rclone. Die Konfiguration:
[rechenhalle]
type = s3
provider = Other
endpoint = https://rechenhalle.de/s3
region = de-fal-1
force_path_style = true
access_key_id = RH…
secret_access_key = …
rclone copy ./sicherung rechenhalle:uploads/sicherung
rclone ls rechenhalle:uploads
Für solche Aufgaben lohnt ein eigener Zugangsschlüssel – bei reinen Sicherungen auf einen fremden Rechner am besten einer nur mit Leserecht.
6. Was der Speicher nicht kann
Damit du es nicht erst im Betrieb merkst: Vorsignierte Adressen, Versionierung, Lebenszyklus-Regeln, Objektsperren und mehrteilige Uploads sind nicht umgesetzt. Ein Objekt darf bis 5 GB groß sein und wird in einer Anfrage übertragen.
Wer eines dieser Dinge braucht, sollte bei Amazon S3 bleiben – das schreiben wir lieber hier hin, als dass es beim Umstieg auffällt.
Häufige Fragen
Was kostet der Datenverkehr?
Nichts. Berechnet wird nur der belegte Platz mit 2 Cent je Gigabyte und Monat, das erste Gigabyte je Team ist frei.
Kann ich einen Zugangsschlüssel zurückziehen?
Ja, jederzeit auf der Detailseite des Speichers. Ab dem Löschen werden Anfragen mit diesem Schlüssel abgewiesen; andere Schlüssel laufen weiter.
Wird der belegte Platz sofort sichtbar?
Die Belegung wird alle 15 Minuten gemessen – die Anzeige kann also kurz hinterherhinken. Für die Rechnung zählt der über den Monat gemittelte Wert.