Verrouillage d'objet

Le verrouillage d'objet préserve les enregistrements électroniques et maintient l'intégrité des données en s'assurant que les versions d'objet individuelles sont stockées dans un WORM (Write-Once-Read-Many), non effaçables et non réinscriptibles. Cette politique est appliquée jusqu'à une date spécifiée ou jusqu'à la suppression des mises en attente légales.

Pourquoi utiliser le verrouillage d'objet?

Le verrouillage d'objet aide les clients à gérer les exigences de conservation et de conservation des données en appliquant l'immuabilité des données pour leurs charges de travail de sauvegarde, de reprise après incident et de cyber-résilience.

Le verrouillage d'objet garantit que les données ne peuvent être supprimées par personne et qu'il n'existe aucun moyen d'interrompre la conservation d'un objet. Lisez attentivement la documentation avant de verrouiller les objets avec une durée de conservation.

Lors de l'utilisation d'Object Lock, il est de votre responsabilité de vous assurer de la conformité aux réglementations auxquelles vous (votre organisation) pouvez être soumis en ce qui concerne la conservation et le stockage des données pour une conservation à long terme.

Lorsque vous utilisez Object Lock, il vous incombe de veiller à ce que votre compte IBM Cloud reste en règle, conformément aux politiques et directives d’ IBM Cloud, tant que les données sont soumises à une période de conservation. Pour plus d'informations, voir les conditions du service IBM Cloud.

Terminologie

Il existe deux façons d'utiliser le verrouillage d'objet pour protéger les données: les périodes de conservation et les mises en attente légales.

  • Une période de conservation définit une période pendant laquelle un objet ne peut pas être modifié ou supprimé.
  • Une conservation légale empêche également la modification d'un objet, mais ne reste en place que jusqu'à ce qu'il soit explicitement levé.

Il est possible d'utiliser n'importe quelle combinaison de ces paramètres-une version d'objet peut en avoir une, les deux ou aucune.

Conserver jusqu'à la date (durée de conservation)

Si vous avez besoin de protéger une version d'objet pendant une durée fixe, vous devez spécifier une zone Conserver jusqu'à la date qui détermine la période pendant laquelle elle ne peut pas être modifiée. La version de l'objet peut être supprimée une fois cette date passée (en supposant qu'il n'y ait pas de mises en attente légales sur la version de l'objet). Pour les objets en mode GOUVERNANCE, les utilisateurs autorisés disposant de bypass-governance-retention l'autorisation peuvent supprimer la version de l'objet avant la date de conservation.

La durée de conservation des nouveaux objets peut être héritée de la valeur par défaut définie sur le compartiment ou elle peut être explicitement définie lors de l'écriture de l'objet en spécifiant une valeur dans la zone Conserver jusqu'à la date.

Lorsque vous utilisez les paramètres par défaut du compartiment, vous ne spécifiez pas de date de fin de conservation. A la place, vous spécifiez une durée, en jours ou en années, pendant laquelle chaque version d'objet placée dans le compartiment doit être protégée. Lorsque vous placez un objet dans le compartiment, une date de fin de conservation est calculée pour la version de l'objet en ajoutant la durée spécifiée à l'heure d'écriture de l'objet.

Si votre demande de mise en place d'une version d'objet dans un compartiment contient un mode de conservation explicite et Retain Until Date, ces paramètres remplacent les paramètres par défaut du compartiment pour cette version d'objet.

Comme tous les autres paramètres de verrouillage d'objet, l'option Conserver jusqu'à la date s'applique aux versions d'objet individuelles. Différentes versions d'un même objet peuvent avoir des modes et des périodes de conservation différents.

Imaginons un objet de 60 jours dans une période de conservation de 90 jours, et vous écrasez cet objet avec le même nom et une période de conservation de deux ans. L'opération aboutit et une nouvelle version de l'objet avec une période de conservation de deux ans est créée. Pendant ce temps, après 30 jours de plus, la version d'origine peut être supprimée.

Extension d'une durée de conservation

Pour prolonger la durée de conservation d'un objet, il suffit d'envoyer une demande pour définir une nouvelle durée de conservation plus longue. L'ancienne valeur sera remplacée par la nouvelle, en supposant que le demandeur possède les actions cloud-object-storage.object.put_object_lock_retention et cloud-object-storage.object.put_object_lock_retention_version.

Réduction de la période de conservation

Pour les objets protégés en mode GOVERNANCE, les utilisateurs autorisés peuvent réduire la période de conservation à une date antérieure, à condition d'inclure x-amz-bypass-governance-retention l'en-tête dans la demande et de disposer des autorisations appropriées (cloud-object-storage.object.bypass_governance_retention, cloud-object-storage.object.put_object_lock_retention et cloud-object-storage.object.put_object_lock_retention_version).

Les objets en mode CONFORMITÉ ne peuvent pas voir leur période de conservation réduite ou supprimée avant l'expiration de la date de conservation.

Premiers pas avec Object Lock

Pour commencer, il existe quelques prérequis:

  • Vous aurez besoin du rôle de plateforme Writer ou Manager sur un compartiment, ou d'un rôle personnalisé avec les actions appropriées (telles que cloud-object-storage.bucket.put_object_lock_configuration) affectées.
  • La gestion des versions d'objet doit être activée
  • Vous devrez utiliser le plan de tarification Standard. Pour plus de détails, voir Tarification.
  • Vous devez sélectionner une région dans laquelle le verrouillage d'objet est pris en charge. Pour plus de détails, voir Services intégrés.
  • Une durée de conservation maximale par défaut de 100 ans (ou 36500 jours) est prise en charge.
  • Lors de l'utilisation de la console, il est également possible de définir une date de fin de conservation en mois, en plus des jours ou des années.

En mode CONFORMITÉ, la période de conservation d'un objet ne peut pas être réduite. En mode GOUVERNANCE, les utilisateurs autorisés disposant de l'autorisation BypassGovernanceRetention peuvent réduire ou supprimer la conservation si nécessaire. Pour les tests de validation, il est recommandé d'utiliser une durée de conservation par défaut plus courte (par exemple, 1 jour) et de l'ajuster si nécessaire.

Création et configuration de votre nouveau compartiment à utiliser avec le verrouillage d'objet

  1. Accédez à l'instance Object Storage de votre choix et utilisez Create Bucket avec Customize your bucket option
  2. Entrez les détails de configuration de compartiment requis en fonction de vos exigences de cas d'utilisation
  3. Accédez à la section Object Versioning et définissez-la sur Enabled.
  4. Recherchez Immutabilitéet, sous Verrouillage d'objet, cliquez sur Ajouter.
  5. Définir le verrouillage d'objet sur Activé
  6. Vous pouvez éventuellement définir une durée de conservation par défaut.
  7. Cliquez sur Enregistrer
  8. Poursuivez avec le reste des paramètres de configuration et cliquez sur Créer un compartiment

Activation du verrouillage d'objet sur un compartiment existant:

