Arbeit mit S3 und Cloud-Speichern in Node.js: Die Bibliothek @aws-sdk/client-s3

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Arbeit mit S3 und Cloud-Speichern in JavaScript (Node.js)

\n\n

S3 (Simple Storage Service) ist der De-facto-Standard für Objektspeicher in der Cloud. Unabhängig davon, ob Sie Amazon S3, Yandex Object Storage, Mail.ru Cloud Storage oder eine lokale Lösung wie MinIO verwenden, die API bleibt einheitlich. In diesem Artikel werden wir uns ansehen, wie man mit dem offiziellen AWS SDK v3 von Node.js aus eine Verbindung zu S3-kompatiblen Speichern herstellt.

\n\n

Was ist S3 und wozu wird es benötigt?

\n

S3 ermöglicht die Speicherung einer unbegrenzten Anzahl von Dateien (Objekten) in „Buckets". Jedes Objekt hat einen eindeutigen Schlüssel (Pfad) und Metadaten. Die wichtigsten Anwendungsszenarien sind:

\n
    \n
  • Speicherung von Benutzerdateien (Avatare, Dokumente)
  • \n
  • Backups von Datenbanken und Logs
  • \n
  • Statische Dateien für Webanwendungen (Bilder, CSS, JS)
  • \n
  • Speicherung von Mediendateien (Video, Audio)
  • \n
\n\n

Installation und Konfiguration des AWS SDK v3

\n

Ab Version 3 ist das AWS SDK modular aufgebaut. Für die Arbeit mit S3 reicht die Installation eines Pakets:

\n
npm install @aws-sdk/client-s3
\n\n

Außerdem benötigen Sie Umgebungsvariablen mit den Zugriffsschlüsseln. Am besten speichern Sie diese in einer .env-Datei:

\n
AWS_ACCESS_KEY_ID=your_access_key\nAWS_SECRET_ACCESS_KEY=your_secret_key\nAWS_REGION=ru-central1\nS3_ENDPOINT=https://storage.yandexcloud.net\nS3_BUCKET=my-bucket
\n\n

Verbindung zu einem S3-kompatiblen Speicher herstellen

\n

Erstellen wir einen S3-Client mit einem benutzerdefinierten Endpunkt (für Yandex Object Storage, MinIO und andere):

\n
const { S3Client } = require('@aws-sdk/client-s3');\nrequire('dotenv').config();\n\nconst s3Client = new S3Client({\n  region: process.env.AWS_REGION,\n  endpoint: process.env.S3_ENDPOINT,\n  credentials: {\n    accessKeyId: process.env.AWS_ACCESS_KEY_ID,\n    secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,\n  },\n  forcePathStyle: true, // wichtig für MinIO und einige S3-kompatible Speicher\n});\n\nmodule.exports = s3Client;
\n\n

Grundlegende Operationen mit S3

\n\n

1. Datei hochladen (PutObject)

\n

Laden Sie eine Datei aus einem Buffer oder Stream hoch:

\n
const { PutObjectCommand } = require('@aws-sdk/client-s3');\nconst fs = require('fs');\n\nasync function uploadFile(filePath, key) {\n  const fileContent = fs.readFileSync(filePath);\n  \n  const command = new PutObjectCommand({\n    Bucket: process.env.S3_BUCKET,\n    Key: key,\n    Body: fileContent,\n    ContentType: 'image/png', // geben Sie den korrekten MIME-Typ an\n  });\n\n  try {\n    const response = await s3Client.send(command);\n    console.log('Datei hochgeladen:', response.$metadata.httpStatusCode);\n    return `https://storage.yandexcloud.net/${process.env.S3_BUCKET}/${key}`;\n  } catch (err) {\n    console.error('Fehler beim Hochladen:', err);\n  }\n}
\n\n

2. Datei herunterladen (GetObject)

\n

Objekt abrufen und lokal speichern:

\n
const { GetObjectCommand } = require('@aws-sdk/client-s3');\nconst fs = require('fs');\nconst stream = require('stream');\nconst { promisify } = require('util');\nconst pipeline = promisify(stream.pipeline);\n\nasync function downloadFile(key, destinationPath) {\n  const command = new GetObjectCommand({\n    Bucket: process.env.S3_BUCKET,\n    Key: key,\n  });\n\n  try {\n    const response = await s3Client.send(command);\n    const writeStream = fs.createWriteStream(destinationPath);\n    await pipeline(response.Body, writeStream);\n    console.log('Datei heruntergeladen:', destinationPath);\n  } catch (err) {\n    console.error('Fehler beim Herunterladen:', err);\n  }\n}
\n\n

3. Liste der Objekte abrufen (ListObjectsV2)

\n

Nützlich zur Anzeige von Dateien in einem Bucket:

\n
const { ListObjectsV2Command } = require('@aws-sdk/client-s3');\n\nasync function listFiles(prefix = '') {\n  const command = new ListObjectsV2Command({\n    Bucket: process.env.S3_BUCKET,\n    Prefix: prefix,\n    MaxKeys: 100,\n  });\n\n  try {\n    const response = await s3                    

Empfehlungen