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.
- Après avoir accédé à votre instance de stockage d'objets, cliquez sur Créer un compartiment.
- Choisissez une région et une résilience, puis recherchez Gestion des versions d'objet et basculez le sélecteur sur Activé.

Créez ensuite un objet versionné.
- Naviguez dans votre nouveau compartiment et téléchargez un fichier en le faisant glisser dans la fenêtre du navigateur.
- 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.
- Activez l'option Afficher les versions pour afficher les autres versions des objets et interagir avec elles.

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.
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 formatint64
.noncurrent_bytes_used
: taille totale de toutes les versions d'objet non courantes dans le compartiment au formatint64
.delete_marker_count
: nombre total de marqueurs de suppression dans le compartiment au formatint64
.
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
});