Un compartiment peut être défini pour l'utilisation du verrouillage d'objet comme suit:

  1. Accédez à la section Configuration de votre compartiment
  2. Cliquez sur Object Versioning
  3. Dans la section Object Versioning , cliquez sur Edit, définissez l'option de configuration sur Enabled et sur Save.
  4. Accédez à la section Verrouillage d'objet et cliquez sur Ajouter.
  5. Définissez Object Lock sur Enabled
  6. Vous pouvez éventuellement définir une durée de conservation par défaut.
  7. Cliquez sur « Enregistrer »

Ajout d'une date de fin de conservation ou d'une retenue légale à un objet

  1. Accédez au compartiment avec l'objet cible
  2. Activer / désactiver Afficher les versions
  3. Accéder aux détails de la version cible
  4. Ajoutez une période de conservation et / ou basculez sur une mise en attente légale.

Utilisation du verrouillage d'objet pour la continuité des opérations et la reprise après incident

Le verrouillage d'objet peut être utilisé pour assurer la continuité du service en cas d'attaque par rançongiciel, car les données protégées ne peuvent pas être modifiées ou détruites.

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 l'activation, la modification ou la suppression d'une période de conservation par défaut sur un compartiment, la propagation de la configuration sur le système peut prendre quelques instants. Les opérations sur les objets, telles que l'ajout d'une mise en attente légale, sont immédiatement cohérentes.

Utilisation et comptabilité

Les objets verrouillés (et leurs versions) contribuent à l'utilisation comme toutes les autres données et vous serez responsable des coûts d'utilisation tant que l'objet reste verrouillé avec une durée de conservation.

Interactions

Le verrouillage d'objets peut être utilisé en combinaison avec plusieurs fonctions de stockage d'objets en fonction de vos besoins de cas d'utilisation.

Gestion des versions

L'activation de la gestion des versions est une condition préalable à l'activation du verrouillage d'objet. Si un compartiment est créé à l'aide de l'en-tête x-amz-bucket-object-lock-enabled, la gestion des versions est automatiquement activée.

La suppression d'un objet versionné crée un marqueur de suppression. L'objet peut sembler avoir été supprimé, mais s'il est protégé, il est impossible de supprimer la version protégée en mode CONFORMITÉ. Les marqueurs de suppression eux-mêmes ne sont pas protégés. Toutefois, pour les objets verrouillés en mode GOVERNANCE, les utilisateurs autorisés disposant de bypass-governance-retention l'autorisation peuvent supprimer l'objet avant l'expiration de la période de conservation, à condition qu'aucune conservation légale ne soit active sur l'objet.

Réplication

Object Lock peut être utilisé avec la réplication. Si la fonctionnalité Object Lock est activée à la fois sur le compartiment source et sur le compartiment de réplication, tous les états d'Object Lock associés aux versions de l'objet source seront répliqués vers le compartiment de destination. Cela inclut toutes les mises à jour d'Object Lock impliquant un contournement des règles de gouvernance. Pour plus d'informations, consultez la section « Réplication d'objets ».

Systèmes de gestion de clés

Les objets protégés seront chiffrés à l'aide de la clé racine du compartiment. Lorsque le verrouillage d'objet est activé sur un compartiment, la clé racine hébergée par Key Protect ou Hyper Protect Crypto Services est protégée contre la suppression tant que le verrouillage d'objet est activé pour un compartiment associé. Cela permet d'éviter le broyage cryptographique des objets protégés.

Configurations de cycle de vie

Il est possible d'activer des règles de cycle de vie qui archivent les objets verrouillés, mais bien sûr pas celles qui expirent les objets sous conservation ou conservation légale (les objets non protégés dans le compartiment peuvent encore expirer).

Immutable Object Storage

Le verrouillage d'objet est une alternative aux règles de conservation disponibles lors de l'utilisation de Object Storageimmutable. Comme le verrouillage d'objet requiert l'activation de la gestion des versions et que le Object Storage immutable n'est pas compatible avec la gestion des versions, il est impossible d'activer les deux solutions WORM sur le même compartiment. Il est possible d'avoir une combinaison de compartiments dans une instance de service, chacun utilisant soit Immutable Object Storage, soit Object Lock.

Balisage d'objet

Il n'existe aucune restriction concernant l'ajout ou la modification de balises sur un objet protégé.

Autres interactions

Il ne devrait pas y avoir d'interactions négatives lors de l'utilisation du verrouillage d'objet avec d'autres fonctions de Object Storage, telles que la définition de politiques CORS, la définition de pare-feu IP ou de restrictions basées sur des conditions, de quotas de bacs ou Code Engine.

Actions IAM

De nouvelles actions IAM sont associées au verrouillage d'objet.

Actions IAM
Action IAM Rôle
cloud-object-storage.bucket.get_object_lock_configuration Gestionnaire, Rédacteur, Lecteur
cloud-object-storage.bucket.put_object_lock_configuration Responsable, Auteur
cloud-object-storage.object.get_object_lock_retention Gestionnaire, Rédacteur, Lecteur
cloud-object-storage.object.put_object_lock_retention Responsable, Auteur
cloud-object-storage.object.get_object_lock_retention_version Gestionnaire, Rédacteur, Lecteur
cloud-object-storage.object.put_object_lock_retention_version Responsable, Auteur
cloud-object-storage.object.get_object_lock_legal_hold Gestionnaire, Rédacteur, Lecteur
cloud-object-storage.object.put_object_lock_legal_hold Responsable, Auteur
cloud-object-storage.object.get_object_lock_legal_hold_version Gestionnaire, Rédacteur, Lecteur
cloud-object-storage.object.put_object_lock_legal_hold_version Responsable, Auteur
cloud-object-storage.object.bypass_governance_retention Responsable, Auteur

