Wie man mit boto3 auf den Objektspeicher von CODE-DE zugreift

In diesem Artikel erfahren Sie, wie Sie mit der Python-Bibliothek boto3 auf Objektspeicher in der CODE-DE Cloud zugreifen können.

Was wir behandeln werden

  • Terminologie: Container und Bucket

  • Vorbereiten der Umgebung

  • Wie werden die mitgelieferten Beispiele verwendet?

  • Erstellen eines Containers

  • Auflisten von Buckets

  • Prüfen, wann ein Bucket erstellt wurde

  • Auflisten von Dateien in einem Bucket

  • Auflisten von Dateien aus einem Pfad in einem Bucket

  • Hochladen von Dateien in einen Bucket

  • Herunterladen von Dateien aus einem Bucket

  • Entfernen von Dateien aus einem Bereich

  • Entfernen eines Bereichs

Voraussetzungen

Nr. 1 Konto

Sie benötigen ein CODE-DE Konto mit Zugriff auf die Horizon-Schnittstelle: https://cloud.fra1-1.cloudferro.com/auth/login/?next=/.

Nr. 2 Gültige EC2-Anmeldedaten

Sie müssen EC2-Anmeldeinformationen erstellen. Erfahren Sie hier mehr: Erstellen und Verwalten von EC2-Anmeldedaten auf CODE-DE

Nr. 3 Einen Linux- oder Windows-Computer oder eine virtuelle Maschine

Dieser Artikel wurde für Ubuntu 22.04 und Windows Server 2022 geschrieben. Andere Betriebssysteme könnten funktionieren, sind aber nicht Gegenstand dieses Artikels und erfordern möglicherweise eine Anpassung der hier angegebenen Befehle.

Sie können diesen Artikel auf virtuellen Linux- oder Windows-Maschinen oder einem lokalen Computer mit einem dieser Betriebssysteme verwenden.

Um eine neue virtuelle Maschine zu erstellen, die auf CODE-DE gehostet wird, kann einer der folgenden Artikel helfen:

Terminologie: Container und Bucket

Die Begriffe Container (verwendet vom Horizon Dashboard) und Bucket (verwendet von boto3) werden auf CODE-DE synonym verwendet und bezeichnen einen Objektspeicherort.

Vorbereiten der Umgebung

Um die Beispiele in diesem Artikel auszuführen, benötigen Sie eine funktionierende Installation von Python 3 und der Bibliothek boto3. Die genaue Art der Installation hängt von Ihren Zielen und Gewohnheiten bei der Arbeit mit Python ab.

Ubuntu 22.04

Methode 1: Verwendung von virtualenvwrapper und pip

Wenn Sie ein erfahrener Python-Benutzer sind und an mehreren Projekten arbeiten, werden Sie zwangsläufig Python virtuelle Umgebungen verwenden. Es ist ratsam, eine neue virtuelle Umgebung für boto3 zu erstellen. Hier ist eine Möglichkeit beschrieben, dies zu tun: Wie installiert man Python virtualenv/virtualenvwrapper.

Wie in diesem Artikel erwähnt, verwenden Sie den Befehl workon, um die virtuelle Umgebung zu betreten. Wenn Ihre Umgebung zum Beispiel managing-files heißt, führen Sie folgendes aus:

workon managing-files

Sobald die Umgebung aktiviert ist, installieren Sie boto3:

pip3 install boto3

Methode 2: Verwenden von apt

Falls Sie eine solche Umgebung nicht benötigen und boto3 global unter Ubuntu verfügbar machen wollen, verwenden Sie apt. Der folgende Befehl installiert sowohl Python3 als auch die boto3-Bibliothek:

sudo apt install python3 python3-boto3

Windows Server 2022

Wenn Sie Windows verwenden, folgen Sie diesem Artikel, um zu erfahren, wie Sie boto3 installieren: Wie installiert man Boto3 unter Windows auf CODE-DE

Wie man die Beispiele verwendet

