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:
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:
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:
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:
6. Dateien löschen
Lösche eine Datei aus dem Bucket:
7. Datei-Statistiken anzeigen
Zeige Details zu einer Datei an:
8. Öffentlichen Link erstellen
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:
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
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:
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
Object Locking
Bucket mit Object Lock erstellen
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
# 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.