IBM Cloud Docs
Gestion des versions d'objets

Gestion des versions d'objets

La gestion des versions permet à plusieurs révisions d'un même objet d'exister dans le même compartiment. Chaque version d'un objet peut être interrogée, lue, restaurée à partir d'un état archivé ou supprimée. L'activation de la gestion des versions sur un compartiment peut atténuer la perte de données suite à une erreur de l'utilisateur ou à une suppression par inadvertance. Lorsqu'un objet est écrasé, une nouvelle version est créée et la version précédente de l'objet est automatiquement conservée. Par conséquent, dans un compartiment activé pour la gestion des versions, les objets supprimés à la suite d'une suppression ou d'un écrasement accidentel peuvent facilement être récupérés en restaurant une version précédente de l'objet. Si un objet est supprimé, il est remplacé par un marqueur de suppression et la version précédente est sauvegardée (rien n'est définitivement supprimé). Pour supprimer définitivement des versions individuelles d'un objet, une demande de suppression doit spécifier un ID de version. Une demande GET pour un objet extrait la dernière version stockée. Si la version en cours est un marqueur de suppression, IBM COS renvoie une erreur 404 Not Found.

Une fois qu'un compartiment a activé la gestion des versions, tous les objets qu'il contient sont versionnés. Tous les nouveaux objets (créés après l'activation de la gestion des versions sur un compartiment) recevront un ID de version affecté de manière permanente. Une version de null est affectée aux objets créés avant l'activation de la gestion des versions (sur le compartiment). Lorsqu'un objet avec un ID de version null est écrasé ou supprimé, un nouvel ID de version lui est affecté. La suspension de la gestion des versions ne modifie pas les objets existants, mais modifie la manière dont les demandes futures sont traitées par IBM COS. Une fois activée, la gestion des versions peut uniquement être suspendue et pas complètement désactivée. Par conséquent, un compartiment peut avoir trois états liés à la gestion des versions: 1. Par défaut (non versionné), 2. Activé ou 3. Suspendu.

Initiation à la gestion des versions

Tout d'abord, créez un nouveau compartiment avec la gestion des versions d'objet activée.

  1. Après avoir accédé à votre instance de stockage d'objets, cliquez sur Créer un compartiment.
  2. Choisissez une région et une résilience, puis recherchez Gestion des versions d'objet et basculez le sélecteur sur Activé.

Activer le versionnage
Activer le versionnage

Créez ensuite un objet versionné.

  1. Naviguez dans votre nouveau compartiment et téléchargez un fichier en le faisant glisser dans la fenêtre du navigateur.
  2. Une fois que l'objet a été téléchargé, téléchargez un autre objet portant le même nom. Au lieu d'être écrasé, le fichier sera affecté à un identificateur unique universel et sauvegardé en tant que version non en cours de l'objet.
  3. Activez l'option Afficher les versions pour afficher les autres versions des objets et interagir avec elles.

Voir les versions
Voir les versions

Terminologie

Marqueur de suppression: Objet'invisible'qui permet d'accéder aux versions de l'objet supprimé.

ID de version: chaîne Unicode, UTF-8 codée, sécurisée par l'URL, opaque qui indique une version unique d'un objet et les métadonnées associées, et qui est utilisée pour cibler les demandes vers cette version particulière. La longueur maximale des ID de version est de 1 024 octets.

'null': ID de version spécial affecté aux objets qui existaient lorsque la gestion des versions a été activée sur un compartiment.

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

Alors qu' IBM COS offre une forte cohérence pour toutes les opérations d'E-S de données, la configuration des compartiments est finalement cohérente. Après avoir activé la gestion des versions pour la première fois sur un compartiment, la propagation de la configuration sur le système peut prendre quelques instants. Bien que la gestion des versions puisse sembler être activée, il est recommandé d'attendre 15 minutes après l'activation de la gestion des versions pour effectuer les demandes qui sont censées créer des versions ou supprimer des marqueurs.

Actions IAM

De nouvelles actions IAM sont associées à la gestion des versions.

Actions IAM associées aux versions
Action IAM Rôle
cloud-object-storage.bucket.put_versioning Responsable, Auteur
cloud-object-storage.bucket.get_versioning Gestionnaire, Rédacteur, Lecteur
cloud-object-storage.object.get_version Gestionnaire, Auteur, Lecteur, Lecteur de contenu, Lecteur d'objets
cloud-object-storage.object.head_version Gestionnaire, Auteur, Lecteur, Lecteur de contenu, Lecteur d'objets
cloud-object-storage.bucket.delete_version Responsable, Auteur
cloud-object-storage.object.get_versions Gestionnaire, Auteur, Lecteur, Lecteur de contenu, Lecteur d'objets
cloud-object-storage.object.copy_get_version Gestionnaire, Rédacteur, Lecteur
cloud-object-storage.object.copy_part_get_version Gestionnaire, Rédacteur, Lecteur
cloud-object-storage.object.restore_version Responsable, Auteur
cloud-object-storage.object.put_tagging_version Gestionnaire, Auteur, Auteur d'objets
cloud-object-storage.object.get_tagging_version Gestionnaire, Rédacteur, Lecteur
cloud-object-storage.object.delete_tagging_version Responsable, Auteur

Événements Activity Tracker

La gestion des versions va générer de nouveaux événements.

  • cloud-object-storage.bucket-versioning.create
  • cloud-object-storage.bucket-versioning.read
  • cloud-object-storage.bucket-versioning.list

Les événements de gestion des compartiments versionnés contiennent une zone requestData.versioning.state, qui indique si la gestion des versions est activée ou suspendue sur un compartiment.

Les actions de base HEAD, GET, PUT et DELETE qui agissent sur ou créent des versions d'objets incluent une zone target.versionId. La zone target.versionId est également présente lors d'un téléchargement en plusieurs parties et lors de la copie d'objets ou de parties, si une nouvelle version est créée en raison de ces actions.

Une zone responseData.deleteMarker.created est présente lorsqu'un objet est supprimé et qu'un marqueur de suppression est créé.

Utilisation et comptabilité

Toutes les versions sont mesurées comme s'il s'agissait d'objets égaux. Cela signifie que si un compartiment contient un objet unique avec cinq versions précédentes, la zone object_count renvoyée par l'API de configuration des ressources sera 6, même si elle apparaît comme s'il n'y avait qu'un seul objet dans le compartiment. De même, les versions cumulées contribuent à l'utilisation totale et sont facturables. Outre la zone object_count renvoyée par l'API de métadonnées de compartiment de lecture, le corps de réponse de l'API contient plusieurs nouvelles zones associées à la gestion des versions:

  • noncurrent_object_count: nombre de versions d'objet non en cours dans le compartiment au format int64.
  • noncurrent_bytes_used: taille totale de toutes les versions d'objet non courantes dans le compartiment au format int64.
  • delete_marker_count: nombre total de marqueurs de suppression dans le compartiment au format int64.

Comme indiqué, la gestion des versions peut uniquement être activée ou suspendue. Si, pour une raison quelconque, vous souhaitez désactiver complètement la gestion des versions, il est nécessaire de migrer le contenu du compartiment vers un nouveau compartiment pour lequel la gestion des versions n'est pas activée.

Interactions

L'implémentation IBM COS des API S3 pour la gestion des versions est identique aux API AWS S3 pour la gestion des versions, avec quelques différences.

Archivage et expiration des objets versionnés

Les configurations de cycle de vie sont autorisées dans un compartiment activé pour la version. Toutefois, contrairement à Amazon S3, les nouvelles versions sont soumises à la règle d'archivage de la même manière que les objets standard. Les objets reçoivent une date de transition lorsqu'ils sont créés et sont archivés à leur date de transition individuelle, qu'il s'agisse de versions en cours ou non. Le remplacement d'un objet n'affecte pas la date de transition de la version précédente et une date de transition sera affectée à la nouvelle version (en cours).

Il n'est pas possible d'utiliser des règles NoncurrentVersionTransition pour archiver uniquement les versions non actuelles des objets dans une configuration de cycle de vie.

Object Storage immuables (WORM)

L'implémentation IBM COS d'Immutable Object Storage (c'est-à-dire des règles de conservation) n'est pas autorisée dans les compartiments pour lesquels la gestion des versions est activée. Les tentatives de création d'une règle de conservation échoueront, de même que les tentatives d'activation de la gestion des versions sur un compartiment avec une règle de conservation.

API S3 prises en charge

L'ensemble d'API REST suivant peut interagir avec la gestion des versions d'une manière ou d'une autre:

  • GET Object
  • HEAD Object
  • DELETE Object
  • GET Object ACL
  • PUT Object ACL
  • Upload Part Copy
  • Restore Object
  • DELETE Objects
  • List Object Versions
  • PUT Bucket Versioning
  • GET Bucket Versioning
  • PUT Object
  • POST Object
  • Copy Object
  • Complete Multipart Upload
  • PUT Object Tagging
  • GET Object Tagging
  • DELETE Object Tagging
  • PUT Bucket Lifecycle
  • GET Bucket Lifecycle
  • DELETE Bucket Lifecycle

Exemples d'API REST

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

Activer la gestion des versions sur un compartiment

curl -X "PUT" "https://$BUCKET.s3.$REGION.cloud-object-storage.appdomain.cloud/?versioning" \
     -H 'Authorization: bearer $TOKEN' \
     -H 'Content-MD5: 8qj8HSeDu3APPMQZVG06WQ==' \
     -H 'Content-Type: text/plain; charset=utf-8' \
     -d $'<VersioningConfiguration>
            <Status>Enabled</Status>
          </VersioningConfiguration>'

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

Suspension de la gestion des versions sur un compartiment

curl -X "PUT" "https://$BUCKET.s3.$REGION.cloud-object-storage.appdomain.cloud/?versioning" \
     -H 'Authorization: bearer $TOKEN' \
     -H 'Content-MD5: hxXDWuCDWB72Be0LG4XniQ==' \
     -H 'Content-Type: text/plain; charset=utf-8' \
     -d $'<VersioningConfiguration>
            <Status>Suspended</Status>
          </VersioningConfiguration>'

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

Liste des versions des objets d'un panier

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

Cette commande renvoie un corps de réponse XML:

<ListVersionsResult>
   <IsTruncated>boolean</IsTruncated>
   <KeyMarker>string</KeyMarker>
   <VersionIdMarker>string</VersionIdMarker>
   <NextKeyMarker>string</NextKeyMarker>
   <NextVersionIdMarker>string</NextVersionIdMarker>
   <Version>
      <ETag>string</ETag>
      <IsLatest>boolean</IsLatest>
      <Key>string</Key>
      <LastModified>timestamp</LastModified>
      <Owner>
         <DisplayName>string</DisplayName>
         <ID>string</ID>
      </Owner>
      <Size>integer</Size>
      <StorageClass>string</StorageClass>
      <VersionId>string</VersionId>
   </Version>
   ...
   <DeleteMarker>
      <IsLatest>boolean</IsLatest>
      <Key>string</Key>
      <LastModified>timestamp</LastModified>
      <Owner>
         <DisplayName>string</DisplayName>
         <ID>string</ID>
      </Owner>
      <VersionId>string</VersionId>
   </DeleteMarker>
   ...
   <Name>string</Name>
   <Prefix>string</Prefix>
   <Delimiter>string</Delimiter>
   <MaxKeys>integer</MaxKeys>
   <CommonPrefixes>
      <Prefix>string</Prefix>
   </CommonPrefixes>
   ...
   <EncodingType>string</EncodingType>
</ListVersionsResult>

delimiter: Un délimiteur est un caractère que vous spécifiez pour regrouper les clés. Toutes les clés qui contiennent la même chaîne entre le préfixe et la première occurrence du délimiteur sont regroupées sous un seul élément de résultat dans CommonPrefixes. Ces groupes sont comptés comme un résultat par rapport à la limitation max-keys. Ces clés ne sont pas renvoyées ailleurs dans la réponse.

encoding-type: demande à COS de coder les clés d'objet dans la réponse. Les clés d'objet peuvent contenir n'importe quel caractère Unicode ; toutefois, l'analyseur syntaxique XML 1.0 ne peut pas analyser certains caractères, tels que les caractères dont la valeur ASCII est comprise entre 0 et 10. Pour les caractères qui ne sont pas pris en charge dans XML 1.0, vous pouvez ajouter ce paramètre pour demander que COS code les clés dans la réponse. Valeur valide: url.

key-marker: Spécifie la clé par laquelle commencer pour lister les objets d'un seau.

max-keys: définit le nombre maximal de clés renvoyées dans la réponse. Par défaut, l'API renvoie jusqu'à 1000 noms de clé. La réponse peut contenir moins de clés mais ne contiendra jamais plus de clés.

prefix: utilisez ce paramètre pour sélectionner uniquement les clés commençant par le préfixe spécifié.

version-id-marker: indique la version d'objet à partir de laquelle vous souhaitez commencer la liste.

Opérations sur des versions spécifiques d'objets

Plusieurs API utilisent un nouveau paramètre de requête (?versionId=<VersionId>) qui indique la version de l'objet que vous demandez. Ce paramètre est utilisé de la même manière pour la lecture, la suppression, la vérification des métadonnées et des balises et la restauration des objets archivés. Par exemple, pour lire une version d'un objet foo avec l'ID de version L4kqtJlcpXroDVBH40Nr8X8gdRQBpUMLUo, la demande peut se présenter comme suit:

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

La suppression de cet objet s'effectue de la même manière.

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

Pour les demandes qui utilisent déjà un paramètre de requête, le paramètre versionId peut être ajouté à la fin.

curl -X "GET" "https://$BUCKET.s3.$REGION.cloud-object-storage.appdomain.cloud/foo?tagging&versionId=L4kqtJlcpXroDVBH40Nr8X8gdRQBpUMLUo" \
     -H 'Authorization: bearer $TOKEN'

La copie côté serveur des versions d'objet est prise en charge, mais utilise une syntaxe légèrement différente. Le paramètre de requête n'est pas ajouté à l'URL elle-même, mais est ajouté à l'en-tête x-amz-copy-source. Cette syntaxe est identique à la création d'une partie pour une partie à plusieurs parties à partir d'un objet source.

curl -X "PUT" "https://$BUCKET.s3.$REGION.cloud-object-storage.appdomain.cloud/<new-object-key>"
 -H "Authorization: bearer $TOKEN"
 -H "x-amz-copy-source: /<source-bucket>/<object-key>?versionId=L4kqtJlcpXroDVBH40Nr8X8gdRQBpUMLUo"

Exemples d'interface CLI

Vous pouvez utiliser l'interface de ligne de commande IBM Cloud avec le plug-in cos pour activer la gestion des versions sur un compartiment.

cos bucket-versioning-put --bucket $BUCKET --versioning-configuration file://vers.json

Dans ce cas, vers.json est un document simple:

{
    "Status": "Enabled"
}

Exemples SDK

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

Python

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

Utilisation d'une ressource:

#!/usr/bin/env python3

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

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

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

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

versioning = cos.BucketVersioning(BUCKET)

versioning.enable()

La gestion des versions pour le compartiment peut ensuite être suspendue à l'aide de versioning.suspend()

A l'aide de cette même ressource cos, toutes les versions des objets peuvent être répertoriées à l'aide des éléments suivants:

versions = s3.Bucket(BUCKET).object_versions.filter(Prefix=key)

for version in versions:
    obj = version.get()
    print(obj.get('VersionId'), obj.get('ContentLength'), obj.get('LastModified'))

Utilisation d'un client:

#!/usr/bin/env python3

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

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

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

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

response = cosClient.put_bucket_versioning(
    Bucket=BUCKET,
    VersioningConfiguration={
        'Status': 'Enabled'
    }
)

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

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

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

Node.js

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

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

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

var cos = new IBM.S3(config);

var params = {
    Bucket: 'my-versioning-bucket', /* required */
    VersioningConfiguration: { /* required */
    Status: 'Enabled'
   },
};

s3.putBucketVersioning(params, function(err, data) {
   if (err) console.log(err, err.stack); // an error occurred
   else     console.log(data);           // successful response
});