Jedes der Beispiele kann als eigenständiger Code verwendet werden. Sie sollten in der Lage sein

  • den Code in Ihren Texteditor einzugeben,

  • einen geeigneten Inhalt für die bereitgestellten Variablen zu definieren,

  • ihn als Datei zu speichern und

  • auszuführen.

Sie können diese Beispiele auch als Ausgangspunkt für Ihren eigenen Code verwenden.

../_images/code_structure.png

Jedes Beispiel umfasst drei Teile:

import boto3 – blaues Rechteck

Zunächst importieren Sie die Bibliothek boto3, wie in Python üblich.

Eingabeparameter für den boto3-Aufrufe definieren – rotes Rechteck

Ein typischer Aufruf in der boto3-Bibliothek sieht wie folgt aus:

s3=boto3.resource('s3',aws_access_key_id=access_key, aws_secret_access_key=secret_key, endpoint_url='https://https://s3.fra1-1.cloudferro.com', region_name='Default Region')

Für jeden Aufruf müssen mehrere Input-Variablen vorhanden sein:

  • aws_access_key_id – aus Voraussetzung Nr. 2

  • aws_secret_access_key – ebenfalls aus Voraussetzung Nr. 2

  • endpoint_url – im Quellcode des Beispiels für jede Cloud vordefiniert

  • region_name – wie oben

Andere Variablen können von Fall zu Fall erforderlich sein:

  • name,

  • path

und möglicherweise weitere. Stellen Sie sicher, dass Sie die Werte für all diese zusätzlichen Variablen eingeben, bevor Sie die Beispiele ausführen.

boto3 Aufruf – grünes Rechteck

Sobald Sie alle Werte für die entsprechenden Variablen eingegeben haben, können Sie die Datei mit der Erweiterung .py speichern. Eine Möglichkeit, Python-Skripte auszuführen, ist die Verwendung der Befehlszeile. Um ein solches Skript auszuführen, gehen Sie zunächst zu dem Ordner, in dem sich das Skript befindet. Führen Sie dann den unten stehenden Befehl aus, wobei Sie script.py durch den Namen des Skripts ersetzen, das Sie ausführen möchten.

python3 script.py

Stellen Sie sicher, dass der Name und/oder der Speicherort der Datei korrekt an die Shell übergeben wird - achten Sie auf Leerzeichen und andere Sonderzeichen.

Warnung

In diesen Beispielen werden Sie selbst bei potenziell destruktiven Operationen nicht zu einer Bestätigung aufgefordert. Wenn ein Skript z.B. eine Datei speichert und unter dem angegebenen Namen und Speicherort bereits eine Datei existiert, wird diese möglicherweise überschrieben. Bitte vergewissern Sie sich vor der Ausführung des Skripts, dass Sie das wollen, oder erweitern Sie den Code, um zu prüfen, ob die Datei bereits existiert.

In allen folgenden Beispielen gehen wir davon aus, dass die entsprechenden Dateien und Buckets bereits existieren. Das Hinzufügen von Code für derartige Prüfungen würde den Rahmen dieses Artikels sprengen.

Erstellen eines Containers

Um einen neuen Container zu erstellen, wählen Sie zunächst einen Namen für Ihren Bucket und geben ihn in die Variable name ein. Verwenden Sie auf der CODE-DE Cloud nur Buchstaben, Zahlen und Bindestriche.

import boto3

access_key = ''
secret_key = ''

name = ''

try:
    s3=boto3.resource('s3',aws_access_key_id=access_key, aws_secret_access_key=secret_key, endpoint_url='https://https://s3.fra1-1.cloudferro.com', region_name='Default Region')

    s3.Bucket(name).create()

except Exception as issue:
    print("The following error occurred:")
    print(issue)

Die erfolgreiche Ausführung dieses Codes sollte keine Ausgabe erzeugen.

Um zu prüfen, ob der Bucket erstellt wurde, können Sie z.B. Buckets auflisten, wie im Abschnitt Buckets auflisten unten beschrieben.

Fehlersuche bei der Erstellung eines Containers

Bucket existiert bereits

Wenn Sie die folgende Meldung erhalten:

The following error occurred:
An error occurred (BucketAlreadyExists) when calling the CreateBucket operation: Unknown

