Gestion des versions des objets dans IBM Cloud® Object Storage
Activez le contrôle des versions pour les compartiments IBM Cloud® Object Storage afin de conserver les versions des objets, de récupérer des données en cas de suppression accidentelle et de restaurer des versions antérieures.
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 requête GET portant sur un objet récupère la version la plus récente enregistrée. Si la version actuelle est un marqueur de suppression, IBM Cloud Object Storage 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 du contrôle de version sur un compartiment) se voient attribuer un identifiant de
version permanent. 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 aucun objet existant, mais change la manière dont les futures requêtes sont traitées par IBM Cloud Object Storage. 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.
- Une fois que vous avez 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 se voit attribuer un UUID et est enregistré en tant que version non actuelle de l'objet.
- Activez l'option Afficher les versions pour afficher les autres versions des objets et interagir avec elles.
l'option "Voir les versions" doit être activée avant que les versions individuelles ou les marqueurs de suppression ne soient visibles et sélectionnables pour la suppression.
Terminologie
Marqueur de suppression: Objet'invisible'qui permet d'accéder aux versions de l'objet supprimé.
ID de version: chaîne opaque Unicode, codée en UTF-8, URL-safe, qui indique une version unique d'un objet et des métadonnées associées, et qui est utilisée pour cibler les requêtes 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 Cloud Object Storage assure une forte cohérence pour toutes les opérations d’E/S de données, la configuration des compartiments est cohérente à terme. 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. Même si la gestion des versions semble être activée, attendez 5 minutes après l'avoir activée avant d'effectuer toute requête susceptible de créer des versions ou de 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 génère de nouveaux événements.
cloud-object-storage.bucket-versioning.createcloud-object-storage.bucket-versioning.readcloud-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 DELETE de base HEAD, GET, PUT, et qui agissent sur des objets ou créent des versions de ceux-ci comportent un champ 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 seul objet avec cinq versions précédentes, le champ object_count renvoyé par l’ API de configuration des ressources est 6, même s’il semble n’y avoir 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 Cloud Object Storage des API S3 pour la gestion des versions est identique à celle des API AWS S3 pour la gestion des versions, à quelques différences près.
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 est attribuée à la nouvelle version (actuelle).
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, stockage inaltérable (WORM)
L'implémentation IBM Cloud Object Storage du Object Storage immuables (c'est-à-dire les politiques de rétention) n'est pas autorisée dans les compartiments avec versionnage activé. Les tentatives de création d'une politique de conservation échouent, tout comme celles visant à activer la gestion des versions sur un compartiment soumis à une politique 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 ObjectHEAD ObjectDELETE ObjectGET Object ACLPUT Object ACLUpload Part CopyRestore ObjectDELETE ObjectsList Object VersionsPUT Bucket VersioningGET Bucket VersioningPUT ObjectPOST ObjectCopy ObjectComplete Multipart UploadPUT Object TaggingGET Object TaggingDELETE Object TaggingPUT Bucket LifecycleGET Bucket LifecycleDELETE 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.
Répertorier les versions des objets d'un compartiment
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 des 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 à Object Storage d'encoder en URL 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 XML 1.0 ne peut pas analyser
certains caractères, tels que ceux dont la valeur ASCII est comprise entre 0 et 10. Pour les caractères non pris en charge par XML 1.0, vous pouvez ajouter ce paramètre afin de demander à Object Storage d'encoder les clés dans la réponse.
Valeur valide: url.
key-marker: Spécifie la clé à utiliser pour commencer la liste des objets d'un compartiment.
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 jamais plus.
prefix: Utilisez ce paramètre pour sélectionner uniquement les clés commençant par le préfixe spécifié.
version-id-marker: Spécifie la version de l'objet à partir de laquelle vous souhaitez commencer la liste.
Supprimer des versions d'objets dans un panier
Un appel normal à ListObjects ou ListObjectsV2 ne renvoie pas d'identifiant de version. Pour obtenir les identifiants de version nécessaires à toute opération de suppression, vous devez utiliser ListObjectVersions:
une requête GET avec le paramètre de requête ?versions. Elle renvoie également les marqueurs de suppression et leurs identifiants de version. Sans cette étape, aucune des opérations de suppression ci-dessous n'est possible.
exemple curl :
curl -X "GET" "https://$BUCKET.s3.$REGION.cloud-object-storage.appdomain.cloud/?versions" \
-H 'Authorization: bearer $TOKEN'
Exemple d'utilisation de l'interface de ligne de commande (CLI) d' IBM Cloud:
ibmcloud cos object-versions --bucket $BUCKET
Exemple Python :
pythonresponse = cosClient.list_object_versions(Bucket=BUCKET)
for version in response.get('Versions', []):
print(version['Key'], version['VersionId'])
for marker in response.get('DeleteMarkers', []):
print(marker['Key'], marker['VersionId'], '(delete marker)')
Exemples de CLI et de SDK pour la suppression d'une version spécifique.
Exemple d'utilisation de l'interface de ligne de commande (CLI) d' IBM Cloud:
ibmcloud cos object-delete --bucket $BUCKET --key $OBJECT_KEY --version-id $VERSION_ID
Exemple Python :
pythoncosClient.delete_object(
Bucket=BUCKET,
Key='my-object.txt',
VersionId='L4kqtJlcpXroDVBH40Nr8X8gdRQBpUMLUo'
)
Node.js:
javascriptawait cos.deleteObject({
Bucket: 'my-versioning-bucket',
Key: 'my-object.txt',
VersionId: 'L4kqtJlcpXroDVBH40Nr8X8gdRQBpUMLUo'
}).promise();
La suppression des versions actuelles à l'aide de l'interface utilisateur nécessite d'abord la suppression des objets non actuels.
Suppression d'un marqueur de suppression
La suppression d'un marqueur de suppression est le processus de récupération lorsqu'un objet est accidentellement supprimé : vous obtenez l'ID de version du marqueur de suppression à partir de ListObjectVersions, puis vous le
supprimez avec cet ID de version.
Supprimer l'ID de la version nulle
Les objets pré-versionnés se voient attribuer un identifiant de version nul, et pour supprimer cette version, il faut transmettre versionId=null dans la demande.
exemple curl :
curl -X "DELETE" "https://$BUCKET.s3.$REGION.cloud-object-storage.appdomain.cloud/$OBJECT_KEY?versionId=null" \
-H 'Authorization: bearer $TOKEN'
Exemple Python :
cosClient.delete_object(
Bucket=BUCKET,
Key='my-object.txt',
VersionId='null'
)
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 plutôt ajouté à x-amz-copy-source l'en-tête.
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 SDK IBM Cloud Object Storage pour Python et Node.js, bien que la mise en œuvre du versionnage des objets doive être entièrement compatible avec toute bibliothèque ou tout outil S3-compatible permettant de définir des points de terminaison personnalisés. L'utilisation d'outils tiers nécessite des identifiants HMAC pour calculer les signatures AWSV4. 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 SDK IBM Cloud Object Storage pour Python peut s'effectuer soit à l'aide de la syntaxe de ressources de haut niveau, soit à l'aide de la syntaxe client de bas niveau.
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)
Supprimer les versions d'un objet utilisant le même client :
Les API de Python sont très souples et il existe de nombreuses façons d'accomplir la même tâche.
Node.js
Activation de la gestion des versions à l'aide du IBM Cloud Object Storage 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
});