Verwendung des Python SDK (Boto3)
Boto3 ist das AWS Software Development Kit (SDK) für Python. Es ermöglicht Ihnen das Erstellen, Konfigurieren und Verwalten von S3-kompatiblen Diensten, wie dem Cloud Temple Objektspeicher, direkt aus Ihren Python-Anwendungen heraus.
Installation
Die Installation der Bibliothek erfolgt einfach über pip, den Python-Paketmanager:
pip install boto3
Boto3 Client-Konfiguration
Um mit dem Dienst zu interagieren, müssen Sie zunächst einen Boto3-Client initialisieren, indem Sie ihm Ihre Anmeldedaten und den spezifischen Cloud Temple Endpunkt bereitstellen.
import boto3
from botocore.config import Config
# Ihre Anmeldedaten
access_key = 'IHR_ACCESS_KEY'
secret_key = 'IHR_SECRET_KEY'
endpoint_url = 'https://IHR_NAMESPACE.s3.fr1.cloud-temple.com'
region = 'fr1'
# Name des Buckets für die Beispiele
bucket_name = 'mein-test-bucket'
Die für den Cloud Temple Objektspeicher zu verwendende Region ist fr1. Stellen Sie sicher, dass Sie diesen Wert im Parameter region_name korrekt konfigurieren.
Signaturbesonderheiten (SigV2 / SigV4)
Der auf Dell ECS basierende Cloud Temple Objektspeicher unterstützt zwei Versionen der AWS-Signatur:
- SigV4 (
signature_version='s3v4'): empfohlen für Metadaten-Operationen (LIST, HEAD) - SigV2 (
signature_version='s3'): empfohlen für Datenoperationen (PUT, GET, DELETE)
Für eine optimale Kompatibilität wird empfohlen, zwei Boto3-Clients mit unterschiedlichen Signaturkonfigurationen je nach Operationstyp zu verwenden. Dies vermeidet XAmzContentSHA256Mismatch-Fehler, die bei SigV4 während Schreibvorgängen auftreten können.
import boto3
from botocore.config import Config
# SigV2-Client für Datenoperationen (PUT/GET/DELETE)
config_v2 = Config(
region_name='fr1',
signature_version='s3', # SigV2 (Legacy)
s3={'addressing_style': 'path'},
retries={'max_attempts': 3, 'mode': 'adaptive'}
)
client_data = boto3.client(
's3',
aws_access_key_id=access_key,
aws_secret_access_key=secret_key,
endpoint_url=endpoint_url,
config=config_v2
)
# SigV4-Client für Metadaten-Operationen (HEAD/LIST)
config_v4 = Config(
region_name='fr1',
signature_version='s3v4',
s3={'addressing_style': 'path', 'payload_signing_enabled': False},
retries={'max_attempts': 3, 'mode': 'adaptive'}
)
client_metadata = boto3.client(
's3',
aws_access_key_id=access_key,
aws_secret_access_key=secret_key,
endpoint_url=endpoint_url,
config=config_v4
)
Wenn Sie nur einen einzigen Client verwenden möchten, bevorzugen Sie SigV2 (signature_version='s3') mit Path-Style Addressing, was für die meisten Operationen funktioniert:
config = Config(
region_name='fr1',
signature_version='s3',
s3={'addressing_style': 'path'}
)
s3 = boto3.client(
's3',
aws_access_key_id=access_key,
aws_secret_access_key=secret_key,
endpoint_url=endpoint_url,
config=config
)
1. Dateien in einem S3-Bucket auflisten
Um alle Objekte eines Buckets aufzulisten, können Sie einen paginator verwenden. Dies ist die robusteste Methode, um eine große Anzahl von Objekten zu durchlaufen, ohne API-Antwortlimits zu riskieren.
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import boto3
from botocore.config import Config
# Initialisierung des S3-Clients (SigV4 für LIST empfohlen)
s3_client = boto3.client(
's3',
aws_access_key_id=access_key,
aws_secret_access_key=secret_key,
endpoint_url=endpoint_url,
config=Config(
region_name='fr1',
signature_version='s3v4',
s3={'addressing_style': 'path'}
)
)
paginator = s3_client.get_paginator('list_objects_v2')
operation_parameters = {'Bucket': bucket_name}
for page in paginator.paginate(**operation_parameters):
for obj in page.get('Contents', []):
print(f"{obj['Key']} - {obj['Size']} Bytes")
2. Ein Objekt hochladen (Upload)
Die Methode put_object ermöglicht das Hochladen von Daten in einen Bucket. Sie ist besonders nützlich, wenn die Daten im Speicher generiert oder verarbeitet werden.
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import boto3
import json
from botocore.config import Config
# S3-Konfiguration (SigV2 für PUT empfohlen)
s3 = boto3.client(
's3',
aws_access_key_id=access_key,
aws_secret_access_key=secret_key,
endpoint_url=endpoint_url,
config=Config(
region_name='fr1',
signature_version='s3',
s3={'addressing_style': 'path'}
)
)
json_file = {
"id": 12345,
"nom": "Dupont",
"prenom": "Claire",
"email": "claire.dupont@example.com",
"actif": True,
"date_creation": "2024-10-15T08:30:00Z"
}
key = "users/dupont_claire.json"
# Konvertierung in JSON-String, dann in Bytes
json_str = json.dumps(json_file, indent=2)
body_bytes = json_str.encode("utf-8")
result = s3.put_object(
Bucket=bucket_name,
Key=key,
Body=body_bytes,
ContentType="application/json"
)
print(f"Upload erfolgreich: {result['ResponseMetadata']['HTTPStatusCode']}")
Berechtigungen (ACL) beim Hochladen festlegen
Sie können Zugriffsberechtigungen (ACL) direkt beim Aufruf von put_object angeben:
result = s3.put_object(
Bucket=bucket_name,
Key=key,
Body=body_bytes,
ContentType="application/json",
ACL="public-read" # Das Objekt öffentlich lesbar machen
)
3. Ein Objekt lesen (Download)
Um den Inhalt eines Objekts abzurufen, verwenden Sie die Methode get_object. Sie gibt ein Objekt vom Typ StreamingBody zurück, das Sie lesen können, um die Rohdaten zu erhalten.
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import boto3
from botocore.config import Config
# Initialisierung des S3-Clients (SigV2 für GET empfohlen)
s3 = boto3.client(
's3',
aws_access_key_id=access_key,
aws_secret_access_key=secret_key,
endpoint_url=endpoint_url,
config=Config(
region_name='fr1',
signature_version='s3',
s3={'addressing_style': 'path'}
)
)
response = s3.get_object(Bucket=bucket_name, Key='users/dupont_claire.json')
content = response['Body'].read().decode('utf-8')
print(content)
4. Ein Objekt löschen
Die Methode delete_object ermöglicht das dauerhafte Löschen eines Objekts aus einem Bucket.
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import boto3
from botocore.config import Config
# Initialisierung des S3-Clients (SigV2 für DELETE empfohlen)
s3 = boto3.client(
's3',
aws_access_key_id=access_key,
aws_secret_access_key=secret_key,
endpoint_url=endpoint_url,
config=Config(
region_name='fr1',
signature_version='s3',
s3={'addressing_style': 'path'}
)
)
key = "users/dupont_claire.json"
result = s3.delete_object(Bucket=bucket_name, Key=key)
print(f"Löschung: {result['ResponseMetadata']['HTTPStatusCode']}")
5. Ein Objekt öffentlich machen (Read All)
Wenn ein Objekt bereits existiert, können Sie seine Berechtigungen ändern, um es mit der Methode put_object_acl öffentlich lesbar zu machen.
Ein Objekt öffentlich zu machen bedeutet, dass jeder mit der URL darauf zugreifen kann. Verwenden Sie diese Option mit Vorsicht und gemäß Ihrer Sicherheitsrichtlinie.
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import boto3
from botocore.config import Config
# S3-Konfiguration
s3 = boto3.client(
's3',
aws_access_key_id=access_key,
aws_secret_access_key=secret_key,
endpoint_url=endpoint_url,
config=Config(
region_name='fr1',
signature_version='s3',
s3={'addressing_style': 'path'}
)
)
key = "users/dupont_claire.json"
s3.put_object_acl(Bucket=bucket_name, Key=key, ACL="public-read")
public_url = f"{endpoint_url.rstrip('/')}/{bucket_name}/{key}"
print("Öffentliche URL:", public_url)
Fehlerbehebung
Fehler XAmzContentSHA256Mismatch
Wenn dieser Fehler bei PUT-Operationen auftritt:
An error occurred (XAmzContentSHA256Mismatch) when calling the PutObject operation
Ursache: Die Cloud Temple Objektspeicher-Infrastruktur (Dell ECS) kann Inkompatibilitäten mit der von SigV4 verwendeten SHA-256-Hash-Berechnung bei Schreibvorgängen aufweisen.
Lösung: Wechseln Sie für Datenoperationen zur SigV2-Signatur:
config = Config(
region_name='fr1',
signature_version='s3', # SigV2 anstelle von s3v4 verwenden
s3={'addressing_style': 'path'}
)
Fehler SignatureDoesNotMatch
Wenn dieser Fehler auftritt, prüfen Sie Folgendes:
- Dass Ihre Zugriffsschlüssel (
access_key_idundsecret_access_key) korrekt sind - Dass die Region ordnungsgemäß auf
fr1eingestellt ist - Dass Sie den richtigen Endpunkt verwenden (Format:
https://IHR_NAMESPACE.s3.fr1.cloud-temple.com)
Bucket nicht gefunden
Stellen Sie sicher, dass Sie Path-Style Addressing (s3={'addressing_style': 'path'}) in der Konfiguration verwenden. Virtual-Hosted Style wird erst ab Q2 2026 unterstützt.