Sachez que les utilisateurs ayant le rôle Auteur sont capables de rendre les objets non supprimables pendant de nombreuses années (peut-être des milliers d'années). Soyez prudent et envisagez de créer des rôles personnalisés qui ne permettent pas à la plupart des utilisateurs de définir une date de fin de conservation.

Événements Activity Tracker

Le verrouillage d'objet génère des événements supplémentaires.

  • cloud-object-storage.bucket-object-lock.create
  • cloud-object-storage.bucket-object-lock.read
  • cloud-object-storage.object-object-lock-legal-hold.create
  • cloud-object-storage.object-object-lock-legal-hold.read
  • cloud-object-storage.object-object-lock-retention.create
  • cloud-object-storage.object-object-lock-retention.read

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

Zone Description
requestData.object_lock_configuration.enabled Indique que le verrouillage d'objet est activé sur le compartiment
requestData.object_lock_configuration.defaultRetention.mode Indique que le COMPLIANCE mode GOVERNANCE ou est actif.
object_lock_configuration.defaultRetention.years Durée de conservation par défaut en années.
object_lock_configuration.defaultRetention.days Durée de conservation par défaut en jours.

Seuls object_lock_configuration.defaultRetention.years ou object_lock_configuration.defaultRetention.days seront présents, mais pas les deux en même temps.

Pour les opérations sur les objets protégés, les zones suivantes peuvent être présentes:

Zone Description
requestData.object_lock_protection.legal_hold Indique qu'une retenue légale est en vigueur sur la version de l'objet.
requestData.object_lock_protection.retention.mode Indique COMPLIANCE que GOVERNANCE le mode est actif sur la version de l'objet.
requestData.object_lock_protection.retention.retain_until_date Indique la date à laquelle la version de l'objet peut être supprimée. Après cette date, l'objet n'est plus protégé en raison d'une date de conservation.

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 le verrouillage d'objet sur un compartiment

La configuration du verrouillage d'objet 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 verrouillage d'objet doit inclure une règle.

En-tête facultatif
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.
x-amz-sdk-checksum-algorithm Chaîne Indique l'algorithme utilisé pour créer la somme de contrôle de l'objet lors de l'utilisation du SDK.
x-amz-bypass-governance-retention Chaîne Cet en-tête permet aux utilisateurs autorisés de passer outre les paramètres de conservation du mode GOVERNANCE afin de supprimer ou de modifier un objet avant sa date de conservation.

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
ObjectLockConfiguration Conteneur ObjectLockEnabled, Rule Aucun Obligatoire Limite 1.
ObjectLockEnabled Chaîne Aucun ObjectLockConfiguration Obligatoire La seule valeur valide est Enabled (sensible à la casse).
Rule Conteneur DefaultRetention ObjectLockConfiguration Limite 1
DefaultRetention Conteneur Days, Mode, Years Rule Limite 1.
Days Entier Aucun DefaultRetention Nombre de jours que vous souhaitez spécifier pour la durée de conservation par défaut. Ne peut pas être combiné avec Years.
Mode Chaîne Aucun DefaultRetention COMPLIANCE ou GOVERNANCE (sensible à la casse).
Years Entier Aucun DefaultRetention Nombre d'années que vous souhaitez spécifier pour la durée de conservation par défaut. Ne peut pas être combiné avec Days.

Cet exemple permet de conserver les nouveaux objets pendant au moins 30 jours.

curl -X "PUT" "https://$BUCKET.s3.$REGION.cloud-object-storage.appdomain.cloud/?object-lock" \
     -H 'Authorization: bearer $TOKEN' \
     -H 'Content-MD5: exuBoz2kFBykNwqu64JZuA==' \
     -H 'Content-Type: text/plain; charset=utf-8' \
     -d $'<ObjectLockConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
            <ObjectLockEnabled>Enabled</ObjectLockEnabled>
            <Rule>
                <DefaultRetention>
                  <Days>30</Days>
                  <Mode>COMPLIANCE</Mode>
                </DefaultRetention>
            </Rule>
          </ObjectLockConfiguration>'

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

Afficher la configuration du verrouillage d'objet pour un compartiment

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

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

<ObjectLockConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
  <ObjectLockEnabled>string</ObjectLockEnabled>
  <Rule>
      <DefaultRetention>
        <Days>30</Days>
        <Mode>COMPLIANCE</Mode>
      </DefaultRetention>
  </Rule>
</ObjectLockConfiguration>

Ajouter ou prolonger une durée de conservation pour un objet

La configuration du verrouillage d'objet est fournie au format XML dans le corps de la demande. Les nouvelles demandes écraseront toutes les règles de réplication existantes présentes sur l'objet, à condition que la RetainUntilDate soit plus éloignée dans le futur que la valeur actuelle, ou si l'objet est verrouillé en mode GOVERNANCE et que le demandeur dispose de bypass-governance-retention l'autorisation.

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.
x-amz-sdk-checksum-algorithm Chaîne Indique l'algorithme utilisé pour créer la somme de contrôle de l'objet lors de l'utilisation du SDK.
x-amz-bypass-governance-retention Chaîne Cet en-tête permet aux utilisateurs autorisés de passer outre les paramètres de conservation du mode GOVERNANCE afin de supprimer ou de modifier un objet avant sa date de conservation.

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.

Si vous le souhaitez, vous pouvez spécifier la version pour laquelle appliquer le RetainUntilDate.

Paramètres de requête facultatifs

Paramètre Obligatoire ? Type Description
versionID Facultatif chaîne ID de version.

Le corps de la demande doit contenir un bloc XML avec le schéma suivant :

Elément Type Enfants Ancêtre Contrainte
Retention Conteneur Mode, RetainUntilDate Aucun Obligatoire Limite 1.
Mode Chaîne Aucun Retention **Obligatoire **COMPLIANCE ou GOVERNANCE (sensible à la casse).
RetainUntilDate Chaîne Aucun Retention Requis Date après laquelle un objet peut être supprimé au format de date-heure ISO8601.

Cet exemple permet de conserver les nouveaux objets au moins jusqu'au 12 mars 2023.

curl -X "PUT" "https://$BUCKET.s3.$REGION.cloud-object-storage.appdomain.cloud/?retention" \
     -H 'Authorization: Bearer $TOKEN' \
     -H 'Content-MD5: fT0hYstki6zUvEh7abhcTA==' \
     -H 'Content-Type: text/plain; charset=utf-8' \
     -d $'<Retention>
            <Mode>COMPLIANCE</Mode>
            <RetainUntilDate>2023-03-12T23:01:00.000Z</RetainUntilDate>
          </Retention>'

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

Si les valeurs RetainUntilDate ne sont pas supérieures à une valeur existante, l'opération échoue avec un 403 Access Denied.

Cet exemple raccourcit la période de conservation d'une version d'objet existante protégée en mode GOVERNANCE. Le demandeur doit disposer de l'autorisation bypass-governance-retention.

curl -X "PUT" "https://$BUCKET.s3.$REGION.cloud-object-storage.appdomain.cloud/$OBJECT?retention" \
     -H "Authorization: Bearer $TOKEN" \
     -H "Content-MD5: fT0hYstki6zUvEh7abhcTA==" \
     -H "Content-Type: text/plain; charset=utf-8" \
     -H "x-amz-bypass-governance-retention: true" \
     -d $'<Retention>
            <Mode>GOVERNANCE</Mode>
            <RetainUntilDate>2023-02-10T23:01:00.000Z</RetainUntilDate>
          </Retention>'

Une requête réussie renvoie une réponse 200 OK. Si le demandeur ne dispose pas de bypass-governance-retention l'autorisation ou si l'en-tête est omis, l'opération échouera avec un code d'erreur 403 Accès refusé.

Ajouter ou supprimer une mise en attente légale pour un objet

La configuration du verrouillage d'objet est fournie au format XML dans le corps de la demande. Les nouvelles demandes écraseront toutes les règles de réplication existantes présentes sur l'objet, à condition que RetainUntilDate soit plus éloigné de la valeur en cours.

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.
x-amz-sdk-checksum-algorithm Chaîne Indique l'algorithme utilisé pour créer la somme de contrôle de l'objet lors de l'utilisation du SDK.

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
legal-hold Conteneur Status Aucun Limite 1.
Status Chaîne Aucun legal-hold Les valeurs prises en charge sont ON ou OFF (sensible à la casse)

Cet exemple permet de conserver les nouveaux objets au moins jusqu'au 12 mars 2023.

curl -X "PUT" "https://$BUCKET.s3.$REGION.cloud-object-storage.appdomain.cloud/?legal-hold&versionId=$VERSION_ID" \
     -H 'Authorization: Bearer $TOKEN' \
     -H 'Content-MD5: FMh6GxizXUBRaiDuB0vtgQ==' \
     -H 'Content-Type: text/plain; charset=utf-8' \
     -d $'<legal-hold>
            <Status>ON</Status>
          </legal-hold>'

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

Exemples SDK

Les exemples suivants utilisent les SDK COS d' IBM pour Python, Node.js, Java et Go, ainsi qu'un script Terraform, bien que la mise en œuvre du versionnage des objets devrait être entièrement compatible avec toute bibliothèque ou tout outil S3-compatible permettant la configuration de points de terminaison personnalisés. L'utilisation d'outils tiers nécessite des identifiants HMAC pour calculer les signatures AWS V4.

Python

L'activation du verrouillage d'objet à l'aide du logiciel IBM COS SDK for Python peut être effectuée à l'aide de la syntaxe low-level client.

Utilisation d'un client:

import ibm_boto3
from ibm_botocore.client import Config
from ibm_botocore.exceptions import ClientError
from datetime import datetime, timedelta
import time

# Create new bucket with Object Lock enabled.
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))

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)
    # 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)

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)
    # 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)

