Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.
Comment empêcher le remplacement d’objets par des écritures conditionnelles
Avec les écritures conditionnelles, vous pouvez ajouter un en-tête supplémentaire à vos demandes WRITE afin de spécifier les conditions préalables à une opération Amazon S3. Pour écrire des objets de manière conditionnelle, ajoutez l’en-tête HTTP If-None-Match ou If-Match.
L’en-tête If-None-Match empêche le remplacement de données existantes en validant qu’aucun objet portant le même nom de clé ne se trouve déjà dans votre compartiment.
Vous pouvez également ajouter l'If-Matchen-tête pour vérifier la balise d'entité (ETag) d'un objet avant d'écrire un objet. Avec cet en-tête, Amazon S3 compare la ETag valeur fournie avec la ETag valeur de l'objet dans S3. Si les ETag valeurs ne correspondent pas, l'opération échoue.
Les propriétaires de compartiments peuvent utiliser des stratégies de compartiment pour appliquer des écritures conditionnelles aux objets chargés. Pour de plus amples informations, veuillez consulter Application d’écritures conditionnelles sur des compartiments Amazon S3.
Note
Pour utiliser des écritures conditionnelles, vous devez effectuer les demandes via HTTPS (TLS) ou utiliser AWS Signature Version 4 afin de signer la demande.
Rubriques
Comment empêcher le remplacement d’objets en fonction des noms de clé
Vous pouvez utiliser l'en-tête If-None-Match conditionnel HTTP pour vérifier si un objet existe déjà dans le compartiment spécifié en fonction de son nom de clé avant de le créer ou de le copier dans le compartiment de destination.
Les écritures conditionnelles avec l’en-tête HTTP If-None-Match vérifient l’existence d’un objet pendant l’opération WRITE. Si un nom de clé identique est trouvé dans le compartiment, l’opération échoue. Sans l'If-None-Matchen-tête HTTP, si vous chargez ou copiez un objet portant un nom de clé identique dans un bucket non versionné ou dont la version est suspendue, l'objet est remplacé. Pour en savoir plus sur l’utilisation des noms de clé, consultez Attribution d’un nom aux objets Amazon S3.
Note
L'If-None-Matchen-tête HTTP s'applique uniquement à la version actuelle d'un objet dans un compartiment de versions.
Pour effectuer des écritures conditionnelles avec l’en-tête HTTP If-None-Match, vous devez avoir l’autorisation s3:PutObject. Cela permet à l’appelant de vérifier la présence d’objets dans le compartiment. L’en-tête If-None-Match s’attend à recevoir la valeur * (astérisque).
Vous pouvez utiliser l'If-None-Matchen-tête avec les éléments suivants APIs :
L’exemple de commande put-object suivant tente d’effectuer une écriture conditionnelle pour un objet portant le nom de clé dir-1/my_images.tar.bz2.
aws s3api put-object --bucketamzn-s3-demo-bucket--key dir-1/my_images.tar.bz2 --body my_images.tar.bz2 --if-none-match "*"
Pour plus d’informations, consultez put-object
Pour plus d'informations sur le AWS CLI, voir Qu'est-ce que le AWS Command Line Interface ? dans le guide de AWS Command Line Interface l'utilisateur.
L'copy-objectexemple de commande suivant tente de copier un objet dans un compartiment de destination avec une écriture conditionnelle pour un objet portant le nom de clédir-1/my_images.tar.bz2.
aws s3api copy-object --copy-sourceamzn-s3-demo-bucket/key --key dir-1/my_images.tar.bz2 --bucketamzn-s3-demo-bucket2--if-none-match "*"
Pour plus d’informations, consultez copy-object
Pour plus d'informations sur le AWS CLI, voir Qu'est-ce que le AWS Command Line Interface ? dans le guide de AWS Command Line Interface l'utilisateur.
L'complete-multipart-uploadexemple de commande suivant tente de terminer un téléchargement partitionné par une écriture conditionnelle pour un objet portant le nom dir-1/my_images.tar.bz2 de clé. Dans cet exemple, le préfixe file ://est utilisé pour charger la structure JSON à partir d'un fichier du dossier local nommé mpustruct which list de toutes les parties qui ont été téléchargées pour ce téléchargement partitionné spécifique.
aws s3api complete-multipart-upload --multipart-upload file://mpustruct --bucketamzn-s3-demo-bucket--key dir-1/my_images.tar.bz2 --upload-idupload-id--if-none-match "*"
Pour plus d’informations, consultez complete-multipart-upload
Pour plus d'informations sur le AWS CLI, voir Qu'est-ce que le AWS Command Line Interface ? dans le guide de AWS Command Line Interface l'utilisateur.
Comment empêcher les remplacements si l’objet a changé
Un objet ETag est une chaîne unique à l'objet qui reflète une modification du contenu de l'objet. Vous pouvez utiliser l'If-Matchen-tête pour comparer la ETag valeur d'un objet dans un compartiment Amazon S3 avec celle que vous avez fournie pendant l'WRITEopération. Si les ETag valeurs ne correspondent pas, l'opération échoue. Pour plus d'informations sur ETags, voirUtilisation du contenu MD5 et du ETag pour vérifier les objets téléchargés.
Pour effectuer des écritures conditionnelles avec un en-tête HTTP If-Match, vous devez disposer des autorisations s3:PutObject et s3:GetObject. Cela permet à l'appelant de vérifier ETag et de vérifier l'état des objets dans le compartiment. L'If-Matchen-tête attend la ETag valeur sous forme de chaîne.
Vous pouvez utiliser l'If-Matchen-tête avec les éléments suivants APIs :
L'put-objectexemple de commande suivant tente d'effectuer une écriture conditionnelle avec la ETag valeur fournie6805f2cfc46c0f04559748bb039d69ae.
aws s3api put-object --bucketamzn-s3-demo-bucket--key dir-1/my_images.tar.bz2 --body my_images.tar.bz2 --if-match "6805f2cfc46c0f04559748bb039d69ae"
Pour plus d’informations, consultez put-object
Pour plus d'informations sur le AWS CLI, voir Qu'est-ce que le AWS Command Line Interface ? dans le guide de AWS Command Line Interface l'utilisateur.
L'copy-objectexemple de commande suivant tente d'effectuer une écriture conditionnelle avec la ETag valeur fournie6805f2cfc46c0f04559748bb039d69ae.
aws s3api copy-object --copy-sourceamzn-s3-demo-bucket/key --key dir-1/my_images.tar.bz2 --bucketamzn-s3-demo-bucket2--if-match "6805f2cfc46c0f04559748bb039d69ae"
Pour plus d’informations, consultez copy-object
Pour plus d'informations sur le AWS CLI, voir Qu'est-ce que le AWS Command Line Interface ? dans le guide de AWS Command Line Interface l'utilisateur.
L'complete-multipart-uploadexemple de commande suivant tente de terminer un téléchargement partitionné avec une écriture conditionnelle à l'aide de la ETag valeur 6805f2cfc46c0f04559748bb039d69ae fournie. Dans cet exemple, le préfixe file ://est utilisé pour charger la structure JSON à partir d'un fichier du dossier local nommé mpustruct which list de toutes les parties qui ont été téléchargées pour ce téléchargement partitionné spécifique.
aws s3api complete-multipart-upload --multipart-upload file://mpustruct --bucketamzn-s3-demo-bucket--key dir-1/my_images.tar.bz2 --upload-idupload-id--if-match "6805f2cfc46c0f04559748bb039d69ae"
Pour plus d’informations, consultez complete-multipart-upload
Pour plus d'informations sur le AWS CLI, voir Qu'est-ce que le AWS Command Line Interface ? dans le guide de AWS Command Line Interface l'utilisateur.
Comportement des écritures conditionnelles
- Ecritures ou copies conditionnelles avec en-tête
If-None-Match -
Les écritures conditionnelles avec l’en-tête
If-None-Matchsont évaluées par rapport aux objets existants dans un compartiment. S’il n’existe aucun objet portant le même nom de clé dans le compartiment, l’opération d’écriture réussit, ce qui entraîne une réponse200 OK. S’il existe un objet, l’opération d’écriture échoue, ce qui entraîne une réponse412 Precondition Failed.Pour les compartiments pour lesquels la gestion des versions est activée, s’il n’existe aucune version d’objet portant le même nom, ou si la version actuelle de l’objet est un marqueur de suppression, l’opération d’écriture réussit. Dans le cas contraire, l’opération d’écriture échoue avec une réponse
412 Precondition Failed.Si plusieurs écritures ou copies conditionnelles ont lieu pour le même nom d'objet, la première opération d'écriture terminée aboutit. Amazon S3 abandonne alors les écritures suivantes avec une réponse
412 Precondition Failed.Vous pouvez également recevoir une réponse
409 Conflicten cas de demandes simultanées si une demande de suppression d’un objet aboutit avant la fin d’une opération d’écriture conditionnelle sur cet objet. Lorsque vous utilisez des écritures conditionnelles avecPutObject, les chargements peuvent faire l’objet d’une nouvelle tentative après réception d’une erreur409 Conflict. Lors de l’utilisation deCompleteMultipartUpload, le chargement partitionné complet doit être relancé avecCreateMultipartUploadpour charger à nouveau l’objet après réception d’une erreur409 Conflict. - Ecritures ou copies conditionnelles avec
If-Matchen-tête -
L’en-tête
If-Matchest évalué par rapport aux objets existants dans un compartiment. S'il existe un objet portant le même nom de clé et correspondant ETag, l'opération d'écriture réussit, ce qui entraîne une200 OKréponse. Si ce ETag n'est pas le cas, l'opération d'écriture échoue avec une412 Precondition Failedréponse.Vous pouvez également recevoir une réponse
409 Conflicten cas de demandes simultanées.Vous recevrez une réponse
404 Not Foundsi une demande de suppression simultanée d’un objet aboutit avant la fin d’une opération d’écriture conditionnelle sur cet objet, car la clé de l’objet n’existe plus. Lorsque vous recevez une réponse404 Not Found, vous devez charger à nouveau l’objet.S’il n’existe aucune version d’objet portant le même nom, ou si la version actuelle de l’objet est un marqueur de suppression, l’opération échoue avec une erreur
404 Not Found.
Scénarios d’écritures conditionnelles
Examinez les scénarios suivants dans lesquels deux clients exécutent des opérations sur le même compartiment.
Écritures conditionnelles lors des chargements partitionnés
Les écritures conditionnelles ne prennent pas en compte les demandes de chargement partitionné en cours, car il ne s’agit pas encore d’objets entièrement écrits. Prenons l’exemple suivant où le client 1 charge un objet à l’aide du chargement partitionné. Pendant le chargement partitionné, le client 2 est en mesure d’écrire avec succès ce même objet grâce à l’opération d’écriture conditionnelle. Par la suite, lorsque le client 1 essaie de finaliser le chargement partitionné à l’aide d’une écriture conditionnelle, le chargement échoue.
Note
Ce scénario entraîne une réponse 412 Precondition Failed à la fois pour les en-têtes en-têtes If-None-Match et If-Match.
Suppressions simultanées lors de chargements partitionnés
Si une demande de suppression aboutit avant qu’une demande d’écriture conditionnelle ne se termine, Amazon S3 renvoie une réponse 409 Conflict ou 404 Not Found pour l’opération d’écriture. Cela est dû au fait que la demande de suppression initiée précédemment a priorité sur l’opération d’écriture conditionnelle. Dans ce cas, vous devrez lancer un nouveau chargement partitionné.
Note
Ce scénario génère une réponse 409 Conflict pour un en-tête If-None-Match et une réponse 404 Not Found pour un en-tête If-Match.
Note
Pour réduire vos coûts de stockage, nous vous recommandons de configurer une règle du cycle de vie pour supprimer les chargements partitionnés incomplets après un certain nombre de jours à l’aide de l’action AbortIncompleteMultipartUpload. Pour plus d’informations sur la création d’une règle de cycle de vie pour supprimer les chargements partitionnés incomplets, consultez Configuration d’une politique de cycle de vie de compartiment pour abandonner les chargements multiparties incomplets.