Zum Inhalt

Verwendung der Boto3-Bibliothek (S3)

Mit der Python-Bibliothek Boto3 kannst Du einfach mit Deinem Object Storage unter storage.netways.cloud interagieren. Hier findest Du praktische Beispiele, wie Du Boto3 für Deinen S3-Bucket nutzen kannst.

Voraussetzungen

  • Du besitzt einen User mit S3-Key (Access Key und Secret Key).
  • Die Boto3-Bibliothek ist auf Deinem System installiert. Falls nicht, installiere sie mit:
    pip install boto3
    

Konfiguration von Boto3

1. AWS-Credentials konfigurieren

Konfiguriere Deine Zugangsdaten, um Boto3 mit storage.netways.cloud zu verbinden. Du kannst die Credentials in ~/.aws/credentials speichern:

[nws]
aws_access_key_id = ACCESS_KEY
aws_secret_access_key = SECRET_KEY

Alternativ kannst Du die Zugangsdaten direkt im Code angeben (nicht empfohlen für Produktionsumgebungen):

import boto3

session = boto3.Session(
    aws_access_key_id='ACCESS_KEY',
    aws_secret_access_key='SECRET_KEY'
)
s3_client = session.client('s3', endpoint_url='https://storage.netways.cloud')

Ersetze ACCESS_KEY und SECRET_KEY mit Deinen S3-Zugangsdaten.


Grundlegende Beispiele

1. Buckets auflisten

Zeige alle Buckets in Deinem Projekt an:

import boto3

s3_client = boto3.client('s3', endpoint_url='https://storage.netways.cloud')
response = s3_client.list_buckets()
for bucket in response['Buckets']:
    print(bucket['Name'])

2. Datei hochladen

Lade eine lokale Datei in Deinen Bucket hoch:

s3_client.upload_file('~/meine-datei.txt', 'mein-bucket', 'meine-datei.txt')

3. Bucket-Inhalt anzeigen

Zeige alle Objekte in einem Bucket an:

response = s3_client.list_objects_v2(Bucket='mein-bucket')
for obj in response.get('Contents', []):
    print(obj['Key'])

4. Verzeichnis synchronisieren

Synchronisiere ein lokales Verzeichnis mit Deinem Bucket (Beispiel mit os und upload_file):

import os

local_dir = '~/mein-verzeichnis'
bucket_name = 'mein-bucket'
prefix = 'backup/'

for root, _, files in os.walk(os.path.expanduser(local_dir)):
    for file in files:
        local_path = os.path.join(root, file)
        relative_path = os.path.relpath(local_path, os.path.expanduser(local_dir))
        s3_path = os.path.join(prefix, relative_path).replace('\\', '/')
        s3_client.upload_file(local_path, bucket_name, s3_path)

5. Datei herunterladen

Lade eine Datei aus dem Bucket herunter:

s3_client.download_file('mein-bucket', 'meine-datei.txt', '~/Downloads/meine-datei.txt')

6. Dateien löschen

Lösche eine Datei aus dem Bucket:

s3_client.delete_object(Bucket='mein-bucket', Key='meine-datei.txt')

7. Datei-Statistiken anzeigen

Zeige Details zu einer Datei an:

response = s3_client.head_object(Bucket='mein-bucket', Key='meine-datei.txt')
print(response)

Erstelle einen temporären Download-Link (24 Stunden gültig):

url = s3_client.generate_presigned_url(
    'get_object',
    Params={'Bucket': 'mein-bucket', 'Key': 'meine-datei.txt'},
    ExpiresIn=24*3600
)
print(url)

9. Bucket erstellen

Erstelle einen neuen Bucket:

s3_client.create_bucket(Bucket='mein-bucket2')

Grundlegende Befehle für Bucket-Policies

Für die Verwaltung öffentlicher Zugriffe (anonymous access) kannst Du Bucket-Policies mit Boto3 setzen.

1. Aktuelle Policy anzeigen

try:
    response = s3_client.get_bucket_policy(Bucket='mein-bucket')
    print(response['Policy'])
except s3_client.exceptions.ClientError as e:
    if e.response['Error']['Code'] == 'NoSuchBucketPolicy':
        print("Keine Policy vorhanden")
    else:
        raise e

2. Policy setzen

Setze eine Policy für den Bucket:

import json

policy = {
    "Version": "2012-10-17",
    "Statement": []
}
s3_client.put_bucket_policy(Bucket='mein-bucket', Policy=json.dumps(policy))

3. Policy löschen

s3_client.delete_bucket_policy(Bucket='mein-bucket')

Beispiele für gängige Policy-Szenarien

1. Öffentlichen Lesezugriff erlauben

policy = {
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": ["s3:GetObject"],
            "Resource": ["arn:aws:s3:::mein-bucket/*"]
        }
    ]
}
s3_client.put_bucket_policy(Bucket='mein-bucket', Policy=json.dumps(policy))

2. Öffentlichen Schreibzugriff erlauben

policy = {
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": ["s3:PutObject"],
            "Resource": ["arn:aws:s3:::mein-bucket/*"]
        }
    ]
}
s3_client.put_bucket_policy(Bucket='mein-bucket', Policy=json.dumps(policy))

3. Vollständigen öffentlichen Zugriff erlauben

policy = {
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": ["s3:GetObject", "s3:PutObject"],
            "Resource": ["arn:aws:s3:::mein-bucket/*"]
        }
    ]
}
s3_client.put_bucket_policy(Bucket='mein-bucket', Policy=json.dumps(policy))

4. Policy für bestimmten Prefix setzen