def upload_object(bucket_name,object_name,object_content):
        cos_cli.put_object(
            Bucket=bucket_name,
            Key=object_name,
            Body=object_content
        )
        print("Object: {0} uploaded!".format(object_name))

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))

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)

        # 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)

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)

        # 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)

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'})
        # 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)

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)

COS_ENDPOINT = "" #Current list avaiable at https://control.cloud-object-storage.cloud.ibm.com/v2/endpoints -> Ex:https://s3.us-south.cloud-object-storage.appdomain.cloud
COS_API_KEY_ID = "" #API Key of the cos instance created Ex: W00YixxxxxxxxxxMB-odB-2ySfTrFBIQQWanc--P3byk
COS_RESOURCE_INSTANCE_CRN = "" #API key of cos instance example: xxxd12V2QHXbjaM99G9tWyYDgF_0gYdlQ8aWALIQxXx4

# Create client connection
cos_cli = ibm_boto3.client("s3",
    ibm_api_key_id=COS_API_KEY_ID,
    config=Config(signature_version="oauth"),
    endpoint_url=COS_ENDPOINT,
    ibm_service_instance_id=COS_RESOURCE_INSTANCE_CRN,
    ibm_auth_endpoint="https://iam.cloud.ibm.com/identity/token"
)
new_bucket_name = "create-example-python12345" # bucket name should be unique gloablly, or else it will throw an error.
new_text_file_name = "cos_object.txt"
new_text_file_contents = "This is a test file from Python code sample!!!"

# *** Main Program ***
def main():
       create_bucket_with_objectlock(new_bucket_name) # Create a new cos bucket with object lock enabled.
       objectlock_configuration_on_bucket(new_bucket_name) # Put objectlock configuration(i.e. default retention) on COS bucket and get the configuration.
       objectlock_configuration_with_governance_mode_on_bucket(new_bucket_name) # Put objectlock configuration(i.e. default retention)with governance mode on COS bucket and get the configuration.
       upload_object(new_bucket_name,new_text_file_name,new_text_file_contents) # Upload an object to cos bucket.
       upload_object_with_governance_mode(new_bucket_name,new_text_file_name,new_text_file_contents) # Upload an object to cos bucket with governance mode.
       objectlock_retention(new_bucket_name,new_text_file_name) # Put objectlock retention(i.e. retain until date) on the object and get the configured retention.
       objectlock_retention_with_governance_mode(new_bucket_name,new_text_file_name) # Put objectlock retention(i.e. retain until date) with governance mode on the object and get the configured retention.
       objectlock_legal_hold(new_bucket_name,new_text_file_name)  # Put objectlock legal-hold on the object and get the legal-hold status.
       delete_object_with_bypass_governance(new_bucket_name,new_text_file_name) # Deleting an object with retention with governance mode using bypass governance.
if __name__ == "__main__":
    main()

Node.js

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

'use strict';

// Required libraries
const ibm = require('ibm-cos-sdk');
const fs = require('fs');
const crypto = require('crypto');

function logError(e) {
    console.log(`ERROR: ${e.code} - ${e.message}\n`);
}

function logDone() {
    console.log('DONE!\n');
}

const COS_ENDPOINT = "";   //Choose endpoint from https://control.cloud-object-storage.cloud.ibm.com/v2/endpoints. Ex: https://s3.us-south.cloud-object-storage.appdomain.cloud
const COS_API_KEY_ID = "";  // API key of cos instance example: xxxd12V2QHXbjaM99G9tWyYDgF_0gYdlQ8aWALIQxXx4
const COS_AUTH_ENDPOINT = "";
const COS_RESOURCE_INSTANCE_CRN = ""; // example: crn:v1:bluemix:public:cloud-object-storage:global:a <CREDENTIAL_ID_AS_GENERATED>:<SERVICE_ID_AS_GENERATED>::

// Client Creation.
var config = {
    endpoint: COS_ENDPOINT,
    apiKeyId: COS_API_KEY_ID,
    ibmAuthEndpoint: COS_AUTH_ENDPOINT,
    serviceInstanceId: COS_RESOURCE_INSTANCE_CRN,
    signatureVersion: 'iam'
};

var cos = new ibm.S3(config);

// Create new bucket with objectlock enabled.
function createBucket(bucketName) {
    console.log(`Creating new bucket: ${bucketName}`);
    return cos.createBucket({
        Bucket: bucketName,
        ObjectLockEnabledForBucket: true,
        CreateBucketConfiguration: {
            LocationConstraint: ''
          },
    }).promise()
    .then((() => {
        console.log(`Bucket: ${bucketName} created!`);
    }))
    .catch((e) => {
        console.error(`ERROR: ${e.code} - ${e.message}\n`);
    });
}

// Create new text file and upload the object to COS bucket.
function createTextFile(bucketName, itemName, fileText) {
    console.log(`Creating new item: ${itemName}`);
    return cos.putObject({
        Bucket: bucketName,
        Key: itemName,
        Body: fileText
    }).promise()
    .then(() => {
        console.log(`Item: ${itemName} created!`);
        logDone();
    })
    .catch(logError);
}

function uploadFileWithGovernanceMode(bucketName, itemName, fileText) {
    var inFiveSecond = (new Date(Date.now() + (1000 * 5)))
    console.log(`Creating new item: ${itemName}`);
    return cos.putObject({
        Bucket: bucketName,
        Key: itemName,
        Body: fileText,
        ObjectLockMode: "GOVERNANCE",
        ObjectLockRetainUntilDate: inFiveSecond,

    }).promise()
    .then(() => {
        console.log(`Item: ${itemName} created!`);
        logDone();
    })
    .catch(logError);
}

function putObjectLockConfigurationOnBucket(bucketName) {
    console.log(`Putting Objectlock Configuration on : ${bucketName}`);
    // Putting objectlock configuration
    var defaultRetention = {Mode: 'COMPLIANCE', Days: 1}
    var objectLockRule = {DefaultRetention : defaultRetention}
    var param = {ObjectLockEnabled: 'Enabled', Rule: objectLockRule}
    return cos.putObjectLockConfiguration({
        Bucket: bucketName,
        ObjectLockConfiguration: param
    }).promise()
    .then(() => {
        console.log(`Object lock Configurtion added!!`);
        logDone();
    })
    .catch(logError);
}

