Vue d’ensemble
La gestion des versions (ou versioning en anglais) permet d’enregistrer plusieurs variantes d’un objet dans un compartiment (ou bucket en anglais).
Les variantes – aussi appellées versions – sont identifiées par un unique identifiant de version (ou version id en anglais) dans la metadata de l’objet VersionId
.
Chaque action PUT ajoute une nouvelle version qui devient courante (cad. qu’un GET va obtenir cette version).
La version précédemment courante devient non courante et les autres versions restent inchangées.
Une action DELETE ajoute un marqueur d’effacement (delete marker en anglais) qui devient courant (cad. qu’un GET va donner une erreur « NoSuchKey » ou « Not Found »).
Un delete marker ne contient pas de donnée.
La version courante de l’objet, qu’elle soit de la donnée ou un delete marker, est identifiée par la metadata booléenne IsLatest
à « true ».
Les versions d’objet ne sont jamais effacées à moins de spécifier la version id .
Si un marqueur d’effacement est courant alors un GET (sans version id) va résulter en erreur NoSuchKey
.
Si une version d’objet est courante alors un GET va télécharger cette version.
Cas d’usage typique: récupérer d’un effacement accidentel ou d’un écrasement (actions utilisateur ou échec applicatif).
Cas d’usage avec AWS CLI
AWS CLI (Command Line Interface) est un outil à code source libre permettant de configurer et d’utiliser le stockage objet en passant des commandes dans un interface textuelle (un shell Linux ou la ligne de commande Windows).
Un guide utilisateur de l’outil est disponible sur https://docs.aws.amazon.com/cli/latest/userguide/ .
Prérequis : activer la gestion des versions
La gestion des versions peut-être activée au niveau compartiment (bucket).
root@mytest ~]# aws --endpoint-url https://s3-region01.cloudavenue.orange-business.com s3api put-bucket-versioning --bucket mydemobucket --versioning-configuration Status=Enabled
Consulter l’état de la gestion des versions
Etat activé :
[root@mytest ~]# aws --endpoint-url https://s3-region01.cloudavenue.orange-business.com s3api get-bucket-versioning --bucket mydemobucket { "Status": "Enabled" }
Etat suspendu (arpès avoir été activé) :
[root@mytest ~]# aws --endpoint-url https://s3-region01.cloudavenue.orange-business.com s3api get-bucket-versioning --bucket mydemobucket { "Status": "Suspended" }
Par défaut (la gestion des versions n’est pas activée), la requête produit un résultat vide:
[root@mytest ~]# aws --endpoint-url https://s3-region01.cloudavenue.orange-business.com s3api get-bucket-versioning --bucket mydemobucket
Lister version d’objet et marqueur d’effacement
Ci-dessous, un exemple de liste de versions (et delete markers) après les actions suivantes (dans un nouveau bucket avec la gestion des versions activée):
PUT object1 (taille 102400 bytes)
DELETE object1
PUT object1 (taille 1048576 bytes)
Ce qui s’est passé:
Le PUT initial a créé une version d’object qui n’est plus courante ("IsLatest": false
) à cause de l’action 2.
Le DELETE a créé un marqueur d’effacement qui n’est plus courant à cause de l’action 3.
Le dernier PUT a créé une version qui est courante ("IsLatest": true
).
Si vous faites un GET object1, vous allez obtenir un objet de 1048576 octets.
Notez que la liste (format JSON) contient 2 tableaux: un pour les versions et l’autre pour les marqueurs d’effacement.
[root@mytest ~]# aws --endpoint-url https://s3-region01.cloudavenue.orange-business.com s3api list-object-versions --bucket mydemobucket { "Versions": [ { "ETag": "\"2bd0a7886355c628b78b0052673d7789\"", "Size": 1048576, "StorageClass": "STANDARD", "Key": "object1", "VersionId": "3938333335303336323031393630393939393939524730303120203232382e3832373832333033332e3236", "IsLatest": true, "LastModified": "2022-10-05T09:56:38.038000+00:00", "Owner": { "DisplayName": "QUALIF_LXLEGUEN", "ID": "44f9cfd39fe76487c5213ec20c4f6a5545ef9e52d1cbe4ca0e38f87b9d2acdea" } }, { "ETag": "\"acd8a242d5b76bf7716fe4e7018864c1\"", "Size": 102400, "StorageClass": "STANDARD", "Key": "object1", "VersionId": "3938333335303336323839313537393939393939524730303120203232382e3832373832303835342e3234", "IsLatest": false, "LastModified": "2022-10-05T09:55:10.841000+00:00", "Owner": { "DisplayName": "QUALIF_LXLEGUEN", "ID": "44f9cfd39fe76487c5213ec20c4f6a5545ef9e52d1cbe4ca0e38f87b9d2acdea" } } ], "DeleteMarkers": [ { "Owner": { "DisplayName": "QUALIF_LXLEGUEN", "ID": "44f9cfd39fe76487c5213ec20c4f6a5545ef9e52d1cbe4ca0e38f87b9d2acdea" }, "Key": "object1", "VersionId": "3938333335303336323336323436393939393939524730303120203232382e3832373832323131332e3235", "IsLatest": false, "LastModified": "2022-10-05T09:56:03.753000+00:00" } ] }
Annuler des actions passées en utilisant DELETE avec identifiant de version
En effaçant soit une version soit un marqueur d’effacement avec un identifiant de version, il est possible de remonter dans le temps (annuler les actions passées).
En partant de l’exemple précédent (ci-dessus), retournons à l’état initial en 2 étapes:
annulez le 2nd PUT en effaçant une version (le marqueur d’effacement devient courant)
# aws --endpoint-url https://s3-region01.cloudavenue.orange-business.com s3api delete-object --bucket mydemobucket --key object1 --version-id 3938333335303336323031393630393939393939524730303120203232382e3832373832333033332e3236 { "VersionId": "3938333335303336323031393630393939393939524730303120203232382e3832373832333033332e3236" } [root@mytest ~]# aws --endpoint-url https://s3-region01.cloudavenue.orange-business.com s3api list-object-versions --bucket mydemobucket { "Versions": [ { "ETag": "\"acd8a242d5b76bf7716fe4e7018864c1\"", "Size": 102400, "StorageClass": "STANDARD", "Key": "object1", "VersionId": "3938333335303336323839313537393939393939524730303120203232382e3832373832303835342e3234", "IsLatest": false, "LastModified": "2022-10-05T09:55:10.841000+00:00", "Owner": { "DisplayName": "QUALIF_LXLEGUEN", "ID": "44f9cfd39fe76487c5213ec20c4f6a5545ef9e52d1cbe4ca0e38f87b9d2acdea" } } ], "DeleteMarkers": [ { "Owner": { "DisplayName": "QUALIF_LXLEGUEN", "ID": "44f9cfd39fe76487c5213ec20c4f6a5545ef9e52d1cbe4ca0e38f87b9d2acdea" }, "Key": "object1", "VersionId": "3938333335303336323336323436393939393939524730303120203232382e3832373832323131332e3235", "IsLatest": true, "LastModified": "2022-10-05T09:56:03.753000+00:00" } ] } [root@mytest ~]# aws --endpoint-url https://s3-region01.cloudavenue.orange-business.com s3api list-object-versions --bucket mydemobucket An error occurred (404) when calling the HeadObject operation: Not Found
2. annulez le DELETE en effacant le marqueur d’effacement (la version d’objet initiale devient courante)
[root@mytest ~]# aws --endpoint-url https://s3-region01.cloudavenue.orange-business.com s3api delete-object --bucket mydemobucket --key object1 --version-id 3938333335303336323336323436393939393939524730303120203232382e3832373832323131332e3235 { "DeleteMarker": true, "VersionId": "3938333335303336323336323436393939393939524730303120203232382e3832373832323131332e3235" } [root@mytest ~]# aws --endpoint-url https://s3-region01.cloudavenue.orange-business.com s3api list-object-versions --bucket mydemobucket { "Versions": [ { "ETag": "\"acd8a242d5b76bf7716fe4e7018864c1\"", "Size": 102400, "StorageClass": "STANDARD", "Key": "object1", "VersionId": "3938333335303336323839313537393939393939524730303120203232382e3832373832303835342e3234", "IsLatest": true, "LastModified": "2022-10-05T09:55:10.841000+00:00", "Owner": { "DisplayName": "QUALIF_LXLEGUEN", "ID": "44f9cfd39fe76487c5213ec20c4f6a5545ef9e52d1cbe4ca0e38f87b9d2acdea" } } ] } [root@mytest ~]# aws --endpoint-url https://s3-region01.cloudavenue.orange-business.com s3api head-object --bucket mydemobucket --key object1 { "AcceptRanges": "bytes", "LastModified": "2022-10-05T09:55:10+00:00", "ContentLength": 102400, "ETag": "\"acd8a242d5b76bf7716fe4e7018864c1\"", "VersionId": "3938333335303336323839313537393939393939524730303120203232382e3832373832303835342e3234", "Metadata": {} }
Suspendre la gestion des versions
[root@mytest ~]# aws --endpoint-url https://s3-region01.cloudavenue.orange-business.com s3api put-bucket-versioning --bucket mydemobucket --versioning-configuration Status=Suspended
Toutes les versions d’objet et marqueurs d’effacement existants sont conservés.
A partir du moment ou la gestion des versions est suspendu, l’identifiant de version sera toujours null
.
PUT ajoute une nouvelle version d’objet avec version id null
.
L’objet est remplacé s’il existe avec version id null
.
[root@mytest ~]# aws --endpoint-url https://s3-region01.cloudavenue.orange-business.com s3api put-object --bucket mydemobucket --key object1 --body ./1mb_file.random { "ETag": "\"2bd0a7886355c628b78b0052673d7789\"" } [root@mytest ~]# aws --endpoint-url https://s3-region01.cloudavenue.orange-business.com s3api list-object-versions --bucket mydemobucket { "Versions": [ { "ETag": "\"2bd0a7886355c628b78b0052673d7789\"", "Size": 1048576, "StorageClass": "STANDARD", "Key": "object1", "VersionId": "null", "IsLatest": true, "LastModified": "2022-10-10T09:46:00.244000+00:00", "Owner": { "DisplayName": "QUALIF_LXLEGUEN", "ID": "44f9cfd39fe76487c5213ec20c4f6a5545ef9e52d1cbe4ca0e38f87b9d2acdea" } }, { "ETag": "\"acd8a242d5b76bf7716fe4e7018864c1\"", "Size": 102400, "StorageClass": "STANDARD", "Key": "object1", "VersionId": "3938333335303336323839313537393939393939524730303120203232382e3832373832303835342e3234", "IsLatest": false, "LastModified": "2022-10-05T09:55:10.841000+00:00", "Owner": { "DisplayName": "QUALIF_LXLEGUEN", "ID": "44f9cfd39fe76487c5213ec20c4f6a5545ef9e52d1cbe4ca0e38f87b9d2acdea" } } ] }
DELETE ajoute un nouveau marqueur d’effacement avec version id null
.
La version courante de l’objet avec version id null est effacée.
[root@mytest ~]# aws --endpoint-url https://s3-region01.cloudavenue.orange-business.com s3api delete-object --bucket mydemobucket --key object1 { "DeleteMarker": true, "VersionId": "null" } [root@mytest ~]# aws --endpoint-url https://s3-region01.cloudavenue.orange-business.com s3api list-object-versions --bucket mydemobucket { "Versions": [ { "ETag": "\"acd8a242d5b76bf7716fe4e7018864c1\"", "Size": 102400, "StorageClass": "STANDARD", "Key": "object1", "VersionId": "3938333335303336323839313537393939393939524730303120203232382e3832373832303835342e3234", "IsLatest": false, "LastModified": "2022-10-05T09:55:10.841000+00:00", "Owner": { "DisplayName": "QUALIF_LXLEGUEN", "ID": "44f9cfd39fe76487c5213ec20c4f6a5545ef9e52d1cbe4ca0e38f87b9d2acdea" } } ], "DeleteMarkers": [ { "Owner": { "DisplayName": "QUALIF_LXLEGUEN", "ID": "44f9cfd39fe76487c5213ec20c4f6a5545ef9e52d1cbe4ca0e38f87b9d2acdea" }, "Key": "object1", "VersionId": "null", "IsLatest": true, "LastModified": "2022-10-10T09:46:54.579000+00:00" } ] }
Quand un objet est effacé, un PUT (du même objet) efface automatiquement le marqueur d’effacement.
[root@mytest ~]# aws --endpoint-url https://s3-region01.cloudavenue.orange-business.com s3api put-object --bucket mydemobucket --key object1 --body ./64mb_file.random { "ETag": "\"ee15117947eab82ac3c3210a94392056\"" } [root@mytest ~]# aws --endpoint-url https://s3-region01.cloudavenue.orange-business.com s3api list-object-versions --bucket mydemobucket { "Versions": [ { "ETag": "\"ee15117947eab82ac3c3210a94392056\"", "Size": 67108864, "StorageClass": "STANDARD", "Key": "object1", "VersionId": "null", "IsLatest": true, "LastModified": "2022-10-10T09:48:39.779000+00:00", "Owner": { "DisplayName": "QUALIF_LXLEGUEN", "ID": "44f9cfd39fe76487c5213ec20c4f6a5545ef9e52d1cbe4ca0e38f87b9d2acdea" } }, { "ETag": "\"acd8a242d5b76bf7716fe4e7018864c1\"", "Size": 102400, "StorageClass": "STANDARD", "Key": "object1", "VersionId": "3938333335303336323839313537393939393939524730303120203232382e3832373832303835342e3234", "IsLatest": false, "LastModified": "2022-10-05T09:55:10.841000+00:00", "Owner": { "DisplayName": "QUALIF_LXLEGUEN", "ID": "44f9cfd39fe76487c5213ec20c4f6a5545ef9e52d1cbe4ca0e38f87b9d2acdea" } } ] }
Bonnes pratiques
A propos de sécurité
N’utilisez jamais une Access Key root
Avec une AK root, vous pouvez désactiver le versioning et effacer les versions d’objet (y compris les delete markers).
Réduisez les permissions
Pour un usage normal (PUT d’objets dans un bucket), vous devriez appliquer une policy supprimant (deny) les permissions suivantes:
s3:PutBucketVersioning (pour empêcher la modification du versioning)
s3:DeleteObjectVersion (pour empêcher l’effacement des version d’objet et de delete marker)
s3:PutLifeCycleConfiguration (pour empêcher l’effacement par une configuration lifecycle)
Gestion de l’usage
Quand la gestion des version est activée sur un bucket, il est hautement recommandé de configurer un cycle de vie (lifecycle).
C’est une façon simple de garder le contrôle de votre consommation de stockage.
Une configuration de cycle de vie pour un bucket permet d’expirer (effacer) automatiquement:
les versions d’objet non courantes
les delete markers obsolètes (un delete marker avec zéro versions d’objet non courantes, inutile car plus aucune data)
les versions courantes d’objet
Veuillez consulter la page de documentation sur le cycle de vie.