policy = {
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": ["s3:GetObject"],
            "Resource": ["arn:aws:s3:::mein-bucket/öffentlich/*"]
        }
    ]
}
s3_client.put_bucket_policy(Bucket='mein-bucket', Policy=json.dumps(policy))

5. Policy für bestimmte IP-Bereiche

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": "*",
      "Action": ["s3:GetObject"],
      "Resource": ["arn:aws:s3:::mein-bucket/*"],
      "Condition": {
        "IpAddress": {"aws:SourceIp": ["192.0.2.0/24"]}
      }
    }
  ]
}

6. Policy für zeitlich begrenzten Zugriff

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": "*",
      "Action": ["s3:GetObject"],
      "Resource": ["arn:aws:s3:::mein-bucket/öffentlich/*"],
      "Condition": {
        "DateLessThan": {"aws:CurrentTime": "2025-12-31T23:59:59Z"}
      }
    }
  ]
}

Tipps & Hinweise

Sicherheitshinweise

  • Öffentliche Schreibrechte (s3:PutObject) sollten nur in Ausnahmefällen verwendet werden.
  • Prüfe Policies regelmäßig auf ihre Notwendigkeit.
  • Kombiniere Policies mit Bucket-Quotas, um unerwünschte Nutzung zu begrenzen.
  • Prüfe JSON-Policies immer auf Gültigkeit.
  • Teste neue Policies zunächst in nicht-produktiven Umgebungen.
Debugging

Aktiviere Debugging in Boto3, um detaillierte Informationen zu erhalten:

import logging
logging.basicConfig(level=logging.DEBUG)

Bucket Versioning

Aktivierung des Versionings

Versioning ermöglicht die Speicherung mehrerer Versionen eines Objekts:

s3_client.put_bucket_versioning(
    Bucket='mein-bucket',
    VersioningConfiguration={'Status': 'Enabled'}
)

# Status prüfen
response = s3_client.get_bucket_versioning(Bucket='mein-bucket')
print(response.get('Status'))

Arbeiten mit Versionen

# Alle Versionen eines Objekts anzeigen
response = s3_client.list_object_versions(Bucket='mein-bucket', Prefix='pfad/datei.txt')
for version in response.get('Versions', []):
    print(version['VersionId'], version['Key'])

# Bestimmte Version herunterladen
s3_client.download_file('mein-bucket', 'pfad/datei.txt', '~/ziel/datei.txt', ExtraArgs={'VersionId': 'VERSION_ID'})

# Version löschen
s3_client.delete_object(Bucket='mein-bucket', Key='pfad/datei.txt', VersionId='VERSION_ID')

Versioning deaktivieren

s3_client.put_bucket_versioning(
    Bucket='mein-bucket',
    VersioningConfiguration={'Status': 'Suspended'}
)

Object Lifecycle Management

Lifecycle-Regeln erstellen

Automatische Löschungen von Objekten konfigurieren:

Code (nicht unterstützt)
lifecycle_config = {
    'Rules': [
        {
            'ID': 'AutoDeleteTempFiles',
            'Status': 'Enabled',
            'Filter': {'Prefix': 'temp/'},
            'Expiration': {'Days': 7}
        },
        {
            'ID': 'DeleteOldLogs',
            'Status': 'Enabled',
            'Filter': {'Prefix': 'logs/'},
            'Expiration': {'Days': 30}
        }
    ]
}
s3_client.put_bucket_lifecycle_configuration(
    Bucket='mein-bucket',
    LifecycleConfiguration=lifecycle_config
)

Achtung

In aktuellen boto3-Versionen wird das Setzen von Lifecycle-Regeln für Drittanbieter von S3 nicht mehr unterstützt. Der Aufruf von put_bucket_lifecycle_configuration resultiert in folgender Fehlermeldung:

botocore.errorfactory.InvalidRequest: An error occurred (InvalidRequest) when calling the PutBucketLifecycleConfiguration operation: Missing required header for this request: Content-MD5
Mehr Informationen zu dem Thema findest Du hier.

Object Locking

Bucket mit Object Lock erstellen

s3_client.create_bucket(
    Bucket='gesperrter-bucket',
    ObjectLockEnabledForBucket=True
)

Retention-Einstellungen

# Retention für ein Objekt setzen
s3_client.put_object_retention(
    Bucket='gesperrter-bucket',
    Key='pfad/datei.txt',
    Retention={
        'Mode': 'GOVERNANCE',
        'RetainUntilDate': '2025-12-31T00:00:00Z'
    }
)

# Retention-Info abfragen
response = s3_client.get_object_retention(Bucket='gesperrter-bucket', Key='pfad/datei.txt')
print(response['Retention'])
# Legal Hold aktivieren
s3_client.put_object_legal_hold(
    Bucket='gesperrter-bucket',
    Key='pfad/datei.txt',
    LegalHold={'Status': 'ON'}
)

# Status prüfen
response = s3_client.get_object_legal_hold(Bucket='gesperrter-bucket', Key='pfad/datei.txt')
print(response['LegalHold'])

Hinweise

Object Lock

  • Einmal aktiviert, kann Object Lock nicht deaktiviert werden.
  • Retention-Perioden können nur verlängert, nicht verkürzt werden.

Lifecycle Management

  • Regeln werden typischerweise innerhalb von 24h ausgeführt.
  • Teste neue Regeln immer mit unkritischen Daten.
Best Practices
  • Kombiniere Versioning mit Lifecycle-Regeln für automatische Bereinigung.
  • Nutze Object Lock für Compliance-kritische Daten.
  • Dokumentiere alle Lifecycle-Regeln im Team.