bedeutet dies, dass Sie diesen Namen nicht für einen Bucket wählen können, da bereits ein Bucket mit diesem Namen existiert. Wählen Sie einen anderen Namen und versuchen Sie es erneut.

Unzulässige Zeichen verwendet

Wenn Sie ungültige Zeichen im Containernamen verwendet haben, sollten Sie eine Fehlermeldung ähnlich der folgenden erhalten:

Invalid bucket name "this container should not exist": Bucket name must match the regex "^[a-zA-Z0-9.\-_]{1,255}$" or be an ARN matching the regex "^arn:(aws).*:(s3|s3-object-lambda):[a-z\-0-9]*:[0-9]{12}:accesspoint[/:][a-zA-Z0-9\-.]{1,63}$|^arn:(aws).*:s3-outposts:[a-z\-0-9]+:[0-9]{12}:outpost[/:][a-zA-Z0-9\-]{1,63}[/:]accesspoint[/:][a-zA-Z0-9\-]{1,63}$"

Zur Lösung wählen Sie einen anderen Namen - auf CODE-DE verwenden Sie ausschließlich Buchstaben, Zahlen und Bindestriche.

Auflistung der Buckets

Mit diesem Code können Sie Buckets auflisten.

import boto3

access_key = ''
secret_key = ''

try:

    s3=boto3.client('s3',aws_access_key_id=access_key, aws_secret_access_key=secret_key, endpoint_url='https://https://s3.fra1-1.cloudferro.com', region_name='Default Region')

    print(s3.list_buckets()['Buckets'])

except Exception as issue:
    print("The following error occurred:")
        print(issue)

Die Ausgabe sollte eine Liste sein, die jeweils Informationen zu einem bestimmten Bucket enthält, beginnend mit dessen Namen. Existieren die beiden Buckets, my-files und my-other-files bereits, sollte die Ausgabe etwa so aussehen:

[{'Name': 'my-files', 'CreationDate': datetime.datetime(2024, 1, 23, 14, 21, 3, 70000, tzinfo=tzlocal())}, {'Name': 'my-other-files', 'CreationDate': datetime.datetime(2024, 1, 23, 14, 21, 7, 993000, tzinfo=tzlocal())}]

Um die Ausgabe übersichtlicher zu gestalten, verwenden Sie eine for-Schleife mit print-Anweisung, um nur die Namen Ihrer Buckets anzuzeigen, einen Bucket pro Zeile:

import boto3

access_key = ''
secret_key = ''

try:

    s3=boto3.client('s3',aws_access_key_id=access_key, aws_secret_access_key=secret_key, endpoint_url='https://https://s3.fra1-1.cloudferro.com', region_name='Default Region')

    for i in s3.list_buckets()['Buckets']:
        print(i['Name'])

except Exception as issue:
    print("The following error occurred:")
    print(issue)

Eine Beispielausgabe für diesen Code sieht wie folgt aus:

my-files
my-other-files

Wenn Sie keine Buckets haben, sollte die Ausgabe leer sein.

Prüfen, ob ein Bucket erstellt wurde

Verwenden Sie diesen Code, um das Datum zu prüfen, an dem ein Bucket erstellt wurde. Geben Sie den Namen dieses Buckets in die Variable name ein.

import boto3

access_key = ''
secret_key = ''

name = ''

try:

    s3=boto3.resource('s3',aws_access_key_id=access_key, aws_secret_access_key=secret_key, endpoint_url='https://https://s3.fra1-1.cloudferro.com', region_name='Default Region')

    print(s3.Bucket(name).creation_date)

except Exception as issue:
    print("The following error occurred:")
    print(issue)

Die Ausgabe sollte das Datum enthalten, an dem der Bucket erstellt wurde, im Format eines Python datetime-Objekts:

2024-01-23 14:21:03.070000+00:00

Auflisten von Dateien in einem Bucket

Um Dateien in einem Bucket aufzulisten, geben Sie den Bucket-Namen in der Variablen name an.

import boto3

access_key = ''
secret_key = ''

