S3-Object-Storage anlegen und nutzen

S3-Object-Storage anlegen und nutzen

In Zeiten der Hochverfügbarkeit und mehreren Webservern muss irgendwie die Grätsche zwischen der zentralen Datenhaltung, Datensicherheit und schnellen Zugriffszeiten geschafft werden. Genau dafür nutzen immer mehr Anwender nun Technologien, die mit Schlagwörtern wie S3, Buckets, Objectstorage und Swift locken. Das bieten wir von NETWAYS Web Services auch schon seit einiger Zeit an, aber wie uns aufgefallen ist, scheinbar zu wenig präsent für unsere Kunden dokumentiert. Um etwas Licht ins Dunkel zu bringen, haben wir diesen Artikel erstellt. In diesem erklären wird daher Stück für Stück erklärt:

  • Warum Objectstorage
  • Erzeugen von S3-Credentials via OpenStack-API
  • Konfiguration von s3cmd
  • Anlegen eines neuen Buckets
  • Dateien im Bucket ablegen
  • Bucketinhalte listen
  • Datei aus Bucket herunterladen
  • weitere s3cmd Anwendungsbeispiele
  • Abschließendes

Warum Objectstorage?

Der S3-Object-Storage bietet viele Vorteile gegenüber lokal abgelegter Daten bzw. einem klassischen NFS-Storage, denn ein NFS-Setup besteht oftmals nur aus einem einzigen Server und stellt somit den single point of failure dar. Auch muss der Admin stets Sorge um die Performance des Storages und der bedienenden Webserver tragen. Ein weiterer Vorteil von Object-Storages ist die Größe und Anzahl für die zu speichernden Daten. Denn diese ist bei einem Object-Storage so gesehen unbegrenzt. Der Anbieter des Object-Storage (also im aktuellen Fall NWS) trägt dafür Sorge, dass hier niemals der Platz ausgeht. Bei dem eigenen NFS muss entsprechend die Größe von Anfang an in der Planung berücksichtigen und der Kunde zahlt auf Dauer die eingeplante Reserve mit. Bei einem Object-Storage wird nur das Volumen gezahlt, welches belegt ist. Erwähnenswert ist auch die Entlastung der Webserver, gerade im Hinblick auf lokal abgelegte Daten. Stellt man sich folgende Architektur vor: Die Anwendung wird auf mehreren Webservern betrieben, Bilder und andere Objekte werden im Object Storage aufbewahrt und durch eine intelligente Einbindung direkt an den Websitebesucher ausgeliefert, ohne die eigenen Webserver oder deren Bandbreite zu belasten. Kurzum, man gibt seiner Anwendung zu verstehen nicht konkret dieses Bild auszuliefern, sondern Anwendung gibt wiederum nur den Pfad des gespeicherten Bildes an den Besucher weiter. Das Bild wird letztlich direkt von dem dahinter liegenden Rados-Gateway ausgeliefert und wurde niemals vom App-Server ausgeliefert. Somit kommt es schnell beim Webseitenbesucher an, spart Bandbreite und mindert die Last auf dem eigenen Webserver und ist dennoch zentral gehalten. Übrigens bedient sich der Objectstorage an unserem Ceph, dort sind alle Daten über eine Vielzahl von Systemen verteilt und weisen auch selbstverständlich entsprechende Replica-Sets auf.

Erzeugen von S3-Credentials via OpenStack-API

Um bei NWS einen Object-Storage nutzen zu können, wird ein OpenStack-Account benötigt. Es ist wichtig zu beachten, dass die Credentials für S3 unter Verwendung des OpenStack Project User Accounts erstellt werden sollten. Details zu den Gründen, warum man nicht den eigenen NWS-ID-Benutzer verwenden sollte, findet man hier. Eine Anleitung, wie man den OpenStack Project User aktiviert, findet man in dieser Dokumentation. Nachdem dieser bereit steht, kann es auch schon losgehen. Im OpenStack wird zum Menüpunkt „API Zugriff“ gewechselt und die OpenStack RC Datei heruntergeladen (oben rechts). Dieses soeben heruntergeladene Script wird nun auf der lokalen Maschine gestartet. Dabei wird lediglich das OpenStack-Passwort abgefragt. Aber Achtung, es wird ein OpenStack-Client benötigt. 

source 9231-openstack-4707c-openrc.sh 
Please enter your OpenStack Password for project 9231-openstack-4707c as user 9231-openstack-4707c:

Nun müssen noch die EC2-Credentials für den S3-Zugriff erzeugt werden, hierzu dient das Kommando 

openstack ec2 credentials create

Das Ergebnis liefert eine vergleichbare Ausgabe, wie die Folgende 

+------------+------------------------------------------------------------------------------------------------------------------------+
| Field      | Value                                                                                                                  |
+------------+------------------------------------------------------------------------------------------------------------------------+
| access     | aceab8b6b85c51f8d3b305aec1af39c2                                                                                       |
| links      | {'self': 'https://cloud.netways.de:5000/v3/users/24c527b4929f10bd6c6ee09af4b30be2/credentials/OS-EC2/aceab8b6b85c51f8d3b305aec1af39c2'} |
| project_id | a40c737aaf3027d87e98f309f9f671d4                                                                                       |
| secret     | e5d312a7627cdf2a87ac4322a6d7716b                                                                                       |
| trust_id   | None                                                                                                                   |
| user_id    | 24c527b4929f10bd6c6ee09af4b30be2                                                                                       |
+------------+------------------------------------------------------------------------------------------------------------------------+

Konfiguration von s3cmd

Für die weitere Verwendung wird nun s3cmd konfiguriert. Dafür ist ein installiertes s3cmd die Voraussetzung. Die Einrichtung startet mittels s3cmd --configure 