function putObjectLockConfigurationWithGovernanceModeOnBucket(bucketName) {
    console.log(`Putting Objectlock Configuration on : ${bucketName}`);
    // Putting objectlock configuration
    var defaultRetention = {Mode: 'GOVERNANCE', Days: 1}
    var objectLockRule = {DefaultRetention : defaultRetention}
    var param = {ObjectLockEnabled: 'Enabled', Rule: objectLockRule}
    return cos.putObjectLockConfiguration({
        Bucket: bucketName,
        ObjectLockConfiguration: param
    }).promise()
    .then(() => {
        console.log(`Object lock Configurtion with Governance mode added!!`);
        logDone();
    })
    .catch(logError);
}

function getObjectLockConfigurationonBucket(bucketName) {
    console.log(`Getting Objectlock Configuration for : ${bucketName}`);
    // Getting objectlock configuration
    return cos.getObjectLockConfiguration({
        Bucket: bucketName,
    }).promise()
    .then((data) => {
        console.log(`objectlock configuration`);
        console.log( JSON.stringify(data.ObjectLockConfiguration, null, "    ") );
        logDone();
    })
    .catch(logError);
}

function putObjectLockRetention(bucketName,keyName) {
    console.log(`Putting Objectlock Retention on : ${keyName}`);
    var inFiveSecond = (new Date(Date.now() + (1000 * 5)))
    var rule = {Mode: 'COMPLIANCE', RetainUntilDate: inFiveSecond}
     // Putting objectlock retention
    return cos.putObjectRetention({
        Bucket: bucketName,
        Key: keyName,
        Retention: rule
    }).promise()
    .then(() => {
        console.log(`Object lock Retention added!!`);
        logDone();
    })
    .catch(logError);
}

function putObjectLockRetentionWithGovernanceMode(bucketName,keyName) {
    console.log(`Putting Objectlock Retention on : ${keyName}`);
    var inFiveSecond = (new Date(Date.now() + (1000 * 5)))
    var rule = {Mode: 'GOVERNANCE', RetainUntilDate: inFiveSecond}
     // Putting objectlock retention
    return cos.putObjectRetention({
        Bucket: bucketName,
        Key: keyName,
        Retention: rule
    }).promise()
    .then(() => {
        console.log(`Object lock Retention with governance mode added!!`);
        logDone();
    })
    .catch(logError);
}

function getObjectLockRetention(bucketName,keyName) {
    console.log(`Getting Objectlock Retention for : ${keyName}`);
    // Getting objectlock retention
    return cos.getObjectRetention({
        Bucket: bucketName,
        Key: keyName
    }).promise()
    .then((data) => {
        console.log(`Objectlock retention for : ${keyName} `);
        console.log( JSON.stringify(data.Retention, null, "    ") );
        logDone();
    })
    .catch(logError);
}

function putObjectLocklegalHold(bucketName,keyName) {
    console.log(`Putting Objectlock legal-hold status ON for  : ${keyName}`);
     // Putting objectlock legal-hold status
    return cos.putObjectlegalHold({
        Bucket: bucketName,
        Key: keyName,
        LegalHold: {Status: 'ON'}
    }).promise()
    .then(() => {
        console.log(`Object lock legal-hold added!!`);
        logDone();
    })
    .catch(logError);
}

function getObjectLocklegalHold(bucketName,keyName) {
    console.log(`Getting Objectlock legal-hold for : ${keyName}`);
    // Getting objectlock legal-hold
    return cos.getObjectlegal-hold({
        Bucket: bucketName,
        Key: keyName
    }).promise()
    .then((data) => {
        console.log(`Objectlock legal-hold for : ${keyName} `);
        console.log( JSON.stringify(data.legal-hold, null, "    ") );
        logDone();
    })
    .catch(logError);
}
function createBucket(bucketName,objectName) {
    console.log(`Deleting Object t: ${objectName}`);
    return cos.deleteObject({
  Bucket: bucketName,
  Key: objectName,
  BypassGovernanceRetention: true,
}).promise()
.then(() => {
    console.log("Object deleted");
})
.catch(err => {
    console.error("Error deleting object:", err);
});

}
// Main app
function main() {
    try {
        var newBucketName = "jscosbucket350";
        var newTextFileName = "js_cos_bucket_file.txt";
        var newTextFileContents = "This is a test file from Node.js code sample!!!";

        createBucket(newBucketName) // Create a new cos bucket with object lock enabled.
        .then(() => putObjectLockConfigurationOnBucket(newBucketName)) // Put objectlock configuration(i.e. default retention) on COS bucket.
        .then(() => putObjectLockConfigurationWithGovernanceModeOnBucket(newBucketName)) // Put objectlock configuration(i.e. default retention) with governance mode on COS bucket.
        .then(() => getObjectLockConfigurationonBucket(newBucketName)) // Read objectlock configuration on COS bucket.
        .then(() => createTextFile(newBucketName, newTextFileName, newTextFileContents)) // Upload an object with governance mode to cos bucket.
        .then(() => uploadFileWithGovernanceMode(newBucketName, newTextFileName, newTextFileContents)) // Upload an object to cos bucket.
        .then(() => putObjectLockRetention(newBucketName, newTextFileName)) // Put objectlock retention(i.e. retain until date) on the object.
        .then(() => putObjectLockRetentionWithGovernanceMode(newBucketName, newTextFileName)) // Put objectlock retention(i.e. retain until date) with governance mode on the object.
        .then(() => getObjectLockRetention(newBucketName, newTextFileName)) // Get the configured retention.
        .then(() => putObjectLocklegalHold(newBucketName,newTextFileName)) // Put objectlock legal-hold on the object.
        .then(() => getObjectLocklegalHold(newBucketName,newTextFileName))// Get the legal-hold status.
        .then(() => deleteObjectWithGovernanceMode(newBucketName,newTextFileName)); // Deleting an object with retention using bypass governance
    }
    catch(ex) {
        logError(ex);
    }
}

main();
```### Java
{: #ol-sdks-java}

```java {: codeblock}
mport com.ibm.cloud.objectstorage.ClientConfiguration;
import com.ibm.cloud.objectstorage.SDKGlobalConfiguration;
import com.ibm.cloud.objectstorage.auth.AWSCredentials;
import com.ibm.cloud.objectstorage.auth.AWSStaticCredentialsProvider;
import com.ibm.cloud.objectstorage.client.builder.AwsClientBuilder;
import com.ibm.cloud.objectstorage.oauth.BasicIBMOAuthCredentials;
import com.ibm.cloud.objectstorage.services.s3.AmazonS3;
import com.ibm.cloud.objectstorage.services.s3.AmazonS3ClientBuilder;
import com.ibm.cloud.objectstorage.services.s3.model.*;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.Charset;
import java.time.LocalDate;
import java.util.List;
import java.util.UUID;

public class JavaExampleSDK {
    private static AmazonS3 _cosClient;
    private static String api_key;
    private static String service_instance_id;
    private static String endpoint_url;
    private static String location;
    private static String auth_endpoint;

