Python verwenden
Die Python-Unterstützung wird über eine Verzweigung der Bibliothek boto3 bereitgestellt. Sie verfügt über Funktionen zur optimalen Nutzung von IBM Cloud® Object Storage.
Sie kann vom Python-Paketindex über pip install ibm-cos-sdk installiert werden.
Der Quellcode ist unter zu finden GitHub.
Von der Bibliothek ibm_boto3 wird vollständiger Zugriff auf die IBM Cloud® Object Storage-API bereitgestellt. Endpunkte, ein API-Schlüssel und die Instanz-ID müssen während der Erstellung einer Serviceressource oder eines Low-Level-Clients
wie in den folgenden einfachen Beispielen dargestellt angegeben werden.
Die Service-Instanz-ID wird auch als Ressourcen instanz-ID bezeichnet. Der Wert kann durch Erstellen eines Serviceberechtigungsnachweises oder über eine Befehlszeilenschnittstelle gesucht werden.
Ausführliche Dokumentation finden Sie hier.
Client erstellen und Berechtigungsnachweise ableiten
Zum Herstellen einer Verbindung zu COS wird ein Client erstellt und anhand von Berechtigungsnachweisinformationen (API-Schlüssel und Serviceinstanz-ID) konfiguriert. Diese Werte können auch automatisch aus einer Berechtigungsnachweisdatei oder aus Umgebungsvariablen abgeleitet werden.
Nach dem Generieren eines Serviceberechtigungsnachweises kann das daraus resultierende JSON-Dokument unter ~/.bluemix/cos_credentials gespeichert
werden. Vom SDK wird diese Datei automatisch als Quelle für die Berechtigungsnachweise verwendet, sofern während der Clienterstellung nicht explizit andere Berechtigungsnachweise festgelegt werden. Wenn die Datei cos_credentials HMAC-Schlüssel enthält, authentifiziert sich der Client mit einer Signatur. Andernfalls verwendet der Client den bereitgestellten API-Schlüssel für die Authentifizierung unter Verwendung eines Trägertokens (die Verwendung eines API-Schlüssels
erfordert weiterhin, dass config=Config(signature_version="oauth") während der Clienterstellung eingeschlossen wird).
Falls Sie eine Migration von AWS S3 durchführen, können Sie die Daten für die Berechtigungsnachweise aus ~/.aws/credentials im folgenden Format verwenden:
[default]
aws_access_key_id = {API_KEY}
aws_secret_access_key = {SERVICE_INSTANCE_ID}
Hinweis: Wenn sowohl ~/.bluemix/cos_credentials als auch ~/.aws/credentials vorhanden sind, cos_credentials hat Vorrang.
Erforderliche Informationen erfassen
In den Beispielen werden die folgenden Variablen verwendet:
bucket_namemuss eine eindeutige und DNS-sichere Zeichenfolge sein. Da Bucketnamen im gesamten System eindeutig sind, müssen diese Werte geändert werden, wenn dieses Beispiel mehrfach ausgeführt wird. Beachten Sie, dass die Namen nach ihrer Löschung noch ca. zehn bis fünfzehn Minuten reserviert bleiben.ibm_api_key_idist der Wert, der im Serviceberechtigungsnachweis alsapikeygefunden wird.ibm_service_instance_idist der Wert, der im Serviceberechtigungsnachweis alsresource_instance_idgefunden wird.endpoint_urlist eine Serviceendpunkt-URL, einschließlich des Protokollshttps://. Dieser Wert ist nicht der Wert fürendpoints, der im Serviceberechtigungsnachweis gefunden wird. Weitere Informationen zu Endpunkten enthält Endpunkte und Speicherpositionen.LocationConstraintist ein gültiger Bereitstellungscode, der dem Wert vonendpointentspricht.
Codebeispiele
Codebeispiele wurden auf unterstützten Releaseversionen von Pythongetestet.
In Ihrem Code müssen Sie die spitzen Klammern oder alle anderen überschüssigen Zeichen entfernen, die hier zur Veranschaulichung bereitgestellt werden.
Konfiguration initialisieren
In diesem Beispiel wird ein resource-Objekt erstellt. Eine Ressource stellt eine objektorientierte Schnittstelle zu COS bereit. Dies ermöglicht eine höhere Abstraktionsebene als die von einem Clientobjekt bereitgestellten Low-Level-Aufrufe.
Beachten Sie, dass einige Vorgänge (z. B. die Hochgeschwindigkeitsübertragung „ Aspera “) ein client Objekt erfordern. Aspera selbst erfordert die Version „ Python “ 3.6.
Hinweis zu älteren Versionen: Die Unterstützung für „ Aspera “ gilt als veraltet. Verwenden Sie stattdessen die Aspera Transfer SDK.
import ibm_boto3
from ibm_botocore.client import Config, ClientError
# Constants for IBM COS values
COS_ENDPOINT = "<endpoint>" # Current list avaiable at https://control.cloud-object-storage.cloud.ibm.com/v2/endpoints
COS_API_KEY_ID = "<api-key>" # eg "W00YixxxxxxxxxxMB-odB-2ySfTrFBIQQWanc--P3byk"
COS_INSTANCE_CRN = "<service-instance-id>" # eg "crn:v1:bluemix:public:cloud-object-storage:global:a/3bf0d9003xxxxxxxxxx1c3e97696b71c:d6f04d83-6c4f-4a62-a165-696756d63903::"
# Create resource
cos_resource = ibm_boto3.resource("s3",
ibm_api_key_id=COS_API_KEY_ID,
ibm_service_instance_id=COS_INSTANCE_CRN,
config=Config(signature_version="oauth"),
endpoint_url=COS_ENDPOINT
)
Ein Client stellt eine Low-Level-Schnittstelle zur COS- S3-API bereit. Dadurch können die Antworten von HTTP direkt verarbeitet werden, anstatt auf abstrakte Methoden und Attribute zurückzugreifen, die von einer Ressource bereitgestellt werden, um auf die in den Headern oder XML-Antwort-Payloads enthaltenen Informationen zuzugreifen.
import ibm_boto3
from ibm_botocore.client import Config, ClientError
# Constants for IBM COS values
COS_ENDPOINT = "<endpoint>" # Current list avaiable at https://control.cloud-object-storage.cloud.ibm.com/v2/endpoints
COS_API_KEY_ID = "<api-key>" # eg "W00YixxxxxxxxxxMB-odB-2ySfTrFBIQQWanc--P3byk"
COS_INSTANCE_CRN = "<service-instance-id>" # eg "crn:v1:bluemix:public:cloud-object-storage:global:a/3bf0d9003xxxxxxxxxx1c3e97696b71c:d6f04d83-6c4f-4a62-a165-696756d63903::"
# Create client
cos_client = ibm_boto3.client("s3",
ibm_api_key_id=COS_API_KEY_ID,
ibm_service_instance_id=COS_INSTANCE_CRN,
config=Config(signature_version="oauth"),
endpoint_url=COS_ENDPOINT
)
Schlüsselwerte
<endpoint>- Öffentlicher Endpunkt für Ihre Cloud- Object Storage mit Schemapräfix („ https:// “) (verfügbar über das IBM Cloud-Dashboard ). Weitere Informationen zu Endpunkten enthält Endpunkte und Speicherpositionen.<api-key>- API-Schlüssel, der bei der Erstellung der Dienstanmeldeinformationen generiert wird (für die Beispiele zur Erstellung und Löschung ist Schreibzugriff erforderlich)<service-instance-id>- Ressourcen-ID für Ihre Cloud- Object Storage (verfügbar über die IBM Cloud-CLI oder das IBM Cloud-Dashboard)<location>- Standardstandort für Ihre Cloud- Object Storage (muss mit der Region übereinstimmen, die für<endpoint>verwendet wird)
SDK-Referenzen
Neues Bucket erstellen
In den folgenden Beispielen wird ein Client verwendet, der eine Low-Level-Schnittstelle ist.
Auf eine Liste gültiger Bereitstellungscodes für LocationConstraint kann im Handbuch für Speicherklassen verwiesen werden.
def create_bucket(bucket_name):
print("Creating new bucket: {0}".format(bucket_name))
try:
cos_client.create_bucket(
Bucket=bucket_name,
CreateBucketConfiguration={
"LocationConstraint":COS_BUCKET_LOCATION
}
)
print("Bucket: {0} created!".format(bucket_name))
except ClientError as be:
print("CLIENT ERROR: {0}\n".format(be))
except Exception as e:
print("Unable to create bucket: {0}".format(e))
SDK-Referenzen
Methoden
Neue Textdatei erstellen
def create_text_file(bucket_name, item_name, file_text):
print("Creating new item: {0}".format(item_name))
try:
cos_client.put_object(
Bucket=bucket_name,
Key=item_name,
Body=file_text
)
print("Item: {0} created!".format(item_name))
except ClientError as be:
print("CLIENT ERROR: {0}\n".format(be))
except Exception as e:
print("Unable to create text file: {0}".format(e))
SDK-Referenzen
Methoden
Verfügbare Buckets auflisten
def get_buckets():
print("Retrieving list of buckets")
try:
buckets = cos_client.list_buckets()
for bucket in buckets["Buckets"]:
print("Bucket Name: {0}".format(bucket["Name"]))
except ClientError as be:
print("CLIENT ERROR: {0}\n".format(be))
except Exception as e:
print("Unable to retrieve list buckets: {0}".format(e))
SDK-Referenzen
Methoden
Elemente in Bucket auflisten
def get_bucket_contents(bucket_name):
print("Retrieving bucket contents from: {0}".format(bucket_name))
try:
files = cos_client.list_objects(Bucket=bucket_name)
for file in files.get("Contents", []):
print("Item: {0} ({1} bytes).".format(file["Key"], file["Size"]))
except ClientError as be:
print("CLIENT ERROR: {0}\n".format(be))
except Exception as e:
print("Unable to retrieve bucket contents: {0}".format(e))
SDK-Referenzen
Methoden
Dateiinhalt eines bestimmten Elements abrufen
def get_item(bucket_name, item_name):
print("Retrieving item from bucket: {0}, key: {1}".format(bucket_name, item_name))
try:
file = cos_client.get_object(Bucket=bucket_name, Key=item_name)
print("File Contents: {0}".format(file["Body"].read()))
except ClientError as be:
print("CLIENT ERROR: {0}\n".format(be))
except Exception as e:
print("Unable to retrieve file contents: {0}".format(e))
SDK-Referenzen
Methoden
Element in Bucket löschen
def delete_item(bucket_name, object_name):
try:
cos_client.delete_object(Bucket=bucket_name, Key=object_name)
print("Item: {0} deleted!\n".format(object_name))
except ClientError as be:
print("CLIENT ERROR: {0}\n".format(be))
except Exception as e:
print("Unable to delete object: {0}".format(e))
SDK-Referenzen
Methoden
Mehrere Elemente in Bucket löschen
Eine Löschanforderung kann maximal 1000 Schlüssel enthalten, die gelöscht werden sollen. Dies ist zwar nützlich, um die Leistungseinbußen pro Anfrage zu reduzieren, aber seien Sie vorsichtig, wenn Sie viele Schlüssel löschen. Berücksichtigen Sie auch die Größen der Objekte, um eine geeignete Leistung zu gewährleisten.
def delete_items(bucket_name):
try:
delete_request = {
"Objects": [
{ "Key": "deletetest/testfile1.txt" },
{ "Key": "deletetest/testfile2.txt" },
{ "Key": "deletetest/testfile3.txt" },
{ "Key": "deletetest/testfile4.txt" },
{ "Key": "deletetest/testfile5.txt" }
]
}
response = cos_client.delete_objects(
Bucket=bucket_name,
Delete=delete_request
)
print("Deleted items for {0}\n".format(bucket_name))
print(json.dumps(response.get("Deleted"), indent=4))
except ClientError as be:
print("CLIENT ERROR: {0}\n".format(be))
except Exception as e:
print("Unable to copy item: {0}".format(e))
SDK-Referenzen
Methoden
Bucket löschen
def delete_bucket(bucket_name):
print("Deleting bucket: {0}".format(bucket_name))
try:
cos_client.delete_bucket(Bucket=bucket_name)
print("Bucket: {0} deleted!".format(bucket_name))
except ClientError as be:
print("CLIENT ERROR: {0}\n".format(be))
except Exception as e:
print("Unable to delete bucket: {0}".format(e))
SDK-Referenzen
Methoden
Die Bucket-Namen bleiben nach dem Löschen für 10 bis 15 Minuten reserviert.
Mehrteiligen Upload ausführen
Binärdatei hochladen (bevorzugte Methode)
Die upload_fileobj Methode des S3-Objekts führt bei Bedarf automatisch einen mehrteiligen
Upload durch. Die TransferConfig Klasse wird verwendet, um den Schwellenwert für die Verwendung des mehrteiligen
Uploads zu bestimmen.
def multi_part_upload(bucket_name, item_name, file_path):
try:
print("Starting file transfer for {0} to bucket: {1}\n".format(item_name, bucket_name))
# set 5 MB chunks
part_size = 1024 * 1024 * 5
# set threadhold to 15 MB
file_threshold = 1024 * 1024 * 15
# set the transfer threshold and chunk size
transfer_config = ibm_boto3.s3.transfer.TransferConfig(
multipart_threshold=file_threshold,
multipart_chunksize=part_size
)
# the upload_fileobj method will automatically execute a multi-part upload
# in 5 MB chunks for all files over 15 MB
with open(file_path, "rb") as file_data:
cos_client.upload_fileobj(
Bucket=bucket_name,
Key=item_name,
Fileobj=file_data,
Config=transfer_config
)
print("Transfer for {0} Complete!\n".format(item_name))
except ClientError as be:
print("CLIENT ERROR: {0}\n".format(be))
except Exception as e:
print("Unable to complete multi-part upload: {0}".format(e))
SDK-Referenzen
Methoden
Mehrteiligen Upload manuell ausführen
Bei Bedarf kann die S3.Client Klasse für einen mehrteiligen Upload verwendet werden. Dies kann nützlich sein, wenn mehr Kontrolle über den Uploadprozess erforderlich ist.
def multi_part_upload_manual(bucket_name, item_name, file_path):
try:
# create client object
cos_client = ibm_boto3.client("s3",
ibm_api_key_id=COS_API_KEY_ID,
ibm_service_instance_id=COS_SERVICE_CRN,
config=Config(signature_version="oauth"),
endpoint_url=COS_ENDPOINT
)
print("Starting multi-part upload for {0} to bucket: {1}\n".format(item_name, bucket_name))
# initiate the multi-part upload
mp = cos_client.create_multipart_upload(
Bucket=bucket_name,
Key=item_name
)
upload_id = mp["UploadId"]
# min 20MB part size
part_size = 1024 * 1024 * 20
file_size = os.stat(file_path).st_size
part_count = int(math.ceil(file_size / float(part_size)))
data_packs = []
position = 0
part_num = 0
# begin uploading the parts
with open(file_path, "rb") as file:
for i in range(part_count):
part_num = i + 1
part_size = min(part_size, (file_size - position))
print("Uploading to {0} (part {1} of {2})".format(item_name, part_num, part_count))
file_data = file.read(part_size)
mp_part = cos_client.upload_part(
Bucket=bucket_name,
Key=item_name,
PartNumber=part_num,
Body=file_data,
ContentLength=part_size,
UploadId=upload_id
)
data_packs.append({
"ETag":mp_part["ETag"],
"PartNumber":part_num
})
position += part_size
# complete upload
cos_client.complete_multipart_upload(
Bucket=bucket_name,
Key=item_name,
UploadId=upload_id,
MultipartUpload={
"Parts": data_packs
}
)
print("Upload for {0} Complete!\n".format(item_name))
except ClientError as be:
# abort the upload
cos_client.abort_multipart_upload(
Bucket=bucket_name,
Key=item_name,
UploadId=upload_id
)
print("Multi-part upload aborted for {0}\n".format(item_name))
print("CLIENT ERROR: {0}\n".format(be))
except Exception as e:
print("Unable to complete multi-part upload: {0}".format(e))
SDK-Referenzen-Fortsetzung
Klassen
Methoden
Upload großer Objekte mit TransferManager
Von TransferManager wird eine weitere Möglichkeit zum Ausführen großer Dateiübertragen durch das automatische Integrieren mehrteiliger Uploads bereitgestellt, sofern das Einstellen von Konfigurationsparametern erforderlich ist.
def upload_large_file(bucket_name, item_name, file_path):
print("Starting large file upload for {0} to bucket: {1}".format(item_name, bucket_name))
# set the chunk size to 5 MB
part_size = 1024 * 1024 * 5
# set threadhold to 5 MB
file_threshold = 1024 * 1024 * 5
# Create client connection
cos_client = ibm_boto3.client("s3",
ibm_api_key_id=COS_API_KEY_ID,
ibm_service_instance_id=COS_SERVICE_CRN,
config=Config(signature_version="oauth"),
endpoint_url=COS_ENDPOINT
)
# set the transfer threshold and chunk size in config settings
transfer_config = ibm_boto3.s3.transfer.TransferConfig(
multipart_threshold=file_threshold,
multipart_chunksize=part_size
)
# create transfer manager
transfer_mgr = ibm_boto3.s3.transfer.TransferManager(cos_client, config=transfer_config)
try:
# initiate file upload
future = transfer_mgr.upload(file_path, bucket_name, item_name)
# wait for upload to complete
future.result()
print ("Large file upload complete!")
except Exception as e:
print("Unable to complete large file upload: {0}".format(e))
finally:
transfer_mgr.shutdown()
Elemente in Bucket auflisten (v2)
S3.Client-Clientobjekt hat eine aktualisierte Methode zum Auflisten der Inhalte (list_objects_v2). Mit dieser Methode können Sie die Anzahl der zurückgegebenen Datensätze begrenzen und die Datensätze stapelweise abrufen. Dies kann beim Paging der Ergebnisse in einer Anwendung nützlich sein und die Leistung verbessern.
def get_bucket_contents_v2(bucket_name, max_keys):
print("Retrieving bucket contents from: {0}".format(bucket_name))
try:
# create client object
cos_client = ibm_boto3.client("s3",
ibm_api_key_id=COS_API_KEY_ID,
ibm_service_instance_id=COS_SERVICE_CRN,
config=Config(signature_version="oauth"),
endpoint_url=COS_ENDPOINT)
more_results = True
next_token = ""
while (more_results):
response = cos_client.list_objects_v2(Bucket=bucket_name, MaxKeys=max_keys, ContinuationToken=next_token)
files = response["Contents"]
for file in files:
print("Item: {0} ({1} bytes).".format(file["Key"], file["Size"]))
if (response["IsTruncated"]):
next_token = response["NextContinuationToken"]
print("...More results in next batch!\n")
else:
more_results = False
next_token = ""
except ClientError as be:
print("CLIENT ERROR: {0}\n".format(be))
except Exception as e:
print("Unable to retrieve bucket contents: {0}".format(e))
SDK-Referenzen
Methoden
Erstellen einer Sicherungsrichtlinie
# Config values
api_key = "<API_KEY>"
vault_crn = "<SERVICE_INSTANCE_ID>"
source_bucket_name = "<BACKUP_VAULT_NAME>"
policy_name = "<POLICY_NAME>"
# Authenticator and client setup
authenticator = IAMAuthenticator(apikey=api_key)
rc_client = ResourceConfigurationV1(authenticator=authenticator)
# Create policy
create_backup_policy = rc_client.create_backup_policy(
bucket=source_bucket_name,
policy_name=policy_name,
target_backup_vault_crn=vault_crn,
backup_type="continuous",
initial_retention={"delete_after_days": 1}
)
# Print response
print(f" Policy created: { create_backup_policy }")
Auflistung einer Sicherungsrichtlinie
# Config values
api_key = "<API_KEY>"
source_bucket_name = "<BACKUP_VAULT_NAME>"
# Authenticator and client setup
authenticator = IAMAuthenticator(apikey=api_key)
rc_client = ResourceConfigurationV1(authenticator=authenticator)
# List all backup policies
list_response = rc_client.list_backup_policies(bucket=source_bucket_name)
print("\nList of backup policies:")
for policy in list_response.result.get("backup_policies", []):
print(policy)
Erstellen Sie eine Backup-Richtlinie
# Config
api_key = "<API_KEY>"
source_bucket_name = "<SOURCE_BUCKET_NAME>"
backup_vault_crn = "<BACKUP_VAULT_CRN>"
policy_name = "<POLICY_NAME>"
# Setup authenticator and client
authenticator = IAMAuthenticator(apikey=api_key)
rc_client = ResourceConfigurationV1(authenticator=authenticator)
# Create backup policy
create_backup_policy_response = rc_client.create_backup_policy(
bucket=source_bucket_name,
policy_name=policy_name,
target_backup_vault_crn=backup_vault_crn,
backup_type="continuous",
initial_retention={"delete_after_days": 1}
)
# Extract policy ID
policy_id = create_backup_policy_response.result.get("policy_id")
get_backup_policy_response = rc_client.get_backup_policy(
bucket=source_bucket_name,
policy_id=policy_id
)
print("\nFetched Backup Policy Details:")
print(get_backup_policy_response.result)
Löschen einer Sicherungsrichtlinie
# Config
api_key = "<API_KEY>"
source_bucket_name = "<SOURCE_BUCKET_NAME>"
policy_id = "<POLICY_ID>"
# Setup authenticator and client
authenticator = IAMAuthenticator(apikey=api_key)
rc_client = ResourceConfigurationV1(authenticator=authenticator)
# Delete the backup policy
delete_backup_policy_response = rc_client.delete_backup_policy(
bucket=source_bucket_name,
policy_id=policy_id
)
print(f"Backup policy '{policy_id}' deleted successfully.")
Erstellen eines Backup Tresors
# Config
api_key = "<API_KEY>"
service_instance_id = "<SERVICE_INSTANCE_ID>"
backup_vault_name = "<BACKUP_VAULT_NAME>"
region = "<REGION>"
# Setup authenticator and client
authenticator = IAMAuthenticator(apikey=api_key)
rc_client = ResourceConfigurationV1(authenticator=authenticator)
# Create a backup vault
create_backup_vault_response = rc_client.create_backup_vault(
service_instance_id=service_instance_id,
backup_vault_name=backup_vault_name,
region=region
)
# Output result
print("Backup vault created:")
print(create_backup_vault_response.result)
Auflistung von Backup-Tresoren
# Config
api_key = "<API_KEY>"
service_instance_id = "<SERVICE_INSTANCE_ID>"
# Setup authenticator and client
authenticator = IAMAuthenticator(apikey=api_key)
rc_client = ResourceConfigurationV1(authenticator=authenticator)
# List backup vaults
list_backup_vaults_response = rc_client.list_backup_vaults(
service_instance_id=service_instance_id
)
print("List of backup vaults:")
print(list_backup_vaults_response.result)
Backup-Tresore erhalten
# Config
api_key = "<API_KEY>"
backup_vault_name = "<BACKUP_VAULT_NAME>"
# Setup authenticator and client
authenticator = IAMAuthenticator(apikey=api_key)
rc_client = ResourceConfigurationV1(authenticator=authenticator)
# Get backup vault
get_backup_vault = rc_client.get_backup_vault(
backup_vault_name=backup_vault_name
)
# Output result
print("Backup vault details:")
print(get_backup_vault.result)
Backup-Tresore aktualisieren
# Config
api_key = "<API_KEY>"
backup_vault_name = "<BACKUP_VAULT_NAME>"
# Setup authenticator and client
authenticator = IAMAuthenticator(apikey=api_key)
rc_client = ResourceConfigurationV1(authenticator=authenticator)
# Update backup vault settings (disable activity tracking and metrics monitoring)
backup_vault_patch = {
"activity_tracking": {"management_events": True},
"metrics_monitoring": {"usage_metrics_enabled": True},
}
update_backup_vault_response = rc_client.update_backup_vault(
backup_vault_name=backup_vault_name,
backup_vault_patch=backup_vault_patch
)
# Output result
print("Backup vault updated successfully.")
print(update_backup_vault_response)
Löschen eines Sicherungsdepots
# Config
api_key = "<API_KEY>"
backup_vault_name = "<BACKUP_VAULT_NAME>"
# Setup authenticator and client
authenticator = IAMAuthenticator(apikey=api_key)
rc_client = ResourceConfigurationV1(authenticator=authenticator)
# Delete the backup vault
delete_vault_response = rc_client.delete_backup_vault(
backup_vault_name=backup_vault_name
)
# Output result
print(f"Successfully deleted backup vault '{delete_vault_response}'.")
Auflistung der Verwertungsspannen
# Config
api_key = "<API_KEY>"
backup_vault_name = "<BACKUP_VAULT_NAME>"
# Setup authenticator and client
authenticator = IAMAuthenticator(apikey=api_key)
rc_client = ResourceConfigurationV1(authenticator=authenticator)
# List recovery ranges
recovery_ranges_response = rc_client.list_recovery_ranges(
backup_vault_name=backup_vault_name
)
# Output recovery range results
print("Recovery Ranges:")
print(recovery_ranges_response.result)
Erholungsbereich erhalten
# Config
api_key = "<API_KEY>"
backup_vault_name = "<BACKUP_VAULT_NAME>"
recovery_range_id = "<RECOVERY_RANGE_ID>"
# Setup authenticator and client
authenticator = IAMAuthenticator(apikey=api_key)
rc_client = ResourceConfigurationV1(authenticator=authenticator)
get_recovery_range_response = rc_client.get_source_resource_recovery_range(
backup_vault_name=backup_vault_name,
recovery_range_id=recovery_range_id
)
print("Recovery Range Details:")
print(get_recovery_range_response.result)
Wiederherstellungsbereich aktualisieren
# Config
api_key = "<API_KEY>"
backup_vault_name = "<BACKUP_VAULT_NAME>"
recovery_range_id = "<RECOVERY_RANGE_ID>"
# Setup authenticator and client
authenticator = IAMAuthenticator(apikey=api_key)
rc_client = ResourceConfigurationV1(authenticator=authenticator)
recovery_range_patch_model = {}
recovery_range_patch_model['retention'] = {"delete_after_days": 99}
patch_response = rc_client.patch_source_resource_recovery_range(
backup_vault_name=backup_vault_name,
recovery_range_id=recovery_range_id,
recovery_range_patch=recovery_range_patch_model
)
print("Patch Response Details:")
print(patch_response)
Initiieren einer Wiederherstellung
# Configuration
api_key = "<API_KEY>"
backup_vault_name = "<BACKUP_VAULT_NAME>"
target_bucket_crn = "<TARGET_BUCKET_CRN>"
recovery_range_id = "<RECOVERY_RANGE_ID>"
restore_point_in_time = "<RESTORE_POINT_IN_TIME>"
# Setup authenticator and clients
authenticator = IAMAuthenticator(apikey=api_key)
rc_client = ResourceConfigurationV1(authenticator=authenticator)
# Initiate restore
create_restore = rc_client.create_restore(
backup_vault_name=backup_vault_name,
recovery_range_id=recovery_range_id,
restore_type="in_place",
restore_point_in_time=restore_point_in_time,
target_resource_crn=target_bucket_crn
)
print(f"Restore initiated : {create_restore}")
Auflistung Wiederherstellen
# Config
api_key = "<API_KEY>"
backup_vault_name = "<BACKUP_VAULT_NAME>"
# Setup authenticator and clients
authenticator = IAMAuthenticator(apikey=api_key)
rc_client = ResourceConfigurationV1(authenticator=authenticator)
# List restore operations
get_store = rc_client.get_restore(
backup_vault_name=backup_vault_name)
print("Restore response:")
print(get_store.result)
Details zur Wiederherstellung abrufen
# Config
api_key = "<API_KEY>"
source_bucket_name = "<SOURCE_BUCKET_NAME>"
backup_vault_crn = "<BACKUP_VAULT_CRN>"
backup_vault_name = "<BACKUP_VAULT_NAME>"
target_bucket_crn = "<TARGET_BUCKET_CRN>"
recovery_range_id = "<RECOVERY_RANGE_ID>"
restore_point_in_time = "<RESTORE_POINT_IN_TIME>"
# Setup authenticator and clients
authenticator = IAMAuthenticator(apikey=api_key)
rc_client = ResourceConfigurationV1(authenticator=authenticator)
# Create restore
create_restore = rc_client.create_restore(
backup_vault_name=backup_vault_name,
recovery_range_id=recovery_range_id,
restore_type="in_place",
restore_point_in_time=restore_point_in_time,
target_resource_crn=target_bucket_crn
)
restore_id = create_restore.result["restore_id"]
# List restore operations
get_store = rc_client.get_restore(
backup_vault_name=backup_vault_name, restore_id=restore_id)
print("Restore response:")
print(get_store.result)
Erstellen Sie einen neuen COS-Bucket mit aktivierter Objektsperre
def create_bucket_with_objectlock(bucket_name):
cos_cli.create_bucket(
Bucket=bucket_name,
ObjectLockEnabledForBucket=True,
)
print("Bucket: {0} created with objectlock enabled".format(bucket_name))
Objektsperrenkonfiguration mit Compliance-Modus auf COS-Bucket setzen
def objectlock_configuration_on_bucket(bucket_name):
# Putting default retenion on the COS bucket.
default_retention_rule = {'DefaultRetention': {'Mode': 'COMPLIANCE', 'Years': 1}}
object_lock_config = {'ObjectLockEnabled': 'Enabled', 'Rule': default_retention_rule}
cos_cli.put_object_lock_configuration(Bucket=bucket_name, ObjectLockConfiguration=object_lock_config)
Objektsperrenkonfiguration mit Governance-Modus auf COS-Bucket setzen
def objectlock_configuration_with_governance_mode_on_bucket(bucket_name):
# Putting default retenion on the COS bucket with governance mode.
default_retention_rule = {'DefaultRetention': {'Mode': 'GOVERNANCE', 'Years': 1}}
object_lock_config = {'ObjectLockEnabled': 'Enabled', 'Rule': default_retention_rule}
cos_cli.put_object_lock_configuration(Bucket=bucket_name, ObjectLockConfiguration=object_lock_config)
Objektsperrkonfiguration für COS-Bucket abrufen
def objectlock_configuration_with_governance_mode_on_bucket(bucket_name):
# Reading the objectlock configuration set on the bucket.
response = cos_cli.get_object_lock_configuration(Bucket=bucket_name)
print("Objectlock Configuration for {0} =>".format(bucket_name))
print(response.ObjectLockConfiguration)
Laden Sie ein Objekt mit Governance-Modus in den COS-Bucket hoch
def upload_object_with_governance_mode(bucket_name,object_name,object_content):
cos_cli.put_object(
Bucket=bucket_name,
Key=object_name,
Body=object_content,
ObjectLockMode='GOVERNANCE',
ObjectLockRetainUntilDate=datetime(2025, 11, 15)
)
print("Object: {0} uploaded!".format(object_name))
Objektsperre mit Compliance-Modus auf das Objekt anwenden
def objectlock_retention(bucket_name,object_name):
# Put objectlock retenion on the object uploaded to the bucket.
date = datetime.now()+timedelta(seconds=5)
retention_rule = {'Mode': 'COMPLIANCE', 'RetainUntilDate': date}
cos_cli.put_object_retention(Bucket=bucket_name, Key=object_name, Retention=retention_rule)
Objektsperre mit Governance-Modus auf das Objekt setzen
def objectlock_retention_with_governance_mode(bucket_name,object_name):
# Put objectlock retenion with governance mode on the object uploaded to the bucket.
date = datetime.now()+timedelta(seconds=5)
retention_rule = {'Mode': 'GOVERNANCE', 'RetainUntilDate': date}
cos_cli.put_object_retention(Bucket=bucket_name, Key=object_name, Retention=retention_rule)
Objektsperre beibehalten
def objectlock_retention_with_governance_mode(bucket_name,object_name):
# Get objectlock retention of the above object.
response = cos_cli.get_object_retention(Bucket=bucket_name, Key=object_name)
print("Objectlock Retention for {0}=>".format(object_name))
print(response.Retention)
Objekt sperren – Legal Hold
def objectlock_legal_hold(bucket_name,object_name):
# Setting the objectlock legal-hold status to ON.
cos_cli.put_object_legal_hold(Bucket=bucket_name, Key=object_name, legal_hold={'Status': 'ON'})
Objektsperre „Legal Hold“ setzen
def objectlock_legal_hold(bucket_name,object_name):
# Get objectlock retention of the above object.
response = cos_cli.get_object_legal_hold(Bucket=bucket_name, Key=object_name)
print("Objectlock legal-hold for {0}=>".format(object_name))
print(response.legal_hold)
Löschen eines Objekts mit Objektsperr-Governance-Modus unter Verwendung der Bypass-Governance
def delete_object_with_bypass_governance(bucket_name,object_name):
# Deleting an object with retention using bypass governance
cos_cli.delete_object(Bucket=bucket_name, Key=object_name, BypassGovernanceRetention=True)
Key Protect verwenden
Key Protect kann zu einem Speicherbucket hinzugefügt werden, um sensible ruhende Daten in der Cloud zu verschlüsseln.
Vorbereitende Schritte
Damit Sie ein Bucket erstellen können, während Key Protect aktiviert ist, müssen die folgenden Voraussetzungen erfüllt sein:
- Ein Key Protect-Service wird bereitgestellt
- Ein Stammschlüssel ist verfügbar (entweder generiert oder importiert)
Cloudressourcenname für Stammschlüssel abrufen
- Rufen Sie die Instanz-ID für den Key Protect-Service ab.
- Verwenden Sie die Key Protect-API, um alle verfügbaren Schlüssel abzurufen.
- Sie können entweder
curl-Befehle oder einen API-REST-Client wie zum Beispiel Postman für den Zugriff auf die Key Protect-API verwenden.
- Sie können entweder
- Rufen Sie den Cloudressourcennamen des Stammschlüssels ab, mit dem Sie Key Protect für das Bucket aktivieren. Der Cloudressourcenname ähnelt der folgenden Zeichenfolge:
crn:v1:bluemix:public:kms:us-south:a/3d624cd74a0dea86ed8efe3101341742:90b6a1db-0fe1-4fe9-b91e-962c327df531:key:0bg3e33e-a866-50f2-b715-5cba2bc93234
Bucket während Aktivierung von Key Protect erstellen
COS_KP_ALGORITHM = "<algorithm>"
COS_KP_ROOTKEY_CRN = "<root-key-crn>"
# Create a new bucket with key protect (encryption)
def create_bucket_kp(bucket_name):
print("Creating new encrypted bucket: {0}".format(bucket_name))
try:
cos_client.create_bucket(
Bucket=bucket_name,
CreateBucketConfiguration={
"LocationConstraint":COS_BUCKET_LOCATION
},
IBMSSEKPEncryptionAlgorithm=COS_KP_ALGORITHM,
IBMSSEKPCustomerRootKeyCrn=COS_KP_ROOTKEY_CRN
)
print("Encrypted Bucket: {0} created!".format(bucket_name))
except ClientError as be:
print("CLIENT ERROR: {0}\n".format(be))
except Exception as e:
print("Unable to create encrypted bucket: {0}".format(e))
Schlüsselwerte
<algorithm>- Der Verschlüsselungsalgorithmus, der für neue Objekte verwendet wird, die zum Bucket hinzugefügt werden (Standard ist „ AES256 “).<root-key-crn>- CRN des Root-Schlüssels, der vom Dienst „ Key Protect “ abgerufen wird.
SDK-Referenzen
Methoden
Aspera-Hochgeschwindigkeitsübertragung verwenden
Hinweis zu älteren Versionen: Die Unterstützung für „ Aspera “ gilt als veraltet. Benutzern wird empfohlen, Aspera Transfer SDK[https://developer.ibm.com/apis/catalog/aspera--aspera-transfer-sdk/API Reference]zu verwenden.
Hinweis zu älteren Versionen: Die Unterstützung für „ Aspera “ gilt als veraltet. Benutzern wird die Verwendung von Aspera Transfer SDKempfohlen.
Durch die Installation der Bibliothek für die Aspera-Hochgeschwindigkeitsübertragung können Sie Hochgeschwindigkeitsdateiübertragungen innerhalb der Anwendung verwenden. Die Aspera-Bibliothek ist keine Open Source-Bibliothek und somit eine optionale Abhängigkeit für das COS-SDK (von dem eine Apache-Lizenz verwendet wird).
Während jeder Aspera-Sitzung wird ein einzelner ascp-Prozess erstellt, der auf der Clientmaschine zur Durchführung der Übertragung ausgeführt wird. Vergewissern Sie sich, dass Ihre Datenverarbeitungsumgebung die Ausführung dieses
Prozesses unterstützt.
AsperaTransferManager initialisieren
Bevor Sie die Initialisierung AsperaTransferManager durchführen, vergewissern Sie sich, dass Sie über ein funktionierendes client (kein resource oder session) Objekt verfügen.
import ibm_boto3
from ibm_botocore.client import Config
from ibm_s3transfer.aspera.manager import AsperaTransferManager
COS_ENDPOINT = "<endpoint>" # Current list avaiable at https://control.cloud-object-storage.cloud.ibm.com/v2/endpoints
COS_API_KEY_ID = "<api-key>"
COS_RESOURCE_CRN = "<resource-instance-id>"
COS_BUCKET_LOCATION = "<location>"
# Create resource
cos_client = ibm_boto3.client("s3",
ibm_api_key_id=COS_API_KEY_ID,
ibm_service_instance_id=COS_RESOURCE_CRN,
config=Config(signature_version="oauth"),
endpoint_url=COS_ENDPOINT
)
transfer_manager = AsperaTransferManager(cos)
Für Aspera-Hochgeschwindigkeitsübertragungen müssen Sie einen IAM-API-Schlüssel angeben. HMAC-Berechtigungsnachweise werden NICHT unterstützt. Weitere Informationen zu IAM finden Sie hier.
Wenn Sie den höchsten Durchsatz erreichen möchten, teilen Sie die Übertragung in parallele Sitzungen auf, von denen Datenblöcke gesendet werden, deren Größe durch einen Schwellenwert definiert werden.
Eine typische Konfiguration für die Verwendung von Mehrfachsitzungen muss folgende Merkmale aufweisen:
- 2.500 MB/s Zielrate
- 100 MB Schwellenwert (dies ist der empfohlene Wert für die meisten Anwendungen)
ms_transfer_config = AsperaConfig(multi_session="all",
target_rate_mbps=2500,
multi_session_threshold_mb=100)
Im obigen Beispiel werden vom SDK ausreichend Sitzungen zum Erreichen der Zielrate von 2.500 MB/s generiert.
Darüber hinaus kann auch das Sitzungsmanagement im SDK explizit konfiguriert werden. Dies ist in den Fällen nützlich, in denen eine präzisere Kontrolle über die Netzauslastung gewünscht wird.
Eine typische Konfiguration für die Verwendung expliziter Mehrfachsitzungen muss folgende Merkmale aufweisen:
- 2 oder 10 Sitzungen
- 100 MB Schwellenwert (dies ist der empfohlene Wert für die meisten Anwendungen)
from ibm_s3transfer.aspera.manager import AsperaConfig
# Configure 2 sessions for transfer
ms_transfer_config = AsperaConfig(multi_session=2,
multi_session_threshold_mb=100)
# Create the Aspera Transfer Manager
transfer_manager = AsperaTransferManager(client=client,
transfer_config=ms_transfer_config)
Um in den meisten Szenarien die beste Leistung zu erzielen, sollten Sie immer mehrere Sitzungen verwenden, um die mit der Instanziierung einer Aspera Hochgeschwindigkeitsübertragung verbundenen Verarbeitungsprozesse zu minimieren. Falls die Netzkapazität mindestens 1 Gb/s beträgt, sollten Sie 10 Sitzungen verwenden. In Netzen mit niedrigerer Bandbreite sollten zwei Sitzungen verwendet werden.
Dateiupload
bucket_name = "<bucket-name>"
upload_filename = "<absolute-path-to-file>"
object_name = "<item-name>"
# Create Transfer manager
with AsperaTransferManager(client) as transfer_manager:
# Perform upload
future = transfer_manager.upload(upload_filename, bucket_name, object_name)
# Wait for upload to complete
future.result()
Schlüsselwerte
<bucket-name>- Name des Ziel-Buckets<absolute-path-to-file>- Verzeichnispfad und Dateiname der hochzuladenden Datei<item-name>- Name der neuen Datei, die zum Bucket hinzugefügt wurde
Dateidownload
bucket_name = "<bucket-name>"
download_filename = "<absolute-path-to-file>"
object_name = "<object-to-download>"
# Create Transfer manager
with AsperaTransferManager(client) as transfer_manager:
# Get object with Aspera
future = transfer_manager.download(bucket_name, object_name, download_filename)
# Wait for download to complete
future.result()
Schlüsselwerte
<bucket-name>- Name des Buckets in Ihrer Object Storage-Dienstinstanz, für den „ Aspera “ aktiviert ist.<absolute-path-to-file>- Verzeichnis und Dateiname, unter dem die Datei auf dem lokalen System gespeichert wird.<object-to-download>- Name der Datei im Bucket, die heruntergeladen werden soll.
Verzeichnisupload
bucket_name = "<bucket-name>"
# THIS DIRECTORY MUST EXIST LOCALLY, and have objects in it.
local_upload_directory = "<absolute-path-to-directory>"
# THIS SHOULD NOT HAVE A LEADING "/"
remote_directory = "<object prefix>"
# Create Transfer manager
with AsperaTransferManager(client) as transfer_manager:
# Perform upload
future = transfer_manager.upload_directory(local_upload_directory, bucket_name, remote_directory)
# Wait for upload to complete
future.result()
Schlüsselwerte
<bucket-name>- Name des Buckets in Ihrer Object Storage-Dienstinstanz, für den „ Aspera “ aktiviert ist<absolute-path-to-directory>- Lokales Verzeichnis, das die hochzuladenden Dateien enthält. Muss einen führenden und abschließenden Schrägstrich (/) aufweisen (Beispiel:/Users/testuser/Documents/Upload/).<object prefix>- Name des Verzeichnisses im Bucket, in dem die Dateien gespeichert werden sollen. Darf am Anfang keinen Schrägstrich (/) aufweisen (Beispiel:newuploads/).
Verzeichnisdownload
bucket_name = "<bucket-name>"
# THIS DIRECTORY MUST EXIST LOCALLY
local_download_directory = "<absolute-path-to-directory>"
remote_directory = "<object prefix>"
# Create Transfer manager
with AsperaTransferManager(client) as transfer_manager:
# Get object with Aspera
future = transfer_manager.download_directory(bucket_name, remote_directory, local_download_directory)
# Wait for download to complete
future.result()
Schlüsselwerte
<bucket-name>- Name des Buckets in Ihrer Object Storage-Dienstinstanz, für den „ Aspera “ aktiviert ist<absolute-path-to-directory>- Lokales Verzeichnis zum Speichern der heruntergeladenen Dateien. Muss einen führenden und einen nachfolgenden Schrägstrich/enthalten (das heißt/Users/testuser/Downloads/)<object prefix>- Name des Verzeichnisses im Bucket, in dem die Dateien gespeichert werden sollen. Darf am Anfang keinen Schrägstrich (/) aufweisen (Beispiel:todownload/).
Abonnenten verwenden
Abonnenten ermöglichen in Übertragungen Beobachtbarkeit, weil angepasste Callback-Methoden zugeordnet werden können. Alle Übertragungen laufen in den folgenden Phasen ab:
Queued - In Progress - Done
Für jede Phase gibt es drei verfügbare Abonnenten:
CallbackOnQueued()- Wird aufgerufen, wenn zuAsperaTransferManagereine neue Übertragung hinzugefügt wurde.CallbackOnProgress()- Wird aufgerufen, wenn in einer Übertragung der Transfer von Daten durchgeführt wurde (wird wiederholt gestartet, während die Übertragung in Bearbeitung ist).CallbackOnDone()- Wird aufgerufen, sobald die Übertragung abgeschlossen ist.
bucket_name = "<bucket-name>"
local_download_directory = "<absolute-path-to-directory>"
remote_directory = "<object prefix>"
# Subscriber callbacks
class CallbackOnQueued(AsperaBaseSubscriber):
def __init__(self):
pass
def on_queued(self, future, **kwargs):
print("Directory download queued.")
class CallbackOnProgress(AsperaBaseSubscriber):
def __init__(self):
pass
def on_progress(self, future, bytes_transferred, **kwargs):
print("Directory download in progress: %s bytes transferred" % bytes_transferred)
class CallbackOnDone(AsperaBaseSubscriber):
def __init__(self):
pass
def on_done(self, future, **kwargs):
print("Downloads complete!")
# Create Transfer manager
transfer_manager = AsperaTransferManager(client)
# Attach subscribers
subscribers = [CallbackOnQueued(), CallbackOnProgress(), CallbackOnDone()]
# Get object with Aspera
future = transfer_manager.download_directory(bucket_name, remote_directory, local_download_directory, None, subscribers)
# Wait for download to complete
future.result()
Schlüsselwerte
<bucket-name>- Name des Buckets in Ihrer Object Storage-Dienstinstanz, für den „ Aspera “ aktiviert ist<absolute-path-to-directory>- Lokales Verzeichnis zum Speichern der heruntergeladenen Dateien. Muss einen führenden und abschließenden Schrägstrich (/) aufweisen (Beispiel:/Users/testuser/Downloads/).<object prefix>- Name des Verzeichnisses im Bucket, in dem die Dateien gespeichert werden sollen. Darf am Anfang keinen Schrägstrich (/) aufweisen (Beispiel:todownload/).
Vom obigen Beispielcode wird die folgende Ausgabe erstellt:
Directory download queued.
Directory download in progress: 5632 bytes transferred
Directory download in progress: 1047552 bytes transferred
...
Directory download in progress: 53295130 bytes transferred
Directory download in progress: 62106855 bytes transferred
Download complete!
Anhalten/Wiederaufnehmen/Abbrechen
Das SDK bietet die Möglichkeit, den Fortschritt der Datei- bzw. Verzeichnisübertragungen über die folgenden Methoden des Objekts AsperaTransferFuture zu verwalten:
pause()resume()cancel()
Das Aufrufen der oben dargestellten Methoden verursacht keine Nebeneffekte. Vom SDK wird die ordnungsgemäße Bereinigung und Verwaltung gewährleistet.
# Create Transfer manager
bucket_name = "<bucket-name>"
local_download_directory = "<absolute-path-to-directory>"
remote_directory = "<object prefix>"
with AsperaTransferManager(client) as transfer_manager:
# download a directory with Aspera
future = transfer_manager.download_directory(bucket_name, remote_directory, local_download_directory, None, None)
# pause the transfer
future.pause()
# resume the transfer
future.resume()
# cancel the transfer
future.cancel()
Fehlerbehebung bei Aspera-Problemen
Problem: Entwickler, die eine beliebige Version von Python neben 3.6 verwenden, können Fehler bei der Installation oder Verwendung von Aspera SDKfeststellen.
Ursache: Wenn in Ihrer Umgebung verschiedene Versionen von „ Python “ installiert sind, kann es zu Installationsfehlern kommen, wenn Sie versuchen, „ Aspera SDK “ zu installieren. Ursache hierfür kann das Fehlen der DLL-Dateien oder das Vorhandensein einer falschen DLL im Pfad sein.
Lösung: Der erste Schritt zur Lösung dieses Problems besteht darin, die Aspera-Bibliotheken erneut zu installieren. Möglicherweise ist bei der Installation ein Fehler aufgetreten. Dies kann sich negativ auf die DLL-Dateien ausgewirkt haben. Falls sich die Probleme so nicht beheben lassen, müssen Sie die Version von Python aktualisieren. Wenn dies nicht möglich ist, können Sie die Installation Intel® Distribution für Python * verwenden. Dies sollte es Ihnen ermöglichen, das Aspera SDK unter Python 3.6.x ohne Probleme zu installieren.
Metadaten aktualisieren
Zum Aktualisieren der Metadaten für ein vorhandenes Objekt stehen zwei Methoden zur Verfügung:
- Die Anforderung
PUTmit den neuen Metadaten und dem Inhalt des ursprünglichen Objekts. - Die Ausführung der Anforderung
COPYmit den neuen Metadaten, in der das ursprüngliche Objekt als Kopierquelle angegeben ist.
PUT zum Aktualisieren der Metadaten verwenden
Hinweis: Die PUT Anfrage überschreibt den bestehenden Inhalt des Objekts, daher muss es zunächst heruntergeladen und mit den neuen Metadaten erneut hochgeladen werden.
def update_metadata_put(bucket_name, item_name, key, value):
try:
# retrieve the existing item to reload the contents
response = cos_client.get_object(Bucket=bucket_name, Key=item_name)
existing_body = response.get("Body").read()
# set the new metadata
new_metadata = {
key: value
}
cos_client.put_object(Bucket=bucket_name, Key=item_name, Body=existing_body, Metadata=new_metadata)
print("Metadata update (PUT) for {0} Complete!\n".format(item_name))
except ClientError as be:
print("CLIENT ERROR: {0}\n".format(be))
except Exception as e:
log_error("Unable to update metadata: {0}".format(e))
COPY zum Aktualisieren der Metadaten verwenden
def update_metadata_copy(bucket_name, item_name, key, value):
try:
# set the new metadata
new_metadata = {
key: value
}
# set the copy source to itself
copy_source = {
"Bucket": bucket_name,
"Key": item_name
}
cos_client.copy_object(Bucket=bucket_name, Key=item_name, CopySource=copy_source, Metadata=new_metadata, MetadataDirective="REPLACE")
print("Metadata update (COPY) for {0} Complete!\n".format(item_name))
except ClientError as be:
print("CLIENT ERROR: {0}\n".format(be))
except Exception as e:
log_error("Unable to update metadata: {0}".format(e))
Immutable Object Storage (IOS) verwenden
Schutzkonfiguration für vorhandenes Bucket hinzufügen
Objekte, die in ein geschütztes Bucket geschrieben wurden, können erst gelöscht werden, nachdem die Schutzfrist abgelaufen ist und alle Beweissicherungsvermerke für das Objekt entfernt wurden. Einem Objekt wird der Standardaufbewahrungswert des Buckets zugewiesen, es sei denn, bei der Erstellung des Objekts wird ein objektspezifischer Wert angegeben. Objekte in geschützten Buckets, die nicht mehr aufbewahrt werden müssen (Aufbewahrungszeitraum ist abgelaufen und für das Objekt wurden keine Beweissicherungsvermerke angegeben), werden im Falle einer Überschreibung erneut mit einer Aufbewahrungsdauer versehen. Die neue Aufbewahrungsdauer kann als Teil der Objektüberschreibungsanforderung angegeben werden oder dem Objekt wird der Standardaufbewahrungszeitraum des Buckets zugeordnet.
Die minimalen und maximalen unterstützten Werte für die Einstellungen der MinimumRetention Aufbewahrungsfrist, DefaultRetention, und MaximumRetention sind mindestens 0 Tage und höchstens 365243 Tage (1000
Jahre).
def add_protection_configuration_to_bucket(bucket_name):
try:
new_protection_config = {
"Status": "Retention",
"MinimumRetention": {"Days": 10},
"DefaultRetention": {"Days": 100},
"MaximumRetention": {"Days": 1000}
}
cos_client.put_bucket_protection_configuration(Bucket=bucket_name, ProtectionConfiguration=new_protection_config)
print("Protection added to bucket {0}\n".format(bucket_name))
except ClientError as be:
print("CLIENT ERROR: {0}\n".format(be))
except Exception as e:
print("Unable to set bucket protection config: {0}".format(e))
Schutz für Bucket überprüfen
def get_protection_configuration_on_bucket(bucket_name):
try:
response = cos_client.get_bucket_protection_configuration(Bucket=bucket_name)
protection_config = response.get("ProtectionConfiguration")
print("Bucket protection config for {0}\n".format(bucket_name))
print(protection_config)
print("\n")
except ClientError as be:
print("CLIENT ERROR: {0}\n".format(be))
except Exception as e:
print("Unable to get bucket protection config: {0}".format(e))
Geschütztes Objekt hochladen
Objekte in geschützten Buckets, die nicht mehr aufbewahrt werden müssen (Aufbewahrungszeitraum ist abgelaufen und für das Objekt wurden keine Beweissicherungsvermerke angegeben), werden im Falle einer Überschreibung erneut mit einer Aufbewahrungsdauer versehen. Die neue Aufbewahrungsdauer kann als Teil der Objektüberschreibungsanforderung angegeben werden oder dem Objekt wird der Standardaufbewahrungszeitraum des Buckets zugeordnet.
| Wert | Typ | Beschreibung |
|---|---|---|
Retention-Period |
Nicht negative Ganzzahl (Sekunden) | Die Aufbewahrungsdauer des Objekts in Sekunden. Das Objekt kann vor Ablauf der Aufbewahrungsdauer weder überschrieben noch gelöscht werden. Wenn dieses Feld und Retention-Expiration-Date angegeben werden, wird der Fehler
400 zurückgegeben. Wird keiner dieser Werte angegeben, dann wird der Wert für DefaultRetention des Buckets verwendet. Null (0) ist ein gültiger Wert und bedeutet, dass die Mindestaufbewahrungsdauer
des Buckets 0 beträgt. |
Retention-expiration-date |
Datum (ISO 8601-Format) | Das Datum, an dem das Löschen oder Ändern des Objekts wieder zulässig sein wird. Sie können nur diesen Header oder den Header 'Retention-Period' angeben. Werden beide angegeben, dann gibt das System den Fehler 400 zurück.
Wird keiner dieser Werte angegeben, dann wird der Wert für 'DefaultRetention' des Buckets verwendet. |
Retention-legal-hold-id |
Zeichenfolge | Ein einzelner Beweissicherungsvermerk, der auf das Objekt angewendet wird. Ein Beweissicherungsvermerk wird in einer langen Zeichenfolge (Y) angegeben. Das Objekt kann erst überschrieben oder gelöscht werden, nachdem alle dem Objekt zugeordneten Beweissicherungsvermerke entfernt wurden. |
def put_object_add_legal_hold(bucket_name, object_name, file_text, legal_hold_id):
print("Add legal hold {0} to {1} in bucket {2} with a putObject operation.\n".format(legal_hold_id, object_name, bucket_name))
cos_client.put_object(
Bucket=bucket_name,
Key=object_name,
Body=file_text,
RetentionLegalHoldId=legal_hold_id)
print("Legal hold {0} added to object {1} in bucket {2}\n".format(legal_hold_id, object_name, bucket_name))
def copy_protected_object(source_bucket_name, source_object_name, destination_bucket_name, new_object_name):
print("Copy protected object {0} from bucket {1} to {2}/{3}.\n".format(source_object_name, source_bucket_name, destination_bucket_name, new_object_name))
copy_source = {
"Bucket": source_bucket_name,
"Key": source_object_name
}
cos_client.copy_object(
Bucket=destination_bucket_name,
Key=new_object_name,
CopySource=copy_source,
RetentionDirective="Copy"
)
print("Protected object copied from {0}/{1} to {2}/{3}\n".format(source_bucket_name, source_object_name, destination_bucket_name, new_object_name));
def complete_multipart_upload_with_retention(bucket_name, object_name, upload_id, retention_period):
print("Completing multi-part upload for object {0} in bucket {1}\n".format(object_name, bucket_name))
cos_client.complete_multipart_upload(
Bucket=bucket_name,
Key=object_name,
MultipartUpload={
"Parts":[{
"ETag": part["ETag"],
"PartNumber": 1
}]
},
UploadId=upload_id,
RetentionPeriod=retention_period
)
print("Multi-part upload completed for object {0} in bucket {1}\n".format(object_name, bucket_name))
def upload_file_with_retention(bucket_name, object_name, path_to_file, retention_period):
print("Uploading file {0} to object {1} in bucket {2}\n".format(path_to_file, object_name, bucket_name))
args = {
"RetentionPeriod": retention_period
}
cos_client.upload_file(
Filename=path_to_file,
Bucket=bucket_name,
Key=object_name,
ExtraArgs=args
)
print("File upload complete to object {0} in bucket {1}\n".format(object_name, bucket_name))
Beweissicherungsvermerk zu geschütztem Objekt hinzufügen oder aus geschütztem Objekt entfernen
Das Objekt kann bis zu 100 Beweissicherungsvermerke unterstützen:
- Die Kennung eines Beweissicherungsvermerks besteht aus einer Zeichenfolge mit maximal 64 Zeichen Länge und einer Mindestlänge von einem Zeichen. Gültige Zeichen sind Buchstaben, Zahlen und die Symbole
!,_,.,*,(,)und-. - Wenn durch das Hinzufügen des angegebenen Beweissicherungsvermerks der Grenzwert von insgesamt 100 Beweissicherungsvermerken für das Objekt überschritten wird, dann wird der neue Beweissicherungsvermerk nicht hinzugefügt und das System gibt
den Fehler
400aus. - Wenn eine Kennung zu lang ist, dann wird sie nicht zum Objekt hinzugefügt und das System gibt den Fehler
400zurück. - Wenn eine Kennung ungültige Zeichen enthält, dann wird sie nicht zum Objekt hinzugefügt und das System gibt den Fehler
400zurück. - Wenn eine Kennung für ein Objekt bereits verwendet wird, dann wird der vorhandene Beweissicherungsvermerk nicht geändert und in der Antwort wird angegeben, dass die Kennung bereits belegt ist (Fehler
409). - Wenn ein Objekt keine Metadaten für die Aufbewahrungsdauer aufweist, wird der Fehler
400zurückgegeben und das Hinzufügen oder Entfernen eines Beweissicherungsvermerks ist nicht zulässig.
Zum Hinzufügen oder Entfernen einer gesetzlichen Rückstellung müssen Sie über Manager-Berechtigungen für dieses Bucket verfügen.
def add_legal_hold_to_object(bucket_name, object_name, legal_hold_id):
print("Adding legal hold {0} to object {1} in bucket {2}\n".format(legal_hold_id, object_name, bucket_name))
cos_client.add_legal_hold(
Bucket=bucket_name,
Key=object_name,
RetentionLegalHoldId=legal_hold_id
)
print("Legal hold {0} added to object {1} in bucket {2}!\n".format(legal_hold_id, object_name, bucket_name))
def delete_legal_hold_from_object(bucket_name, object_name, legal_hold_id):
print("Deleting legal hold {0} from object {1} in bucket {2}\n".format(legal_hold_id, object_name, bucket_name))
cos_client.delete_legal_hold(
Bucket=bucket_name,
Key=object_name,
RetentionLegalHoldId=legal_hold_id
)
print("Legal hold {0} deleted from object {1} in bucket {2}!\n".format(legal_hold_id, object_name, bucket_name))
Aufbewahrungsdauer eines geschützten Objekts erweitern
Die Aufbewahrungsdauer eines Objekts kann nur verlängert werden. Sie kann gegenüber dem momentan konfigurierten Wert nicht verkürzt werden.
Der Wert für die Verlängerung der Aufbewahrungsdauer kann auf die folgenden drei Arten festgelegt werden:
- Hinzufügen zusätzlicher Zeit zum aktuellen Wert (
Additional-Retention-Periododer ähnliche Methode) - Definieren einer neuen Verlängerungszeitdauer in Sekunden (
Extend-Retention-From-Current-Timeoder ähnliche Methode) - Definieren eines neuen Ablaufdatums für die Aufbewahrung des Objekts (
New-Retention-Expiration-Dateoder ähnliche Methode)
Die in den Objektmetadaten momentan gespeicherte Aufbewahrungsdauer wird entweder um die angegebene zusätzliche Zeitdauer verlängert oder durch den neuen Wert ersetzt. Welche Methode verwendet wird, hängt von dem Parameter ab, der in der Anforderung
extendRetention festgelegt wird. In allen Fällen wird der Parameter für die Verlängerung des Aufbewahrungszeitraums mit den Angaben für den aktuellen Aufbewahrungszeitraum verglichen; der erweiterte Parameter wird nur akzeptiert,
wenn der aktualisierte Aufbewahrungszeitraum größer ist als der aktuelle Aufbewahrungszeitraum.
Objekte in geschützten Buckets, die nicht mehr aufbewahrt werden müssen (Aufbewahrungszeitraum ist abgelaufen und für das Objekt wurden keine Beweissicherungsvermerke angegeben), werden im Falle einer Überschreibung erneut mit einer Aufbewahrungsdauer versehen. Die neue Aufbewahrungsdauer kann als Teil der Objektüberschreibungsanforderung angegeben werden oder dem Objekt wird der Standardaufbewahrungszeitraum des Buckets zugeordnet.
def extend_retention_period_on_object(bucket_name, object_name, additional_seconds):
print("Extend the retention period on {0} in bucket {1} by {2} seconds.\n".format(object_name, bucket_name, additional_seconds))
cos_client.extend_object_retention(
Bucket=bucket_ame,
Key=object_name,
AdditionalRetentionPeriod=additional_seconds
)
print("New retention period on {0} is {1}\n".format(object_name, additional_seconds))
Beweissicherungsvermerke für geschütztes Objekt auflisten
Nach dem Ausführen dieser Operation wird Folgendes zurückgegeben:
- Objekterstellungsdatum
- Aufbewahrungsdauer des Objekts in Sekunden
- Berechnetes Ablaufdatum der Aufbewahrung auf Basis der Aufbewahrungsdauer und des Erstellungsdatums
- Liste der Beweissicherungsvermerke
- Kennung des Beweissicherungsvermerks
- Zeitmarke für Anwendung des Beweissicherungsvermerks
Wenn für das Objekt keine Beweissicherungsvermerke definiert wurden, dann gibt das System ein leeres Element LegalHoldSet zurück. Wurde keine Aufbewahrungsdauer für das Objekt angegeben, dann wird der Fehler 404 zurückgegeben.
def list_legal_holds_on_object(bucket_name, object_name):
print("List all legal holds on object {0} in bucket {1}\n".format(object_name, bucket_name));
response = cos_client.list_legal_holds(
Bucket=bucket_name,
Key=object_name
)
print("Legal holds on bucket {0}: {1}\n".format(bucket_name, response))
Erstellen einer gehosteten statischen Website
Für diese Operation sind Berechtigungen erforderlich, da nur der Bucketeigner normalerweise berechtigt ist, ein Bucket zum Hosten einer statischen Website zu konfigurieren. Die Parameter bestimmen das Standardsuffix für Besucher der Site sowie ein optionales Fehlerdokument.
def putBucketWebsiteConfiguration(bucket_name):
website_defaults = {
'ErrorDocument': {'Key': 'error.html'},
'IndexDocument': {'Suffix': 'index.html'},
}
cos_client.put_bucket_website(Bucket=bucket_name, WebsiteConfiguration=website_defaults)
print("Website configuration set on bucket {0}\n".format(bucket_name))
Nächste Schritte
Weitere Informationen zum Quellcode finden Sie unter GitHub.