Comment empêcher le remplacement d'objets par des écritures conditionnelles - Amazon Simple Storage Service

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 à votre demande d'écriture afin de spécifier les conditions préalables à votre opération S3. Cela peut empêcher 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. Les écritures conditionnelles fonctionnent pour les API demandes adressées à des compartiments à usage général et à des compartiments de répertoire.

Lorsque vous chargez un objet sur Amazon S3, vous spécifiez le nom de la clé. Le nom de clé est un identifiant unique, distinguant majuscules et minuscules, d'un objet dans un compartiment. Si vous chargez un objet avec un nom de clé identique dans un bucket non versionné ou suspendu, l'objet est remplacé. Dans un bucket versionné, l'objet le plus récemment chargé deviendra la version actuelle de l'objet.

Les écritures conditionnelles vérifieront l'existence d'un objet pendant l'WRITEopération. Si un nom de clé identique est trouvé dans le compartiment, l'WRITEopération échouera. Avec les écritures conditionnelles, plusieurs clients peuvent écrire dans le même compartiment sans avoir à remplacer les objets existants.

Pour effectuer des écritures conditionnelles, vous devez avoir l's3:PutObjectautorisation. Cette autorisation permet à l'appelant de vérifier la présence d'objets dans le compartiment. Vous pouvez utiliser des écritures conditionnelles présignées URLs avec le AWS SDKs.

Note

Pour utiliser les écritures conditionnelles, vous devez effectuer les demandes via HTTPS (TLS) ou utiliser AWS Signature Version 4 pour signer la demande.

Soutenu APIs

Les S3 suivants APIs prennent en charge l'utilisation d'écritures conditionnelles :

Vous pouvez utiliser les en-têtes suivants pour écrire un objet en fonction du nom de la clé de l'objet. Pour plus d'informations sur les noms de clés d'objets, voir,Dénomination des objets Amazon S3.

PutObject

  • If-None-Match— Téléchargez l'objet uniquement si aucun objet portant le même nom de clé n'existe déjà dans le compartiment spécifié. Vous devez utiliser la valeur * (astérisque) avec ce paramètre.

L'put-objectexemple de commande suivant montre comment vous pouvez utiliser le AWS CLI pour télécharger un objet avec un en-tête d'écriture conditionnel à l'aide du if-none-match paramètre.

aws s3api put-object --bucket amzn-s3-demo-bucket --key dir-1/my_images.tar.bz2 --body my_images.tar.bz2 --if-none-match "*"

Pour plus d’informations, consultez .put-objectdans la référence de AWS CLI commande.

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.

Pour plus d'informations sur ces en-têtes, voir PutObjectdans le Amazon Simple Storage Service API Reference.

CompleteMultipartUpload

  • If-None-Match— Terminez le téléchargement uniquement si aucun objet portant le même nom de clé n'existe déjà dans le compartiment spécifié. Vous devez utiliser la valeur * (astérisque) avec ce paramètre.

L'complete-multipart-uploadexemple de commande suivant montre comment vous pouvez utiliser le AWS CLI pour terminer un téléchargement en plusieurs parties avec un en-tête d'écriture conditionnel à l'aide du if-none-match paramètre.

aws s3api complete-multipart-upload --multipart-upload file://mpustruct --bucket amzn-s3-demo-bucket --key dir-1/my_images.tar.bz2 --upload-id uploadID --if-none-match "*"

Pour plus d’informations, consultez .complete-multipart-uploaddans la référence de AWS CLI commande.

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.

Pour plus d'informations sur ces en-têtes, voir CompleteMultipartUploaddans le Amazon Simple Storage Service API Reference.

Comportement d'écriture conditionnel

Les écritures conditionnelles sont é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 200 réponse. S'il existe un objet, l'opération d'écriture échoue, ce qui entraîne une 412 Precondition Failed réponse. Pour les buckets dont le versionnement est activé, S3 vérifie la présence d'une version d'objet actuelle portant le même nom dans le cadre de l'évaluation conditionnelle. 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, cela entraîne l'échec de l'opération d'écriture avec une 412 Precondition Failed réponse.

Si plusieurs écritures conditionnelles ont lieu pour le même nom d'objet, la première opération d'écriture terminée aboutira. Amazon S3 échouera alors aux écritures suivantes avec une 412 Precondition Failed réponse.

Vous pouvez également recevoir une 409 Conflict réponse en 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. Cela est dû au fait que la demande de suppression a priorité sur l'opération d'écriture conditionnelle initiée précédemment. Lorsque vous utilisez des écritures conditionnelles avecPutObject, les téléchargements peuvent être réessayés après réception d'une 409 erreur. Lors de l'utilisationCompleteMultipartUpload, le téléchargement partitionné doit être relancé afin de CreateMultipartUpload télécharger à nouveau l'objet après réception d'une 409 erreur.

Envisagez les scénarios suivants dans lesquels deux clients exécutent des opérations sur le même compartiment.

4.1.2 Condition préalable : échec de la réponse

Les écritures conditionnelles ne prennent pas en compte les demandes de téléchargement partitionné en cours, car il ne s'agit pas encore d'objets entièrement écrits. Prenons l'exemple suivant où le client 1 télécharge un objet à l'aide du téléchargement partitionné. Pendant le téléchargement partitionné, le client 2 est capable d'écrire avec succès le même objet grâce à l'opération d'écriture conditionnelle. Par la suite, lorsque le client 1 essaie de terminer le téléchargement partitionné à l'aide d'une écriture conditionnelle, le téléchargement échoue car l'objet existe déjà.

Exemple de deux clients écrivant des éléments avec le même nom de clé. L'un avec UploadPart pourMPU, l'autre avec PutObject une écriture conditionnelle. L' CompleteMultipartUpload opération, qui démarre après, échoue.
409 Réponse aux conflits

Si une demande de suppression aboutit avant qu'une demande d'écriture conditionnelle ne puisse être terminée, Amazon S3 renvoie une 409 Conflict réponse 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. Prenons l'exemple suivant où un fichier puppy.txt existe dans un compartiment. Le client 1 lance un téléchargement partitionné pour un autre fichier également nommé dans le puppy.txt but de terminer le téléchargement partitionné par une écriture conditionnelle. Pendant le téléchargement, le client 2 supprime puppy.txt du compartiment. Lorsque le client 1 CompleteMultipartUpload essaie de télécharger son propre puppy.txt fichier avec une écriture conditionnelle, il échoue avec une 409 Conflict réponse. Dans ce cas, vous devez lancer un nouveau téléchargement partitionné.

Exemple de deux clients, l'un utilisant le téléchargement partitionné et l'autre envoyant une demande de suppression après le MPU début du téléchargement. La demande de suppression se termine avant le début de l'écriture conditionnelle.
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.