name = ''

try:

    s3=boto3.resource('s3',aws_access_key_id=access_key, aws_secret_access_key=secret_key, endpoint_url='https://https://s3.fra1-1.cloudferro.com', region_name='Default Region')

    bucket=s3.Bucket(name)
    for obj in bucket.objects.filter():
        print(obj)

except Exception as issue:
    print("The following error occurred:")
            print(issue)

Ihre Ausgabe sollte die Liste Ihrer Dateien enthalten, etwa so:

s3.ObjectSummary(bucket_name='my-files', key='some-directory/')
s3.ObjectSummary(bucket_name='my-files', key='some-directory/another-file.txt')
s2.ObjectSummary(bucket_name='my-files', key='some-directory/first-file.txt')
s3.ObjectSummary(bucket_name='my-files', key='some-directory/some-other-directory/')
s3.ObjectSummary(bucket_name='my-files', key='some-directory/some-other-directory/some-other-file.txt')
s3.ObjectSummary(bucket_name='my-files', key='some-directory/some-other-directory/yet-another-file.txt')
s3.ObjectSummary(bucket_name='my-files', key='text-file.txt')

Wenn sich in Ihrem Bucket keine Dateien befinden, sollte die Ausgabe leer sein.

Fehlerbehebung bei der Auflistung von Dateien in einem Bucket

Kein Zugriff auf das Bucket

Wenn Ihr Schlüsselpaar keinen Zugriff auf den gewählten Bucket hat, sollten Sie die folgende Fehlermeldung erhalten:

botocore.exceptions.ClientError: An error occurred (AccessDenied) when calling the ListObjects operation: Unknown

Wählen Sie in diesem Fall einen anderen Bucket oder ein anderes Schlüsselpaar, wenn Sie eines haben, das darauf zugreifen kann.

Bucket existiert nicht

Wenn ein Bucket, das Sie ausgewählt haben, nicht existiert, kann die Fehlermeldung lauten:

botocore.errorfactory.NoSuchBucket: An error occurred (NoSuchBucket) when calling the ListObjects operation: Unknown

Wenn Sie einen Bucket mit diesem Namen benötigen, erstellen Sie ihn wie im Abschnitt Erstellen eines Containers oben beschrieben.

Auflisten von Dateien aus einem bestimmten Pfad in einem Bucket

In diesem Beispiel werden nur Objekte aus einem bestimmten Pfad aufgelistet. Für die Variable path sind zwei Regeln zu beachten:

  • Beenden Sie ihn mit einem Schrägstrich.

  • Beginnen Sie ihn nicht mit einem Schrägstrich.

Wie immer fügen Sie den Namen des Buckets in die Variable name ein.

import boto3

access_key = ''
secret_key = ''

name = ''
path = ''

try:

    s3=boto3.resource('s3',aws_access_key_id=access_key, aws_secret_access_key=secret_key, endpoint_url='https://https://s3.fra1-1.cloudferro.com', region_name='Default Region')

    bucket=s3.Bucket(name)
    for obj in bucket.objects.filter(Prefix=path):
        print(obj)

except Exception as issue:
    print("The following error occurred:")
            print(issue)

Es sollte eine Standardausgabe erzeugt werden, wenn keine Dateien unter dem gewählten Pfad existieren, wird die Ausgabe leer sein.

Hochladen einer Datei in einen Bucket

Um eine Datei in den Container hochzuladen, fügen Sie den Variablen den folgenden Inhalt hinzu:

Variable name

Was sie enthalten sollte

name

Der Name des Buckets, in den Sie Ihre Datei hochladen möchten.

source

Der Speicherort der Datei in Ihrem lokalen Dateisystem.

destination

Der Pfad in Ihrem Container, auf den Sie die Datei hochladen möchten. Sollte nur Buchstaben, Ziffern, Bindestriche, Schrägstriche enthalten.

Zwei Bedingungen für die Variable destination:

  1. Geben Sie den Namen der hochzuladenden Datei ein und

  2. Beginnen oder beenden Sie nicht mit einem Schrägstrich.

Der Code lautet folgendermaßen:

