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.
Rétention légale
Une conservation légale est similaire à une durée de conservation dans la mesure où elle empêche l'écrasement ou la suppression d'une version d'objet. Cependant, les mises en attente légales sont plus flexibles et n'ont pas de composant
temporel défini. Au lieu de cela, ils restent en vigueur jusqu'à ce qu'ils soient supprimés. Les mises en attente légales peuvent être librement placées et supprimées par tout utilisateur disposant des actions cloud-object-storage.object.put_object_lock_legal_hold et cloud-object-storage.object.put_object_lock_legal_hold_version.
Les retenues légales ont l'avantage supplémentaire d'agir comme méthode d'application de la rétention à durée indéterminée sur un objet.
Les retenues légales et les périodes de conservation fonctionnent de manière indépendante. Les retenues légales n'ont aucune incidence sur les périodes de conservation, et vice-versa.
Imaginez un objet avec un verrou légal et une période de conservation. A la fin de la période de conservation, la version de l'objet reste protégée jusqu'à ce que la mise en attente légale soit supprimée. Si vous supprimez une mise en attente légale alors qu'une version d'objet est soumise à une période de conservation, elle reste protégée jusqu'à ce que la période de conservation soit terminée.
Les objets verrouillés et stockés avec une période de conservation ne peuvent pas être supprimés tant que la période de conservation n'est pas arrivée à expiration et que la mise en attente légale associée n'est pas supprimée. 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.
Premiers pas avec Object Lock
Pour commencer, il existe quelques prérequis:
- Vous aurez besoin du rôle de plateforme
WriterouManagersur un compartiment, ou d'un rôle personnalisé avec les actions appropriées (telles quecloud-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
- Accédez à l'instance Object Storage de votre choix et utilisez Create Bucket avec Customize your bucket option
- Entrez les détails de configuration de compartiment requis en fonction de vos exigences de cas d'utilisation
- Accédez à la section Object Versioning et définissez-la sur Enabled.
- Recherchez Immutabilitéet, sous Verrouillage d'objet, cliquez sur Ajouter.
- Définir le verrouillage d'objet sur Activé
- Vous pouvez éventuellement définir une durée de conservation par défaut.
- Cliquez sur Enregistrer
- 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:
- Accédez à la section Configuration de votre compartiment
- Cliquez sur Object Versioning
- Dans la section Object Versioning , cliquez sur Edit, définissez l'option de configuration sur Enabled et sur Save.
- Accédez à la section Verrouillage d'objet et cliquez sur Ajouter.
- Définissez Object Lock sur Enabled
- Vous pouvez éventuellement définir une durée de conservation par défaut.
- Cliquez sur « Enregistrer »
Ajout d'une date de fin de conservation ou d'une retenue légale à un objet
- Accédez au compartiment avec l'objet cible
- Activer / désactiver Afficher les versions
- Accéder aux détails de la version cible
- 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.
| 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.createcloud-object-storage.bucket-object-lock.readcloud-object-storage.object-object-lock-legal-hold.createcloud-object-storage.object-object-lock-legal-hold.readcloud-object-storage.object-object-lock-retention.createcloud-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 | 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ê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ê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
}