    public static void main(String[] args) throws IOException
    {

        // Constants for IBM COS values
        auth_endpoint = ""; // auth endpoint
        api_key = "";// example: xxxd12V2QHXbjaM99G9tWyYDgF_0gYdlQ8aWALIQxXx4
        service_instance_id = ""; // example: crn:v1:bluemix:public:cloud-object-storage:global:a/xx999cd94a0dda86fd8eff3191349999:9999b05b-x999-4917-xxxx-9d5b326a1111::
        endpoint_url = ""; // example: https://s3.us-south.cloud-object-storage.appdomain.cloud
        location =  "";// example: us-south-standard

        // Create client connection details
        // _cosClient = createClient(api_key, service_instance_id, endpoint_url, location);

        // String bucketName = "java.bucket" + UUID.randomUUID().toString().replace("-","");
        // String itemName = UUID.randomUUID().toString().replace("-","") + "_java_file.txt";
        // String fileText = "This is a test file from the Java code sample!!!";

        // // create a new bucket
        // createBucket(bucketName, _cosClient);

        // // Put objectlock configuration(i.e. default retention) on COS bucket.
        // putObjectLockConfiguration(bucketName , _cosClient);

        // // Put objectlock configuration(i.e. default retention) with governance mode on COS bucket.
        // putObjectLockConfigurationWithGovernanceMode(bucketName , _cosClient);

        // // create a new text file & upload
        // createTextFileAndUpload(bucketName, itemName, fileText);
        // //  Upload an object with governance mode to cos bucket.
        // uploadFileWithGovernanceMode(bucketName, itemName, fileText);

        // //  Put objectlock retention(i.e. retain until date) on the object.
        // putObjectLockRetention(bucketName, itemName, _cosClient);
        // //  Put objectlock retention(i.e. retain until date) with governance mode on the object.
        // putObjectLockRetentionWithGovernanceMode(bucketName, itemName, _cosClient);

        // // remove the object with bypass governance
        // deleteObjectWithBypassGovernance(bucketName);
    }

    // Create client connection
    public static AmazonS3 createClient(String api_key, String service_instance_id, String endpoint_url, String location)
    {
        AWSCredentials credentials;
        credentials = new BasicIBMOAuthCredentials(api_key, service_instance_id);

        ClientConfiguration clientConfig = new ClientConfiguration().withRequestTimeout(5000);
        clientConfig.setUseTcpKeepAlive(true);

        AmazonS3 cosClient = AmazonS3ClientBuilder.standard().withCredentials(new AWSStaticCredentialsProvider(credentials))
                .withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration(endpoint_url, location)).withPathStyleAccessEnabled(true)
                .withClientConfiguration(clientConfig).build();
        return cosClient;
    }

    // Create a new bucket
    public static void createBucket(String bucketName, AmazonS3 _cosClient)
    {
        _cosClient.createBucket(bucketName);
        System.out.printf("Bucket: %s created!\n", bucketName);
    }

    // Put objectlock configuration(i.e. default retention) on COS bucket.
    public static void putObjectLockConfiguration(String bucketName, AmazonS3 _cosClient)
    {
        DefaultRetention defRet = new DefaultRetention()
                .withMode(ObjectLockRetentionMode.COMPLIANCE)
                .withDays(1);
        ObjectLockRule objRule = new ObjectLockRule()
                        .withDefaultRetention(defRet);
        ObjectLockConfiguration objConfig = new ObjectLockConfiguration()
                        .withObjectLockEnabled(ObjectLockEnabled.ENABLED)
                        .withRule(objRule);
        SetObjectLockConfigurationRequest objSet = new SetObjectLockConfigurationRequest()
                        .withBucketName(BUCKET_NAME)
                        .withObjectLockConfiguration(objConfig);
        _cosClient.setObjectLockConfiguration(objSet);
        System.out.printf("Successfully added object lock cofiguration on : %s\n", bucketName);
        GetObjectLockConfigurationRequest objReq = new GetObjectLockConfigurationRequest().withBucketName(BUCKET_NAME);
        GetObjectLockConfigurationResult objRes = _cosClient.getObjectLockConfiguration(objReq);
        ObjectLockConfiguration objLckConfig = objRes.getObjectLockConfiguration();
        ObjectLockRule objGetRule = objLckConfig.getRule();
        System.out.printf("ObjectLock Configuration : %s\n", objGetRule);
    }

    // Put objectlock configuration(i.e. default retention) with governance mode on COS bucket.
    public static void putObjectLockConfigurationWithGovernanceMode(String bucketName, AmazonS3 _cosClient)
    {
        DefaultRetention defRet = new DefaultRetention()
                .withMode(ObjectLockRetentionMode.GOVERNANCE)
                .withDays(1);
        ObjectLockRule objRule = new ObjectLockRule()
                        .withDefaultRetention(defRet);
        ObjectLockConfiguration objConfig = new ObjectLockConfiguration()
                        .withObjectLockEnabled(ObjectLockEnabled.ENABLED)
                        .withRule(objRule);
        SetObjectLockConfigurationRequest objSet = new SetObjectLockConfigurationRequest()
                        .withBucketName(BUCKET_NAME)
                        .withObjectLockConfiguration(objConfig);
        _cosClient.setObjectLockConfiguration(objSet);
        System.out.printf("Successfully added object lock cofiguration on : %s\n", bucketName);
        GetObjectLockConfigurationRequest objReq = new GetObjectLockConfigurationRequest().withBucketName(BUCKET_NAME);
        GetObjectLockConfigurationResult objRes = _cosClient.getObjectLockConfiguration(objReq);
        ObjectLockConfiguration objLckConfig = objRes.getObjectLockConfiguration();
        ObjectLockRule objGetRule = objLckConfig.getRule();
        System.out.printf("ObjectLock Configuration : %s\n", objGetRule);

    }

    // Create file and upload to new bucket
    public static void createTextFileAndUpload(String bucketName, String itemName, String fileText) {
        System.out.printf("Creating new item: %s\n", itemName);

        InputStream newStream = new ByteArrayInputStream(fileText.getBytes(Charset.forName("UTF-8")));
        ObjectMetadata metadata = new ObjectMetadata();
        metadata.setContentLength(fileText.length());
        PutObjectRequest req = new PutObjectRequest(bucketName, itemName, newStream, metadata);
        _cosClient.putObject(req);
        System.out.printf("Item: %s created!\n", itemName);
    }

    //  Upload an object with governance mode to cos bucket.
    public static void uploadFileWithGovernanceMode(String bucketName, String itemName, String fileText) {
        System.out.printf("Creating new item: %s\n", itemName);
        LocalDate date = LocalDate.of(2025, 11, 11);
        InputStream newStream = new ByteArrayInputStream(fileText.getBytes(Charset.forName("UTF-8")));
        ObjectMetadata metadata = new ObjectMetadata();
        metadata.setContentLength(fileText.length());
        PutObjectRequest req = new PutObjectRequest(bucketName, itemName, newStream, metadata)
                            .withObjectLockMode("GOVERNANCE")
                            .withObjectLockRetainUntilDate(date);
        _cosClient.putObject(req);
        System.out.printf("Item: %s created!\n", itemName);
    }

    //  Put objectlock retention(i.e. retain until date) on the object.
    public static void putObjectLockRetention(String bucketName,String itemName, AmazonS3 _cosClient)
    {
        LocalDate date = LocalDate.of(2025, 11, 11);
        ObjectLockRetention objRet = new ObjectLockRetention()
                    .withMode("COMPLIANCE")
                    .withRetainUntilDate(date);
        SetObjectRetentionRequest objSet = new SetObjectRetentionRequest()
                    .withBucketName(BUCKET_NAME)
                    .withitemName(itemName)
                    .withRetention(objRet);
                    .withBypassGovernanceRetention(true);
        _cosClient.setObjectRetention(objSet);
        System.out.printf("Successfully added object retention on : %s\n", itemName);
        GetObjectRetentionRequest objReq = new GetObjectRetentionRequest()
            .withBucketName(BUCKET_NAME)
            .withitemName(itemName);
        GetObjectRetentionResult objRes1 = _cosClient.getObjectRetention(objReq);
        ObjectLockRetention objRet1 = objRes1.getRetention();
        System.out.printf("Retention : %s\n", objRet1);
    }

    //  Put objectlock retention(i.e. retain until date) with governance mode on the object.
    public static void putObjectLockRetentionWithGovernanceMode(String bucketName,String itemName, AmazonS3 _cosClient)
    {
        LocalDate date = LocalDate.of(2025, 11, 11);
        ObjectLockRetention objRet = new ObjectLockRetention()
                    .withMode("GOVERNANCE")
                    .withRetainUntilDate(date);
        SetObjectRetentionRequest objSet = new SetObjectRetentionRequest()
                    .withBucketName(BUCKET_NAME)
                    .withitemName(itemName)
                    .withRetention(objRet);
                    .withBypassGovernanceRetention(true);
        _cosClient.setObjectRetention(objSet);
        System.out.printf("Successfully added object retention on : %s\n", itemName);
        GetObjectRetentionRequest objReq = new GetObjectRetentionRequest()
            .withBucketName(BUCKET_NAME)
            .withitemName(itemName);
        GetObjectRetentionResult objRes1 = _cosClient.getObjectRetention(objReq);
        ObjectLockRetention objRet1 = objRes1.getRetention();
        System.out.printf("Retention : %s\n", objRet1);
    }

    // Delete object
    public static void deleteObjectWithBypassGovernance(String bucketName, String itemName) {
        System.out.printf("Deleting item: %s\n", itemName);
        DeleteObjectRequest deleteRequest = new DeleteObjectRequest(BUCKET_NAME, Key)
            .withBypassGovernanceRetention(true);
        _cosClient.deleteObject(deleteRequest);
        System.out.printf("Item: %s deleted!\n", itemName);
    }

}