Im folgenden Wizard werden die zuvor erstellten Daten eingetragen, dies sieht dann in etwa so aus (relevante Eintragungen in Fettdruck) 

s3cmd --configure

Enter new values or accept defaults in brackets with Enter.
Refer to the user manual for a detailed description of all options.

Access key and Secret key are your identifiers for Amazon S3. Leave them empty for using the env variables.
Access Key: aceab8b6b85c51f8d3b305aec1af39c2
Secret Key: e5d312a7627cdf2a87ac4322a6d7716b
Default Region [US]:

Use "s3.amazonaws.com" for S3 Endpoint and not modify it to the target Amazon S3.
S3 Endpoint [s3.amazonaws.com]: rgw1.netways.de

Use "%(bucket)s.s3.amazonaws.com" to the target Amazon S3. "%(bucket)s" and "%(location)s" vars can be used
if the target S3 system supports dns based buckets.
DNS-style bucket+hostname:port template for accessing a bucket [%(bucket)s.s3.amazonaws.com]: rgw1.netways.de/%(bucket)s

Encryption password is used to protect your files from reading
by unauthorized persons while in transfer to S3
Encryption password:
Path to GPG program:

When using secure HTTPS protocol all communication with Amazon S3
servers is protected from 3rd party eavesdropping. This method is
slower than plain HTTP, and can only be proxied with Python 2.7 or newer
Use HTTPS protocol [Yes]:

On some networks all internet access must go through a HTTP proxy.
Try setting it here if you can't connect to S3 directly
HTTP Proxy server name:

New settings:
Access Key: aceab8b6b85c51f8d3b305aec1af39c2
Secret Key: e5d312a7627cdf2a87ac4322a6d7716b
Default Region: US
S3 Endpoint: rgw1.netways.de
DNS-style bucket+hostname:port template for accessing a bucket: rgw1.netways.de/%(bucket)s
Encryption password:
Path to GPG program: None
Use HTTPS protocol: True
HTTP Proxy server name:
HTTP Proxy server port: 0

Test access with supplied credentials? [Y/n] n

Save settings? [y/N] y
Configuration saved to '/Users/gmimietz/.s3cfg'

Damit die S3-Kommandos nun wie gewünscht funktionieren, muss an der soeben erzeugten Config noch eine Kleinigkeit angepasst werden 

vim ~/.s3cfg

Dort wird die Zeile 

signature_v2 = False

angepasst auf 

signature_v2 = True

Nachdem gespeichert ist, kann die Verwendung auch schon beginnen.

Anlegen eines neuen Buckets

Mittels des folgenden Kommandos wird ein neuer Bucket erstellt 

s3cmd mb s3://myfirstbucket

Um die Anlage des Buckets zu überprüfen, wird dieser aufgelistet mittels 

s3cmd ls

Dateien im Bucket ablegen

Zeit, die ersten Dateien hochzuladen. Dafür wird der put Parameter genutzt  

s3cmd put /Users/gmimietz/Downloads/water.liquid s3://myfirstbucket/

Bucketinhalte listen

Um zu sehen, was in dem soeben befüllten Bucket alles liegt, listet der ls-Befehl die Inhalte auf. Dieser wird nun jedoch um den Bucketnamen ergänzt 

s3cmd ls s3://myfirstbucket 
2021-02-02 11:04 402088862 s3://myfirstbucket/water.liquid

Datei aus Bucket herunterladen

Die soeben hochgeladene Datei kann nun mittels get Parameter herunter geladen werden. 

s3cmd get s3://myfirstbucket/water.liquid

weitere s3cmd Anwendungsbeispiele

Nachfolgend einige hilfreiche Kommandos: Ein Objekt von einem Bucket in einen anderen verschieben: 

s3cmd mv s3://myfirstbucket/water.liquid s3://mysecondbucket

Ein Object verschlüsselt im Bucket ablegen (Bedarf einer vordefinierten Passphrase (s3cmd –configure) 

s3cmd put fire.element s3://myfirstbucket -e

Ein sehr wertvolles Kommando ist der Sync, um ein lokales Verzeichnis mit einem Bucket zu synchronisieren (alles unterhalb /important-data wird nach s3://myfirstbucket/backup/ gesynct) 

s3cmd sync /important-data/ s3://myfirstbucket/backup/

Um in gewissen Anwendungsfällen Bandbreiten zu schonen, hilft die –limit-rate Option, diese wird standardmäßig mit bytes angegeben, aber die Option erkennt auch einen k bzw. m Suffix (Kilo-/Megabyte) pro Sekunde 

s3cmd put myfile s3://myfirstbucket --limit-rate=1k

 

 

Abschließendes

Natürlich gibt es noch sehr viel mehr Parameter für den s3cmd, all diese lassen sich mittels –help auflisten. Bei der Verwendung von s3 lassen sich aber auch moderne und elegante Verfahrensweisen gleich mit einbauen, z. B. die Lebensdauer einer Datei mit vorab festgelegtem Löschdatum. Im OpenStack kann man sich auch ansehen, was das Objectstorage so tut, dafür navigiert man über Projekt>Objektspeicher zum entsprechenden Menü. Unserer Objektspeicher funktioniert übrigens auch mit swift – so wird er auch von OpenStack selbst angesprochen. Also ein Mischbetrieb von S3 und swift ist nach Belieben möglich. Aktuell haben wir swift noch nicht weiter dokumentiert, aber unseren freundlichen MyEngineers geben hier gern auf Anfrage Auskunft. Die Preise für unseren Objectstorage und alles andere was wir so bei NWS anbieten, kann man übrigens hier jederzeit nachlesen.