Réplication d'objets

La réplication vous permet de définir des règles pour la copie automatique et asynchrone d'objets d'un bac source vers un bac cible dans le même compte. Vous pouvez également copier des objets d'un godet vers un autre godet dans différents comptes.

Qu'est-ce que la réplication ?

La réplication copie les objets nouvellement créés et les mises à jour d'objets d'un bac source vers un bac cible.

  • Seuls les nouveaux objets ou les nouvelles versions des objets existants (créés après l'ajout de la règle de réplication au seau) sont copiés dans le seau cible. Les objets existants peuvent être répliqués en les copiant sur eux-mêmes, créant ainsi une nouvelle version répliquée.
  • Les métadonnées de l'objet source sont appliquées à l'objet répliqué.
  • La réplication bidirectionnelle entre deux buckets nécessite que les règles soient actives sur les deux buckets.
  • Les filtres (composés de préfixes et/ou de balises) peuvent être utilisés pour limiter la règle de réplication à un sous-ensemble d'objets. Plusieurs règles peuvent être définies dans une seule politique et ces règles peuvent spécifier différentes destinations. De cette manière, les différents objets d'un même panier peuvent être répliqués vers différentes destinations.

Pourquoi utiliser la réplication?

  • Conserver une copie des données dans un bac situé dans un autre lieu géographique.
  • Respectez les règles de conformité relatives à la souveraineté des données en définissant des règles de réplication qui stockent les répliques uniquement dans les emplacements autorisés.
  • Les données de production et de test restent synchronisées, car la réplication conserve les métadonnées des objets telles que l'heure de la dernière modification, l'identifiant de la version, etc.
  • Gérer la classe de stockage et les règles de cycle de vie des objets répliqués indépendamment de la source, en définissant une classe de stockage différente et/ou des règles de cycle de vie pour le seau cible. De même, vous pouvez stocker des répliques dans un bac dans une instance de service distincte ou même dans un compte IBM Cloud, et contrôler indépendamment l'accès aux répliques.

Démarrer avec la réplication

Pour commencer, voici quelques conditions préalables à remplir :

  • Définissez le rôle de plate-forme Writer ou Manager sur le seau source, ou un rôle personnalisé avec les actions de réplication appropriées (tel que cloud-object-storage.bucket.put_replication).
  • Il n'est pas nécessaire d'avoir accès au panier cible, mais il faut avoir suffisamment de rôles de plate-forme pour créer de nouvelles politiques IAM qui permettent au panier source d'écrire dans le panier cible.
  • Le seau cible ne doit pas être doté d'un pare-feu de seau hérité, mais il peut utiliser des restrictions basées sur le contexte.
  • Les objets cryptés à l'aide de SSE-C ne peuvent pas être répliqués, bien que le cryptage géré(SSE-KMS)comme Key Protect soit entièrement compatible avec la réplication.
  • Les objets archivés ne peuvent pas être répliqués.
  • Si les buckets source et cible se trouvent dans des comptes IBM différents, veillez à créer les buckets dans chaque compte.
  • Activer le Versioning sur les buckets source et cible.

Le versionnage étant une exigence de la réplication, il est impossible de répliquer des objets dans des buckets configurés avec une politique Immutable Object Storage.

Utilisation d'un compte IBM

Pour répliquer des objets entre les buckets d'un même compte IBM, procédez comme suit :

  1. Après avoir navigué jusqu'au seau source choisi, cliquez sur l'onglet Configuration.
  2. Cherchez Bucket replication et cliquez sur le bouton Setup replication.
  3. Sélectionnez la source de réplication, puis cliquez sur Suivant.
  4. Sélectionnez l'instance et le godet dans les menus déroulants. Vous pouvez également basculer le bouton radio sur Non et coller le CRN du seau cible.
  5. Cliquez sur le bouton Vérifier les autorisations.

Vous devez maintenant accorder au seau source Writer des autorisations sur le seau cible. Il y a plusieurs façons de le faire, mais la plus simple est d'utiliser IBM Cloud Shell et le CLI IBM Cloud.

  1. Ouvrir IBM Cloud Shell dans une nouvelle fenêtre ou un nouvel onglet.
  2. Copiez la commande CLI IBM Cloud affichée dans la console de stockage d'objets et collez-la dans le nouveau shell.
  3. Retournez à la fenêtre ou à l'onglet de configuration du seau et cliquez à nouveau sur le bouton Vérifier les autorisations.

Vous allez maintenant créer une règle de réplication.

  1. Assurez-vous que la case d'option Statut de la règle est réglée sur Activé.
  2. Donnez à la règle un nom et une priorité, ainsi que des filtres de préfixe ou de balise qui limiteront les objets soumis à la règle de réplication.
  3. Cliquez sur Terminé.

Utilisation de différents comptes IBM

Pour répliquer des objets entre des comptes IBM différents, procédez comme suit :

  1. Configurer une politique IAM sur le compte de destination IBM. Pour plus d'informations sur la création d'une politique IAM, voir Qu'est-ce qu'une politique IAM et qui peut l'attribuer?
  2. Trouvez l'identifiant du compte et l'identifiant de l'instance de service au format CRN sur la page de configuration du réservoir.
  3. Dans l'interface utilisateur IBM Cloud du compte de destination, cliquez sur Manage>Access**(IAM)**.
  4. Cliquez sur Authentification dans le panneau de gauche.
  5. Cliquez sur « Créer » pour créer une nouvelle politique IAM.
  6. Accorder la configuration d'une page d'autorisation de service. C'est la page sur laquelle vous arrivez après avoir créé une nouvelle politique IAM.
  7. Sélectionnez Autre compte et indiquez l'ID du compte source.
  8. Fournir un accès aux services comme Cloud Object Storage.
  9. Dans le champ d'accès, sélectionnez Ressources spécifiques.
  10. Sélectionnez Instance de service source et saisissez l'ID de l'instance de service pour le seau source.
  11. Sous Cible, sélectionnez Cloud Object Storage pour l'accès au seau source.
  12. Pour Target Scope, sélectionnez Specific resources> Service** Instance.
  13. Sélectionnez l'ID de l'instance de service du compte de destination dans le menu déroulant.
  14. Sélectionnez le rôle Rédacteur d'objets ou Rédacteur, selon le cas.

Le rôle d' écrivain d'objets est suffisant pour permettre la réplication.

Terminologie

Source bucket: Le godet pour lequel une politique de réplication est configurée. C'est la source des objets répliqués.

Godet cible: Le seau défini comme destination dans la politique de réplication du seau source. C'est la cible des objets répliqués. Également appelé "seau de destination".

Réplique: Le nouvel objet créé dans un godet cible à la suite d'une demande faite à un godet source.

Qu'est-ce qui est reproduit?

Les nouveaux objets créés via CopyObject, PutObject, ou CompleteMultipartUpload seront répliqués du seau source vers le seau cible. Les objets répliqués hériteront des champs de métadonnées suivants de l'objet source : Etag, Last Modified Time, Version ID, user-attributes, et Tags.

Les marqueurs de suppression seront répliqués si la politique de réplication le prévoit.

Les mises à jour des balises d'une version seront répliquées du seau source vers le seau cible.

Les éléments suivants ne sont pas répliqués :

  • Actions initiées par les événements du cycle de vie
  • Objets écrits directement dans l'archive
  • Objets restaurés à partir d'un niveau d'archivage
  • Objets cryptés via SSE-C
  • ACL d'objets

Utilisation de la réplication pour assurer la continuité des activités et la reprise après sinistre

La réplication peut être utilisée pour assurer la continuité du service en cas de panne :

  • Veillez à ce que les fichiers source et cible se trouvent à des endroits différents.
  • Vérifier que les dernières versions des objets sont synchronisées entre les deux ensembles. Un outil tel que Rclone (la commande rclone check ) peut être utile pour vérifier le synchronisme à partir de la ligne de commande.
  • En cas de panne, le trafic d'une application peut être redirigé vers le seau cible.

Cohérence et intégrité des données

Alors que IBM Cloud Object Storage assure une grande cohérence pour toutes les opérations d'entrée-sortie de données, la configuration des seaux n'est jamais cohérente. Après avoir activé les règles de réplication pour la première fois sur un bucket, il peut s'écouler quelques instants avant que la configuration ne se propage à travers le système et que les nouveaux objets ne commencent à être répliqués.

Gestion des erreurs

Les échecs de réplication peuvent avoir de nombreuses causes, notamment (mais sans s'y limiter) des erreurs de configuration des compartiments, des interruptions de service, des interactions de l'utilisateur avec le compartiment de destination, etc.

COS intègre des mécanismes de résilience permettant de gérer les défaillances de réplication. En cas d'échec, COS peut réessayer pendant une période pouvant aller jusqu'à 30 jours. La fréquence des nouvelles tentatives peut varier en fonction de la nature de la défaillance. Par exemple, les échecs dus à des erreurs d'E/S rares peuvent faire l'objet d'une nouvelle tentative en l'espace de quelques heures, tandis que ceux dus à des erreurs de configuration des compartiments utilisateur peuvent faire l'objet d'une seule nouvelle tentative par jour. Si une erreur n'est pas résolue dans un délai de 30 jours, le système ne tente plus automatiquement de la résoudre. Toutes les défaillances à long terme peuvent être répertoriées via ListBucketReplicationFailures.

Si vous souhaitez réessayer de traiter des échecs « anciens » datant de plus de 30 jours, vous pouvez déclencher une nouvelle tentative à l'aide de la balise PutBucketReplicationFailureReattempt.

Causes de défaillance

Dans la réponse de l'API « ListBucketReplicationFailures », l'attribut « SyncFailureCause » est fourni pour chaque élément d'échec, indiquant la dernière cause connue de l'échec. Le tableau suivant présente les causes possibles :

Cause Explication
La gestion des versions est désactivée sur le compartiment de destination La gestion des versions n'est pas activée sur le compartiment de destination. L'utilisateur a probablement désactivé le contrôle de version après avoir configuré la réplication.
Opération de réplication non autorisée sur le compartiment cible Le service COS n'est pas autorisé à modifier le compartiment cible au nom de l'utilisateur. Vérifiez si l'autorisation de service à service est toujours active entre les ressources de compartiment source et cible dans IAM.
Le bucket distant est introuvable Impossible de localiser le répertoire de destination. Il se peut que l'utilisateur ait supprimé le compartiment de destination. Vérifiez si le compartiment de destination existe toujours.
Source/Compartiment distant introuvable ou désactivé Le godet est introuvable ou hors d'état de fonctionner. Vérifier si le compartiment existe toujours. Si c'est le cas, contactez le service client.
Objet de destination introuvable Tentative de reproduction d'une modification des métadonnées (par exemple, verrouillage d'une balise ou d'un objet), mais l'objet cible n'existe pas. L'utilisateur a probablement supprimé l'objet du compartiment de destination avant que la modification n'ait pu être répliquée.
Objet local introuvable L'objet source n'a pas été trouvé lors de la tentative de réplication. L'utilisateur a probablement supprimé l'objet source peu après l'avoir créé ou modifié.
Le verrouillage d'objet n'est pas activé sur le compartiment de destination Une tentative a été effectuée pour reproduire les paramètres d'Object Lock sur un objet, mais la fonction Object Lock n'était pas activée dans le compartiment de destination.
La clé de chiffrement n'est pas active ou a été supprimée COS a tenté de récupérer la clé de chiffrement à partir de Key Protect (le compartiment source est configuré avec SSE-KP/SSE-HPCS), mais la clé a été supprimée.
Les informations relatives au point de terminaison de l'instance KMS sont manquantes Impossible de récupérer le point de terminaison du service de gestion des clés nécessaire à la lecture de la clé de chiffrement. Si l'erreur persiste, contactez le service client.
Autorisations insuffisantes pour consulter les informations relatives au point de terminaison KMS La ressource « source bucket » ne dispose pas des autorisations nécessaires pour interroger le point de terminaison du service de gestion des clés requis pour lire la clé de chiffrement. Vérifiez votre politique d'autorisation de service à service IAM.
Erreur interne Divers problèmes internes empêchant la réplication. Contactez le support technique.

Actions IAM

De nouvelles actions IAM sont associées à la réplication.

Action IAM Rôle
cloud-object-storage.bucket.get_replication Gestionnaire, Rédacteur, Lecteur
cloud-object-storage.bucket.put_replication Responsable, Auteur
cloud-object-storage.bucket.delete_replication Responsable, Auteur
cloud-object-storage.bucket.get_replication_failures Gestionnaire, Rédacteur, Lecteur
cloud-object-storage.bucket.put_replication_reattempt Responsable, Auteur

Événements Activity Tracker

La réplication génère des événements supplémentaires.

Action d'événement Généré à Description
cloud-object-storage.bucket-replication.create Compartiment source Lorsqu'un utilisateur effectue une requête via l'API « PutBucketReplication »
cloud-object-storage.bucket-replication.read Compartiment source Lorsqu'un utilisateur effectue une requête via l'API « GetBucketReplication »
cloud-object-storage.bucket-replication.delete Compartiment source Lorsqu'un utilisateur effectue une requête via l'API « DeleteBucketReplication »
cloud-object-storage.bucket-replication-failures.list Compartiment source Lorsqu'un utilisateur effectue une requête via l'API « ListBucketReplicationFailures »
cloud-object-storage.bucket-replication-failures.update Compartiment source Lorsqu'un utilisateur effectue une requête via l'API « PutReplicationFailureReattempt »
cloud-object-storage.object-replication.sync Compartiment source Lorsque COS réplique un objet à partir du compartiment source
cloud-object-storage.object-replication.create Compartiment cible Lorsque COS crée une nouvelle version de réplique dans le compartiment de destination
cloud-object-storage.object-replication.update Compartiment cible Lorsque COS réplique la mise à jour des métadonnées sur une réplique existante du compartiment cible
cloud-object-storage.object-replication.delete Compartiment cible Lorsque COS réplique un marqueur de suppression sur le compartiment cible

Pour les événements cloud-object-storage.bucket-replication.create, les zones suivantes fournissent des informations supplémentaires:

Zone Description
requestData.replication.num_sync_remote_buckets Nombre de compartiments cible spécifié dans les règles de réplication de compartiment.
requestData.replication.failed_remote_sync Noms CRN des compartiments qui ont échoué à la vérification de la réplication.

Lorsque la réplication est active, les opérations sur les objets peuvent générer les informations supplémentaires suivantes:

Zone Description
requestData.replication.replication_throttled Indique si la réplication de l'objet a été retardée sur la source en raison d'un mécanisme de régulation.
requestData.replication.destination_bucket_id CRN du compartiment cible.
requestData.replication.sync_type Le type d'opération de synchronisation.
- content indique que les données de l'objet et toutes les métadonnées ont été écrites sur la cible.
- tag indique que les balises de l'objet ont été répliquées.
- retention indique que les paramètres de rétention du verrou d'objet ont été répliqués.
- legal_hold indique que les paramètres de maintien légal du verrou d'objet ont été répliqués.
- delete indique que le marqueur d'effacement a été écrit sur la cible.
responseData.replication.source_bucket_id CRN du compartiment source.
responseData.replication.result Les valeurs peuvent être success, failure (indique une erreur de serveur), user (indique une erreur d'utilisateur).
responseData.replication.message Le message de réponse HTTP (tel que OK).

Vous pouvez tracer un objet à partir du moment où il est écrit dans la source jusqu'à ce qu'il soit écrit sur la cible. Recherchez l'ID de demande associé à l'écriture d'objet et trois événements doivent apparaître:

  • Le PUT d'origine.
  • Demande de synchronisation de la source.
  • Demande PUT sur la cible.

L'un de ces trois éléments manquants indique un échec.

Utilisation et comptabilité

Toutes les répliques sont elles-mêmes des objets et contribuent à l'utilisation comme toutes les autres données. Une réplication réussie se traduit par des demandes facturables PUT, GET et HEAD, bien que toute bande passante consommée dans le processus de réplication ne soit pas facturée.

La réplication génère des mesures supplémentaires à utiliser avec IBM Cloud Monitoring:

  • ibm_cos_bucket_replication_sync_requests_issued
  • ibm_cos_bucket_replication_sync_requests_received

Interactions

Gestion des versions

La gestion des versions est obligatoire pour activer la réplication. Après avoir activé la gestion des versions sur les compartiments source et cible et configuré la réplication sur le compartiment source, vous pouvez rencontrer les problèmes suivants:

  • Si vous tentez de désactiver la gestion des versions sur le compartiment source, Object Storage renvoie une erreur. Vous devez supprimer la configuration de réplication avant de pouvoir désactiver la gestion des versions sur le compartiment source.
  • Si vous désactivez la gestion des versions sur le compartiment cible, la réplication échoue.

Verrouillage d'objet

Le verrouillage d'objet peut être activé sur les compartiments dotés de la fonctionnalité de réplication. Lorsque des objets source sont créés avec Object Lock (conservation et/ou conservation à des fins juridiques), ou si Object Lock est mis à jour sur des objets existants, ces modifications seront répliquées vers la destination.

La fonctionnalité « Object Lock » ne peut être répliquée que si elle est activée sur le compartiment de destination. Il est donc recommandé d'activer Object Lock sur le compartiment de destination s'il est activé sur le compartiment source.

Le tableau ci-dessous présente le comportement observé lorsque les buckets source et de destination ont des configurations d'Object Lock différentes :

Verrouillage de l'objet source Verrouillage de l'objet de destination Comportement
Activé Activé Tous les états de verrouillage des objets de la source seront répliqués vers la destination.

Si l'objet source est créé sans verrouillage d'objet (Object Lock), la durée de conservation par défaut du compartiment de destination peut s'appliquer à la réplique.

La réplication des verrous d'objet respecte toutes les restrictions relatives aux verrous d'objet d' S3. Par exemple, il ne peut en aucun cas raccourcir la durée de conservation sur la réplique en mode conformité si l'utilisateur a apporté des modifications de son propre chef sur la destination.
Désactivé Activé Les objets source ne peuvent pas être soumis à un verrouillage d'objet; par conséquent, les états de verrouillage d'objet ne se propagent jamais de la source vers la destination.
Si le compartiment de destination dispose d'une durée de conservation par défaut, celle-ci s'appliquera aux nouvelles répliques créées.
Activé Désactivé Les objets source créés avec Object Lock ne seront pas répliqués. Ces échecs font l'objet d'une nouvelle tentative par COS et peuvent être répliqués dès lors que la fonctionnalité « Object Lock » est activée sur le compartiment de destination. De même, les mises à jour relatives à la conservation des objets (Object Lock) ou à la conservation à des fins juridiques (legal hold) sur des objets existants ne peuvent pas être répliquées tant que la fonctionnalité Object Lock n'est pas activée sur la destination.

Les objets source créés sans Object Lock peuvent tout de même être répliqués.

Chiffrement Key Protect

Les objets source sont chiffrés à l'aide de la clé racine du compartiment source et les répliques sont chiffrées à l'aide de la clé racine du compartiment cible.

Configurations de cycle de vie

Si une règle de cycle de vie est activée sur un compartiment cible, les actions de cycle de vie sont basées sur l'heure de création d'origine de l'objet à la source, et non sur l'heure à laquelle la réplique devient disponible dans le compartiment cible.

Immutable Object Storage

L'utilisation de règles de conservation est impossible sur un compartiment avec la gestion des versions activée, et comme la gestion des versions est une exigence pour la réplication, il est impossible de répliquer des objets vers ou depuis un compartiment avec l'option Immutable Object Storage activée.

Pare-feux de compartiment existants

Les compartiments utilisant des pare-feux existants pour restreindre l'accès en fonction des adresses IP ne peuvent pas utiliser la réplication, car les services d'arrière-plan qui répliquent les objets n'ont pas d'adresses IP fixes et ne peuvent pas passer le pare-feu.

Il est recommandé d' utiliser des restrictions basées sur le contexte pour contrôler l'accès en fonction des informations réseau.

Cloud Functions et Code Engine

La configuration de la réplication ne fournit pas de déclencheur pour les événements Cloud Functions ou Code Engine à ce stade, mais les écritures et les suppressions d'objets créent des notifications Object:Write et Object:Delete pour les compartiments source et cible. Ces événements sont annotés avec une zone notifications.replication_type qui indique si l'événement a déclenché une synchronisation ou s'il a été déclenché par une synchronisation.

Réplication d'objets existants

Une règle de réplication ne peut agir que sur les objets écrits après la configuration de la règle et son application à un compartiment. S'il existe des objets existants dans un compartiment qui doivent être répliqués, les processus de réplication doivent être informés de l'existence des objets. Pour ce faire, vous pouvez facilement utiliser l'opération PUT copy pour copier des objets sur eux-mêmes.

Ce processus va réinitialiser certaines métadonnées d'objet, y compris les horodatages de création. Cela aura un impact sur les règles de cycle de vie et tout autre service qui utilise des horodatages de création ou de modification (tels que les réseaux de distribution de contenu). Assurez-vous que toutes les interruptions pouvant survenir lors de la réinitialisation des métadonnées d'objet sont traitées de manière appropriée.

Le processus implique:

  1. Création d'une liste de tous les objets d'un compartiment qui doivent être soumis à des règles de réplication,
  2. Itération sur cette liste, en exécutant une opération PUT copy sur chaque objet, la source étant identique à la cible de la demande.

Cet exemple ne réplique que la nouvelle version de l'objet créé par la demande PUT copy. Afin de répliquer toutes les versions de l'objet, il serait nécessaire de copier également chaque version individuelle.

L'exemple suivant est écrit en Python, mais l'algorithme peut être appliqué dans n'importe quel langage de programmation ou contexte.

import os
import sys
import ibm_boto3
from ibm_botocore.config import Config

# Create client connection
cos = ibm_boto3.client("s3",
                       ibm_api_key_id=os.environ.get('IBMCLOUD_API_KEY'),
                       ibm_service_instance_id=os.environ['SERVICE_INSTANCE_ID'],
                       config=Config(signature_version="oauth"),
                       endpoint_url=os.environ['US_GEO']
                       )

# Define the bucket with existing objects for replication
bucket = os.environ['BUCKET']

def copy_in_place(BUCKET_NAME):
    print("Priming existing objects in " + bucket + " for replication...")

    paginator = cos.get_paginator('list_objects_v2')
    pages = paginator.paginate(Bucket=bucket)

    for page in pages:
        for obj in page['Contents']:
            key = obj['Key']
            print("  * Copying " + key + " in place...")
            try:
                headers = cos.head_object(
                    Bucket=bucket,
                    Key=key
                    )
                md = headers["Metadata"]
                cos.copy_object(
                    CopySource={
                        'Bucket': bucket,
                        'Key': key
                        },
                    Bucket=bucket,
                    Key=key,
                    TaggingDirective='COPY',
                    MetadataDirective='REPLACE',
                    Metadata=md
                    )
                print("    Success!")
            except Exception as e:
                print("    Unable to copy object: {0}".format(e))
    print("Existing objects in " + bucket + " are now subject to replication rules.")

copy_in_place(bucket)

Exemples d'API REST

Les exemples suivants sont présentés à l'aide de cURL pour une utilisation plus facile. Les variables d'environnement sont utilisées pour représenter des éléments spécifiques à l'utilisateur, tels que $BUCKET, $TOKEN et $REGION. Notez que $REGION inclut également toutes les spécifications de type de réseau. Par conséquent, l'envoi d'une demande à un compartiment dans us-south à l'aide du réseau privé nécessite de définir la variable sur private.us-south.

Activer la réplication sur un compartiment

La configuration de réplication est fournie au format XML dans le corps de la demande. Les nouvelles demandes écraseront les règles de réplication existantes présentes dans le compartiment.

Une configuration de réplication doit inclure au moins une règle et peut contenir jusqu'à 1 000 règles. Chaque règle identifie un sous-ensemble d'objets à répliquer en filtrant les objets dans le compartiment source. Pour choisir des sous-ensembles d'objets supplémentaires à répliquer, ajoutez une règle pour chaque sous-ensemble.

Pour spécifier un sous-ensemble des objets du compartiment source auxquels appliquer une règle de réplication, ajoutez l'élément Filter en tant qu'enfant de l'élément Rule. Vous pouvez filtrer des objets en fonction d'un préfixe de clé d'objet, d'une ou de plusieurs balises d'objet, ou les deux. Lorsque vous ajoutez l'élément Filter dans la configuration, vous devez également ajouter les éléments suivants: DeleteMarkerReplication, Status et Priority.

En-têtes facultatifs

En-têtes facultatifs
En-tête Type Description
Content-MD5 Chaîne L' base64, qui contient le hachage de la charge utile calculé selon l'algorithme « MD5 » sur 128 bits, sert de contrôle d'intégrité afin de s'assurer que la charge utile n'a pas été altérée pendant le transfert.
x-amz-checksum-crc32 Chaîne Cet en-tête est la somme de contrôle Base64 encodée, 32 bits CRC32 de l'objet.
x-amz-checksum-crc32c Chaîne Cet en-tête est la somme de contrôle Base64 encodée, 32 bits CRC32C de l'objet.
x-amz-checksum-crc64nvme Chaîne Cet en-tête est la somme de contrôle Base64 encodée, 64 bits CRC64NVME de l'objet. La somme de contrôle de CRC64NVME est toujours une somme de contrôle d'objet complet.
x-amz-checksum-sha1 Chaîne SHA1 Cet en-tête est le condensé de 160 bits de l'objet, codé sur Base64.
x-amz-checksum-sha256 Chaîne Cet en-tête est le code Base64, 256-bit SHA256 digest de l'objet.

Un en-tête Content-MD5 ou un en-tête checksum (y compris x-amz-checksum-crc32, x-amz-checksum-crc32c, x-amz-checksum-crc64nvme, x-amz-checksum-sha1 ou x-amz-checksum-sha256) est nécessaire pour vérifier l'intégrité de la charge utile. Le corps de la demande doit contenir un bloc XML avec le schéma suivant :

Elément Type Enfants Ancêtre Contrainte
ReplicationConfiguration Conteneur Rule Aucun Limite 1.
Rule Conteneur ID, Status, Filter, DeleteMarkerReplication, Destination, Priority ReplicationConfiguration Limite 1000.
ID Chaîne Aucun Rule Doit comporter (a-z,A-Z0-9) et les symboles suivants : ! _ . * ' ( ) -
Destination Conteneur Bucket Rule Limite 1.
Bucket Chaîne Aucun Destination CRN du compartiment cible.
Priority Entier Aucun Rule Une priorité est associée à chaque règle. Dans certains cas, plusieurs règles peuvent être applicables à un objet téléchargé. Dans ces situations, le stockage d'objets applique la règle applicable avec la priorité la plus élevée lors de la réplication de cet objet. Ainsi, une seule règle de réplication peut être appliquée à n'importe quel objet, quel que soit le nombre de règles de la règle de réplication pouvant correspondre à l'objet. Notez que plus le nombre est élevé, plus la priorité est élevée.
Status Chaîne Aucun Rule Indique si la règle est activée. Les valeurs valides sont Enabled ou Disabled.
DeleteMarkerReplication Conteneur Status Rule Limite 1.
Status Chaîne Aucun DeleteMarkerReplication Indique si le stockage d'objets réplique les marqueurs de suppression. Les valeurs valides sont Enabled ou Disabled.
Filter Chaîne Prefix, Tag, AND Rule Filtre qui identifie le sous-ensemble d'objets auquel s'applique la règle de réplication. Un Filter doit spécifier exactement un élément Prefix, Tag ou un élément enfant And.
Prefix Chaîne Aucun Filter Préfixe de nom de clé d'objet qui identifie le sous-ensemble d'objets auquel la règle s'applique.
Tag Chaîne Aucun Filter Conteneur permettant de spécifier une clé et une valeur de balise. La règle s'applique uniquement aux objets ayant la balise dans leur ensemble de balises.
And Chaîne Aucun Filter Conteneur permettant de spécifier des filtres de règle. Les filtres déterminent le sous-ensemble d'objets auquel la règle s'applique. Cet élément est requis uniquement si vous spécifiez plusieurs filtres.
Key Chaîne Aucun Tag Clé de balise.
Value Chaîne Aucun Tag Valeur de la balise.

Cet exemple réplique tous les nouveaux objets, mais ne réplique pas les marqueurs de suppression.

curl -X "PUT" "https://$BUCKET.s3.$REGION.cloud-object-storage.appdomain.cloud/?replication" \
     -H 'Authorization: bearer $TOKEN' \
     -H 'Content-MD5: exuBoz2kFBykNwqu64JZuA==' \
     -H 'Content-Type: text/plain; charset=utf-8' \
     -d $'<ReplicationConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
            <Rule>
              <ID>SimpleReplication</ID>
              <Priority>1</Priority>
              <Status>Enabled</Status>
              <DeleteMarkerReplication>
                <Status>Disabled</Status>
              </DeleteMarkerReplication>
              <Filter/>
              <Destination>
                <Bucket>$DESTINATION_CRN</Bucket>
              </Destination>
          	</Rule>
          </ReplicationConfiguration>'

Cet exemple réplique tous les objets avec une clé (nom) commençant par project_a/ dans le compartiment identifié par $DESTINATION_CRN_A, et tous les objets avec une clé (nom) commençant par project_b/ dans le compartiment identifié par $DESTINATION_CRN_B, et tous les objets avec une balise d'objet avec la clé Client et la valeur ACME dans un troisième compartiment identifié par $DESTINATION_CRN_C, et réplique les marqueurs de suppression dans tous les cas.

Supposons que les quatre objets suivants soient ajoutés au compartiment source. Ils seront répliqués sur les compartiments cible comme décrit ci-dessous:

  1. project_a/foo.mp4
  2. project_a/bar.mp4
  3. project_b/baz.pdf
  4. project_b/acme.pdf: Ce quatrième objet comporte également une balise d'objet avec la clé Client et la valeur ACME.

En raison des règles suivantes, les objets 1 et 2 seront répliqués dans $DESTINATION_CRN_A. L'objet 3 sera répliqué sur $DESTINATION_CRN_B. L'objet 4 ne sera répliqué que sur $DESTINATION_CRN_C car la règle dont l'ID est AcmeCorp a une valeur de priorité plus élevée que la règle dont l'ID est ProjectB et, bien qu'elle réponde aux exigences des deux règles, elle ne sera soumise qu'à la première.

curl -X "PUT" "https://$BUCKET.s3.$REGION.cloud-object-storage.appdomain.cloud/?replication" \
     -H 'Authorization: bearer $TOKEN' \
     -H 'Content-MD5: exuBoz2kFBykNwqu64JZuA==' \
     -H 'Content-Type: text/plain; charset=utf-8' \
     -d $'<ReplicationConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
            <Rule>
              <ID>ProjectA</ID>
              <Priority>10</Priority>
              <Status>Enabled</Status>
              <DeleteMarkerReplication>
                <Status>Enabled</Status>
              </DeleteMarkerReplication>
              <Filter>
                <Prefix>project_a/</prefix>
              </Filter>
              <Destination>
                <Bucket>$DESTINATION_CRN_A</Bucket>
              </Destination>
          	</Rule>
            <Rule>
              <ID>ProjectB</ID>
              <Priority>5</Priority>
              <Status>Enabled</Status>
              <DeleteMarkerReplication>
                <Status>Enabled</Status>
              </DeleteMarkerReplication>
              <Filter>
                <Prefix>project_b/</prefix>
              </Filter>
              <Destination>
                <Bucket>$DESTINATION_CRN_B</Bucket>
              </Destination>
          	</Rule>
            <Rule>
              <ID>AcmeCorp</ID>
              <Priority>20</Priority>
              <Status>Enabled</Status>
              <DeleteMarkerReplication>
                <Status>Enabled</Status>
              </DeleteMarkerReplication>
              <Filter>
                <Tag>
                  <Key>Client</Key>
                  <Value>ACME</Value>
                </Tag>
              </Filter>
              <Destination>
                <Bucket>$DESTINATION_CRN_C</Bucket>
              </Destination>
          	</Rule>
          </ReplicationConfiguration>'

Une demande réussie renvoie une réponse 200.

Afficher la configuration de réplication pour un compartiment

curl -X "GET" "https://$BUCKET.s3.$REGION.cloud-object-storage.appdomain.cloud/?replication" \
     -H 'Authorization: bearer $TOKEN'

Cette commande renvoie un corps de réponse XML avec le schéma approprié:

<ReplicationConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
  <Rule>
    <ID>SimpleReplication</ID>
    <Status>ENABLED</Status>
    <DeleteMarkerReplication>
      <Status>DISABLED</Status>
    </DeleteMarkerReplication>
    <Destination>
      <Bucket>crn:v1:bluemix:public:cloud-object-storage:global:a/9978e07eXXXXXXXX66c89c428028654:ef1c725e-XXXX-4967-bcc1-734c03a2b846:bucket:replication-destination</Bucket>
    </Destination>
    <Priority>1</Priority>
    <Filter/>
  </Rule>
</ReplicationConfiguration>

Supprimer la configuration de réplication d'un compartiment

curl -X "DELETE" "https://$BUCKET.s3.$REGION.cloud-object-storage.appdomain.cloud/?replication" \
     -H 'Authorization: bearer $TOKEN'

Une demande réussie renvoie une réponse 204.

Répertorier les échecs de réplication pour un compartiment

Exemple de requête utilisant curl

curl -X "GET" "https://$BUCKET.s3.$REGION.cloud-object-storage.appdomain.cloud/?ibm-replication-failures" \
     -H 'Authorization: bearer $TOKEN'

Paramètres de requête facultatifs

Nom Type Description
type d'encodage Chaîne Si un nom d'objet contient des caractères Unicode non pris en charge par XML, ce paramètre peut être défini sur « url » afin d'encoder correctement la réponse.
nombre maximal de clés Chaîne Limite le nombre d'échecs affichés dans la réponse. La valeur par défaut et maximale est 1 000.
première tentative de synchronisation effectuée avant Chaîne Indique l'horodatage à partir duquel la liste doit commencer, par ordre chronologique inverse. L'heure correspond au moment où la réplication a été initialement déclenchée ( champ de l'entrée). Ainsi, la liste contiendra tous les échecs de réplication dont la date remonte au moins à l'horodatage spécifié.
jeton de continuation Chaîne Indique l'incident à partir duquel la liste doit commencer, par ordre chronologique inverse. Cette fonctionnalité sert à la pagination lorsqu'il existe d'autres entrées au-delà de celles renvoyées lors de la dernière requête de liste.

Exemple de réponse

<ListReplicationFailureResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
    <Name>example</Name>
    <FirstSyncAttemptedBefore>2025-12-15T00:00:00.000Z</FirstSyncAttemptedBefore>
    <MaxKeys>10</MaxKeys>
    <IsTruncated>false</IsTruncated>
    <EncodingType>false</EncodingType>
    <KeyCount>2</KeyCount>
    <Contents>
        <Key>test-obj+*1765434016787</Key>
        <VersionId>00000000-0000-0000-0000-019b0c114413</VersionId>
        <SyncType>Content</SyncType>
        <FirstSyncAttempted>2025-12-11T06:20:16.787Z</FirstSyncAttempted>
        <LastSyncAttempted>2025-12-11T06:20:16.787Z</LastSyncAttempted>
        <SyncFailureCause>Versioning disabled on destination bucket</SyncFailureCause>
    </Contents>
    <Contents>
        <Key>test-obj+*1765434016786</Key>
        <VersionId>00000000-0000-0000-0000-019b0c114412</VersionId>
        <SyncType>Content</SyncType>
        <FirstSyncAttempted>2025-12-11T06:20:16.786Z</FirstSyncAttempted>
        <LastSyncAttempted>2025-12-11T06:20:16.786Z</LastSyncAttempted>
        <SyncFailureCause>Replication operation not authorized on target bucket</SyncFailureCause>
    </Contents>
</ListReplicationFailureResult>

Éléments de réponse

Nom Type Description
ListReplicationFailureResult Conteneur Balise de niveau racine
Name Chaîne Nom du compartiment dont les informations sont affichées.
FirstSyncAttemptedBefore Chaîne ISO-8601 date-horodatage de la requête ?first-sync-attempted-before
MaxKeys Nombre Nombre maximal de clés demandé pour cette annonce.
IsTruncated Booléen Si la liste actuelle a été tronquée (c'est-à-dire s'il y a d'autres échecs après le dernier élément renvoyé dans cette liste). Si true, l'adresse NextContinuationToken est toujours fournie.
EncodingType Chaîne Type d'encodage demandé pour cette annonce.
KeyCount Nombre Nombre d'éléments défectueux renvoyés dans cette liste.
ContinuationToken Chaîne Le jeton de suite qui a été spécifié pour cette annonce.
NextContinuationToken Chaîne Prochain jeton de continuation à utiliser pour la pagination si la liste actuelle a été tronquée.

Planifier une nouvelle tentative en cas d'échecs de réplication persistants dans un compartiment

Cette opération planifie une nouvelle tentative pour tous les échecs de réplication, y compris les échecs « périmés » datant de plus de 30 jours et qui ne peuvent plus faire l'objet de nouvelles tentatives automatiques par le système. Les échecs de réplication à long terme sont traités selon des cycles de 24 heures. L'envoi de cette requête planifie de nouvelles tentatives pour les échecs anciens au cours du cycle débutant à minuit GMT le lendemain. Par exemple, si une requête est envoyée à l'adresse 2026-01-01T01:00:00Z, l'heure la plus proche à laquelle ces échecs seront traités est 2026-01-02T00:00:00Z. Si la requête aboutit, cet horodatage est également fourni dans l'en-tête de réponse « x-ibm-replication-reattempt-scheduled-time ». Les requêtes multiples arrivant le même jour en GMT (c'est-à-dire donnant lieu à la même heure de planification) sont idempotentes.

Chaque échec de mise à jour sera réessayé une seule fois, dans la mesure du possible : ces opérations seront exécutées, mais aucun délai n'est garanti.

Exemple de requête utilisant curl

curl -X "PUT" "https://$BUCKET.s3.$REGION.cloud-object-storage.appdomain.cloud/?ibm-replication-reattempt" \
     -H 'Authorization: bearer $TOKEN'

Exemple de réponse

HTTP/1.1 204 No Content
Connection: close
...
x-ibm-replication-reattempt-scheduled-time: Fri, 12 Dec 2025 00:00:00 GMT

Exemples SDK

Les exemples suivants utilisent les logiciels SDK IBM COS pour Python et Node.js, bien que l'implémentation de la gestion des versions d'objet doive être entièrement compatible avec toute bibliothèque ou outil S3-compatible qui permet de définir des noeuds finaux personnalisés. L'utilisation d'outils tiers nécessite des données d'identification HMAC pour calculer les signatures AWS V4. Pour plus d'informations sur les données d'identification HMAC, voir la documentation.

Python

L'activation de la gestion des versions à l'aide d' IBM COS SDK for Python peut être effectuée à l'aide de la syntaxe low-level client.

Utilisation d'un client:

#!/usr/bin/env python3

import ibm_boto3
from ibm_botocore.config import Config
from ibm_botocore.exceptions import ClientError

# Define constants
API_KEY = os.environ.get('IBMCLOUD_API_KEY')
SERVICE_INSTANCE = os.environ.get('SERVICE_INSTANCE_ID')
ENDPOINT = os.environ.get('ENDPOINT')

BUCKET = "my-replication-bucket" # The bucket that will enable replication.

# Create resource client with configuration info pulled from environment variables.
cosClient = ibm_boto3.client("s3",
                         ibm_api_key_id=API_KEY,
                         ibm_service_instance_id=SERVICE_INSTANCE,
                         config=Config(signature_version="oauth"),
                         endpoint_url=ENDPOINT
                         )

response = cosClient.put_bucket_versioning(
    Bucket=BUCKET,
    ReplicationConfiguration={
        'Rules': [
            {
                'ID': 'string',
                'Priority': 123,
                'Filter': {
                    'Prefix': 'string',
                    'Tag': {
                        'Key': 'string',
                        'Value': 'string'
                    },
                    'And': {
                        'Prefix': 'string',
                        'Tags': [
                            {
                                'Key': 'string',
                                'Value': 'string'
                            },
                        ]
                    }
                },
                'Status': 'Enabled'|'Disabled',
                'Destination': {
                    'Bucket': 'string',
                },
                'DeleteMarkerReplication': {
                    'Status': 'Enabled'|'Disabled'
                }
            },
        ]
    }
)

Liste des versions d'un objet utilisant le même client:

resp = cosClient.list_object_versions(Prefix='some-prefix', Bucket=BUCKET)

Notez que les API Python sont très flexibles et qu'il existe de nombreuses façons d'accomplir la même tâche.

Node.js

Activation de la gestion des versions à l'aide du logiciel IBM COS SDK for Node.js:

const IBM = require('ibm-cos-sdk');

var config = {
    endpoint: '<endpoint>',
    apiKeyId: '<api-key>',
    serviceInstanceId: '<resource-instance-id>',
};

var cos = new IBM.S3(config);

var params = {
  Bucket: 'STRING_VALUE', /* required */
  ReplicationConfiguration: { /* required */
    Role: 'STRING_VALUE', /* required */
    Rules: [ /* required */
      {
        Destination: { /* required */
          Bucket: 'STRING_VALUE', /* required */
        },
        Status: Enabled | Disabled, /* required */
        Filter: {
          And: {
            Prefix: 'STRING_VALUE',
            Tags: [
              {
                Key: 'STRING_VALUE', /* required */
                Value: 'STRING_VALUE' /* required */
              },
              /* more items */
            ]
          },
          Prefix: 'STRING_VALUE',
          Tag: {
            Key: 'STRING_VALUE', /* required */
            Value: 'STRING_VALUE' /* required */
          }
        },
        ID: 'STRING_VALUE',
        Prefix: 'STRING_VALUE',
        Priority: 'NUMBER_VALUE',
        }
      }
    ]
  },
  ContentMD5: 'STRING_VALUE',
};
cos.putBucketReplication(params, function(err, data) {
  if (err) console.log(err, err.stack); // an error occurred
  else     console.log(data);           // successful response
});