import boto3

access_key = ''
secret_key = ''

name = ''
source = ''
destination = ''

try:

    s3=boto3.resource('s3',aws_access_key_id=access_key, aws_secret_access_key=secret_key, endpoint_url='https://https://s3.fra1-1.cloudferro.com', region_name='Default Region')
    bucket=s3.Bucket(name)
    bucket.upload_file(source, destination)

except Exception as issue:
    print("The following error occurred:")
    print(issue)

Wenn der Vorgang erfolgreich war, sollte die Ausgabe leer sein.

Beispielvariablen

Angenommen, Sie möchten eine Datei hochladen

  • mit dem Namen file.txt,

  • im Verzeichnis here,

  • der sich wiederum in dem Ordner befindet, von dem aus Sie das Skript ausführen und in dem sich das Skript befindet.

  • Das Ziel ist der Pfad some-directory in einem Bucket namens my-files.

Die Variablen sollten in diesem Fall wie folgt aufgebaut sein:

name = 'my-files'
source = 'here/file.txt'
destination = 'some-directory/file.txt'

Fehlerbehebung beim Hochladen von Dateien in ein Bucket

Die Datei, die Sie hochladen möchten, existiert nicht

Wenn Sie eine nicht existierende Datei in der Variable source angegeben haben, sollten Sie eine Fehlermeldung ähnlich der folgenden erhalten:

The following error occurred:
[Errno 2] No such file or directory: 'here/wrong-file.txt'

Geben Sie die richtige Datei an und versuchen Sie es erneut.

Herunterladen von Dateien aus einem Bucket

Um eine Datei aus einem Bucket auf Ihrer lokalen Festplatte zu speichern, geben Sie die Werte der folgenden Variablen ein und führen Sie den folgenden Code aus:

Variable name

Der Inhalt

name

Der Name des Buckets, von dem Sie Ihre Datei herunterladen möchten.

source

Der Pfad zum Container, von dem Sie Ihre Datei herunterladen möchten.

destination

Der Pfad in Ihrem lokalen Dateisystem, wo Sie die Datei speichern möchten.

Die Variable source darf nicht mit einem Schrägstrich beginnen oder enden.

import boto3

access_key = ''
secret_key = ''

name = ''
source = ''
destination = ''

try:

    s3=boto3.resource('s3',aws_access_key_id=access_key, aws_secret_access_key=secret_key, endpoint_url='https://https://s3.fra1-1.cloudferro.com', region_name='Default Region')

    bucket=s3.Bucket(name)

    bucket.download_file(source, destination)

except Exception as issue:
    print("The following error occurred:")
    print(issue)

Die erfolgreiche Ausführung dieses Codes sollte keine Ausgabe erzeugen.

Beispielvariablen

Nehmen wir an, Sie führen dieses Skript aus demselben Ordner aus, in dem sich das Skript befindet. Sie laden die Datei

  • first-file.txt, die sich im

  • Container my-files befindet, der im

  • Verzeichnis some-directory liegt.

Ziel ist es, die Datei in einem Ordner namens here zu speichern, der sich in demselben Ordner wie das Skript befindet.

Richten Sie die Variablen wie folgt ein:

name = 'my-files'
source = 'some-directory/first-file.txt'
destination = 'here/first-file.txt'

Bemerkung

Unter Ubuntu werden Dateipfade mit Schrägstrichen, unter Windows normalerweise mit umgekehrten Schrägstrichen geschrieben. Der obige Code in Python verwendet Schrägstrichen, wird aber trotzdem sowohl unter Windows als auch unter Linux erfolgreich ausgeführt.

Fehlerbehebung beim Hochladen von Dateien in ein Bucket

Datei existiert nicht im Bucket

Wenn eine von Ihnen gewählte Datei im Bucket nicht vorhanden ist, sollte folgende Fehlermeldung erscheinen:

The following error occurred:
An error occurred (404) when calling the HeadObject operation: Not Found

Vergewissern Sie sich, dass die Datei richtig angegeben wurde.

Entfernen einer Datei aus einem Bucket