Go

package main

import (
    "bytes"
    "fmt"
    "time"

    "github.com/IBM/ibm-cos-sdk-go/aws"
    "github.com/IBM/ibm-cos-sdk-go/aws/credentials/ibmiam"
    "github.com/IBM/ibm-cos-sdk-go/aws/session"
    "github.com/IBM/ibm-cos-sdk-go/service/s3"
)

const (
    apiKey            = "<apiKey>"
    serviceInstanceID = "<serviceInstanceID>"
    authEndpoint      = "https://iam.cloud.ibm.com/identity/token"
    serviceEndpoint   = "https://<endpoint>.appdomain.cloud"
)

// Create new bucket with objectlock enabled.
func createBucket(bucketName string, client *s3.S3) {
    createBucketInput := new(s3.CreateBucketInput)
    createBucketInput.Bucket = aws.String(bucketName)
    createBucketInput.ObjectLockEnabledForBucket = aws.Bool(true)
    _, e := client.CreateBucket(createBucketInput)
    if e != nil {
        fmt.Println(e)
    } else {
        fmt.Println("Bucket Created !!! ")
    }
}

func uploadObject(bucketName string, client *s3.S3, fileName string, fileContent string) {
    putInput := &s3.PutObjectInput{
        Bucket: aws.String(bucketName),
        Key:    aws.String(fileName),
        Body:   bytes.NewReader([]byte(fileContent)),
    }

    _, e := client.PutObject(putInput)
    if e != nil {
        fmt.Println(e)
    } else {
        fmt.Println("Object Uploaded!!! ")
    }
}

func uploadObjectWithGovernanceMode(bucketName string, client *s3.S3, fileName string, fileContent string) {
    retention_date := time.Now().Local().Add(time.Second * 5)
    putInput := &s3.PutObjectInput{
        Bucket:                    aws.String(bucketName),
        Key:                       aws.String(fileName),
        Body:                      bytes.NewReader([]byte(fileContent)),
        ObjectLockMode:            aws.String("GOVERNANCE"),
        ObjectLockRetainUntilDate: aws.Time(retention_date),
    }

    _, e := client.PutObject(putInput)
    if e != nil {
        fmt.Println(e)
    } else {
        fmt.Println("Object Uploaded!!! ")
    }
}

func objectLockConfiguration(bucketName string, client *s3.S3) {
    // Putting default retenion on the COS bucket.
    putObjectLockConfigurationInput := &s3.PutObjectLockConfigurationInput{
        Bucket: aws.String(bucketName),
        ObjectLockConfiguration: &s3.ObjectLockConfiguration{
            ObjectLockEnabled: aws.String(s3.ObjectLockEnabledEnabled),
            Rule: &s3.ObjectLockRule{
                DefaultRetention: &s3.DefaultRetention{
                    Mode: aws.String("COMPLIANCE"),
                    Days: aws.Int64(1),
                },
            },
        },
    }
    _, e := client.PutObjectLockConfiguration(putObjectLockConfigurationInput)

    // Reading the objectlock configuration set on the bucket.
    getObjectLockConfigurationInput := new(s3.GetObjectLockConfigurationInput)
    getObjectLockConfigurationInput.Bucket = aws.String(bucketName)
    response, e := client.GetObjectLockConfiguration(getObjectLockConfigurationInput)
    if e != nil {
        fmt.Println(e)
    } else {
        fmt.Println("Object Lock Configuration =>", response.ObjectLockConfiguration)
    }
}