Um eine Datei aus Ihrem Bucket zu entfernen, geben Sie den Namen des Buckets in die Variable name und den vollständigen Pfad in die Variable path ein.

import boto3

access_key = ''
secret_key = ''

name = ''
path = ''

try:

    s3=boto3.resource('s3',aws_access_key_id=access_key, aws_secret_access_key=secret_key, endpoint_url='https://https://s3.fra1-1.cloudferro.com', region_name='Default Region')

    s3.Object(name, path).delete()

except Exception as issue:
    print("The following error occurred:")
    print(issue)

Die erfolgreiche Ausführung dieses Codes sollte keine Ausgabe erzeugen.

Entfernen eines Buckets

Um einen Bucket zu entfernen, müssen zunächst alle Objekte aus dem Bucket entfernt werden. Sobald er leer ist, definieren Sie die Variable name für den Bucket, den Sie entfernen möchten, und führen den folgenden Code aus:

import boto3

access_key = ''
secret_key = ''

name = ''

try:

    s3=boto3.resource('s3',aws_access_key_id=access_key, aws_secret_access_key=secret_key, endpoint_url='https://https://s3.fra1-1.cloudferro.com', region_name='Default Region')

    s3.Bucket(name).delete()

except Exception as issue:
    print("The following error occurred:")
    print(issue)

Die erfolgreiche Ausführung dieses Codes sollte keine Ausgabe erzeugen.

Fehlersuche beim Entfernen eines Buckets

Bucket existiert nicht oder ist für Ihr Schlüsselpaar nicht verfügbar

Wenn das Bucket nicht existiert oder für Ihr Schlüsselpaar nicht verfügbar ist, sollten Sie die folgende Ausgabe erhalten:

The following error occurred:
An error occurred (NoSuchBucket) when calling the DeleteBucket operation: Unknown

Das Bucket ist nicht leer

Wenn das Bucket nicht leer ist, kann es nicht gelöscht werden. Die Meldung lautet:

The following error occurred:
An error occurred (BucketNotEmpty) when calling the DeleteBucket operation: Unknown

Entfernen Sie alle Objekte aus dem Bucket und versuchen Sie es erneut.

Allgemeine Fehlersuche

Keine Verbindung zum S3-Endpunkt

Wenn Sie keine Verbindung zum S3-Endpunkt haben (z. B. weil die Internetverbindung unterbrochen wurde), sollten Sie eine ähnliche Ausgabe wie diese erhalten:

The following error occurred:
Could not connect to the endpoint URL: "https://https://s3.fra1-1.cloudferro.com/"

Wenn das der Fall ist, stellen Sie sicher, dass Sie mit dem Internet verbunden sind. Wenn Sie sicher sind, dass Sie mit dem Internet verbunden sind und keine Ausfallzeit für den CODE-DE Objektspeicher angekündigt wurde, kontaktieren Sie den CODE-DE Support: Helpdesk und Support

Falsche Anmeldeinformationen

Wenn der access- und/oder der secret-Schlüssel falsch sind, wird eine Meldung wie diese angezeigt:

The following error occurred:
An error occurred (InvalidAccessKeyId) when calling the ListBuckets operation: Unknown

Siehe Voraussetzung Nr. 2, um gültiger Anmeldeinformationen zu erhalten.

Bucket existiert nicht oder ist für Ihr Schlüsselpaar nicht verfügbar

Wenn das Bucket, das Sie für diesen Code gewählt haben, nicht existiert oder für Ihr Schlüsselpaar nicht verfügbar ist, können Sie je nach dem Befehl, den Sie ausführen, unterschiedliche Ausgaben erhalten. Im Folgenden finden Sie zwei solche Beispiele:

None
The following error occurred:
An error occurred (NoSuchBucket) when calling the DeleteObject operation: Unknown

Was als nächstes zu tun ist

boto3 kann auch verwendet werden, um auf das EO-Daten Repository auf virtuellen Maschinen der CODE-DE Cloud zuzugreifen. Mehr Informationen hier: Wie man mit boto3 auf EODATA zugreift auf CODE-DE