func objectLockConfigurationwithGovernanceMode(bucketName string, client *s3.S3) {
    // Putting default retenion on the COS bucket.
    putObjectLockConfigurationInput := &s3.PutObjectLockConfigurationInput{
        Bucket: aws.String(bucketName),
        ObjectLockConfiguration: &s3.ObjectLockConfiguration{
            ObjectLockEnabled: aws.String(s3.ObjectLockEnabledEnabled),
            Rule: &s3.ObjectLockRule{
                DefaultRetention: &s3.DefaultRetention{
                    Mode: aws.String("GOVERNANCE"),
                    Days: aws.Int64(1),
                },
            },
        },
    }
    _, e := client.PutObjectLockConfiguration(putObjectLockConfigurationInput)

    // Reading the objectlock configuration set on the bucket.
    getObjectLockConfigurationInput := new(s3.GetObjectLockConfigurationInput)
    getObjectLockConfigurationInput.Bucket = aws.String(bucketName)
    response, e := client.GetObjectLockConfiguration(getObjectLockConfigurationInput)
    if e != nil {
        fmt.Println(e)
    } else {
        fmt.Println("Object Lock Configuration =>", response.ObjectLockConfiguration)
    }
}
func objectLockRetention(bucketName string, client *s3.S3, keyName string) {

    // Put objectlock retenion on the  object uploaded to the bucket.
    retention_date := time.Now().Local().Add(time.Second * 5)
    putObjectRetentionInput := &s3.PutObjectRetentionInput{
        Bucket: aws.String(bucketName),
        Key:    aws.String(keyName),
        Retention: &s3.ObjectLockRetention{
            Mode:            aws.String("COMPLIANCE"),
            RetainUntilDate: aws.Time(retention_date),
        },
    }
    _, e := client.PutObjectRetention(putObjectRetentionInput)

    // Get objectlock retention of the above object.
    getObjectRetentionInput := new(s3.GetObjectRetentionInput)
    getObjectRetentionInput.Bucket = aws.String(bucketName)
    getObjectRetentionInput.Key = aws.String(keyName)
    response, e := client.GetObjectRetention(getObjectRetentionInput)
    if e != nil {
        fmt.Println(e)
    } else {
        fmt.Println("Object Lock Retention =>", response.Retention)
    }
}

func objectLockRetentionWithGovernanceMode(bucketName string, client *s3.S3, keyName string) {

    // Put objectlock retenion on the  object uploaded to the bucket.
    retention_date := time.Now().Local().Add(time.Second * 5)
    putObjectRetentionInput := &s3.PutObjectRetentionInput{
        Bucket: aws.String(bucketName),
        Key:    aws.String(keyName),
        Retention: &s3.ObjectLockRetention{
            Mode:            aws.String("GOVERNANCE"),
            RetainUntilDate: aws.Time(retention_date),
        },
    }
    _, e := client.PutObjectRetention(putObjectRetentionInput)

    // Get objectlock retention of the above object.
    getObjectRetentionInput := new(s3.GetObjectRetentionInput)
    getObjectRetentionInput.Bucket = aws.String(bucketName)
    getObjectRetentionInput.Key = aws.String(keyName)
    response, e := client.GetObjectRetention(getObjectRetentionInput)
    if e != nil {
        fmt.Println(e)
    } else {
        fmt.Println("Object Lock Retention =>", response.Retention)
    }
}

func objectLocklegalHold(bucketName string, client *s3.S3, keyName string) {

    // Setting the objectlock legal-hold status to ON.
    putObjectlegalHoldInput := &s3.PutObjectlegalHoldInput{
        Bucket: aws.String(bucketName),
        Key:    aws.String(keyName),
        legalHold: &s3.ObjectLocklegalHold{
            Status: aws.String("ON"),
        },
    }
    _, e := client.PutObjectlegalHold(putObjectlegalHoldInput)
    // Get objectlock retention of the above object.
    getObjectlegalHoldInput := new(s3.GetObjectlegalHoldInput)
    getObjectlegalHoldInput.Bucket = aws.String(bucketName)
    getObjectlegalHoldInput.Key = aws.String(keyName)
    response, e := client.GetObjectlegalHold(getObjectlegalHoldInput)
    if e != nil {
        fmt.Println(e)
    } else {
        fmt.Println("Object Lock legal-hold =>", response.legalHold)
    }
}

func deleteObjectWithBypassGovernance(bucketName string, client *s3.S3, fileName string) {
    deleteObjectInput := new(s3.DeleteObjectInput)
    deleteObjectInput.Bucket = aws.String(bucketName)
    deleteObjectInput.Key = aws.String("foo")
    deleteObjectInput.BypassGovernanceRetention = aws.Bool(true)
    _, e := client.DeleteObject(deleteObjectInput)
    if e != nil {
        fmt.Println(e)
    } else {
        fmt.Println("Object Deleted")
    }

}

func main() {

    bucketName := "gocosbucket353"
    textFileName := "go_cos_bucket_file.txt"
    textFileContents := "This is a test file from Node.js code sample!!!"
    conf := aws.NewConfig().
        WithEndpoint(serviceEndpoint).
        WithCredentials(ibmiam.NewStaticCredentials(aws.NewConfig(),
            authEndpoint, apiKey, serviceInstanceID)).
        WithS3ForcePathStyle(true)

    sess := session.Must(session.NewSession())
    client := s3.New(sess, conf)
    createBucket(bucketName, client)                                                   // Create a new cos bucket with object lock enabled.
    objectLockConfiguration(bucketName, client)                                        // Put objectlock configuration(i.e. default retention) on COS bucket and get the configuration.
    objectLockConfigurationwithGovernanceMode(bucketName, client)                      // Put objectlock configuration(i.e. default retention) with governance mode on COS bucket and get the configuration.
    uploadObject(bucketName, client, textFileName, textFileContents)                   // Upload an object to cos bucket.
    uploadObjectWithGovernanceMode(bucketName, client, textFileName, textFileContents) // Upload an object with governance mode to cos bucket.
    objectLockRetention(bucketName, client, textFileName)                              // Put objectlock retention(i.e. retain until date) on the object and get the configured retention.
    objectLockRetentionWithGovernanceMode(bucketName, client, textFileName)            // Put objectlock retention(i.e. retain until date) with governance mode on the object and get the configured retention.
    objectLocklegalHold(bucketName, client, textFileName)                              // Put objectlock legal-hold on the object and get the legal-hold status.
    deleteObjectWithBypassGovernance(bucketName, client, textFileName)                 // Delete object using governace bypass header
}

Terraform

// Create COS instance.
resource "ibm_resource_instance" "cos_instance" {
  name              = "cos-instance"
  resource_group_id = data.ibm_resource_group.cos_group.id
  service           = "cloud-object-storage"
  plan              = "standard"
  location          = "global"
}

// Create a new bucket with objectlock and object versioning enabled.
resource "ibm_cos_bucket" "bucket" {
  bucket_name           = var.bucket_name
  resource_instance_id  = ibm_resource_instance.cos_instance.id
  region_location  = var.regional_loc
  storage_class          = var.standard_storage_class
  object_versioning {
    enable  = true
  }
  object_lock = true
}

// Set object lock configuration on the bucket by providing the crn of the new COS bucket.
resource ibm_cos_bucket_objectlock_configuration "objectlock" {
 bucket_crn      = ibm_cos_bucket.bucket.crn
 bucket_location = var.regional_loc
 object_lock_configuration{
   objectlockenabled = "Enabled"
   objectlockrule{
     defaultretention{
        mode = "COMPLIANCE"
        days = 6
      }
    }
  }
}

// Upload an object to the COS bucket with objectlock retention and objectlock legal-hold.
resource "ibm_cos_bucket_object" "object_object_lock" {
  bucket_crn      = ibm_cos_bucket.bucket.crn
  bucket_location = ibm_cos_bucket.bucket.region_location
  content         = "Hello World 2"
  key             = "plaintext5.txt"
  object_lock_mode              = "COMPLIANCE"
  object_lock_retain_until_date = "2023-02-15T18:00:00Z"
  object_lock_legal_hold_status = "ON"
  force_delete = true
}