Come prevenire la sovrascrittura degli oggetti con scritture condizionali - Amazon Simple Storage Service

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Come prevenire la sovrascrittura degli oggetti con scritture condizionali

Con le scritture condizionali, puoi aggiungere un'intestazione aggiuntiva alla tua richiesta di scrittura per specificare i presupposti per il funzionamento di S3. Questo può impedire la sovrascrittura dei dati esistenti convalidando che nel bucket non vi siano già oggetti con lo stesso nome di chiave. Le scritture condizionali funzionano API su richiesta in bucket generici e bucket di directory.

Quando carichi un oggetto su Amazon S3, specifichi il nome della chiave. Il nome della chiave è un identificatore univoco, con distinzione tra maiuscole e minuscole, di un oggetto in un bucket. Se carichi un oggetto con un nome chiave identico in un bucket senza versione o con versione sospesa, l'oggetto viene sovrascritto. In un bucket con versioni, l'oggetto caricato più di recente diventerà la versione corrente dell'oggetto.

Le scritture condizionali verificheranno l'esistenza di un oggetto durante l'operazione. WRITE Se nel bucket viene trovato un nome di chiave identico, l'WRITEoperazione avrà esito negativo. Con le scritture condizionali, è possibile avere più client che scrivono nello stesso bucket senza la possibilità di sovrascrivere gli oggetti esistenti.

Per eseguire scritture condizionali è necessario disporre dell'autorizzazione. s3:PutObject Questa autorizzazione consente al chiamante di verificare la presenza di oggetti nel bucket. È possibile utilizzare scritture condizionali con URLs presigned con. AWS SDKs

Nota

Per utilizzare le scritture condizionali, è necessario effettuare le richieste su HTTPS (TLS) o utilizzare AWS Signature Version 4 per firmare la richiesta.

Supportato APIs

Il seguente APIs supporto per S3 utilizza scritture condizionali:

È possibile utilizzare le seguenti intestazioni per scrivere un oggetto in base al nome della chiave dell'oggetto. Per informazioni sui nomi delle chiavi degli oggetti, vedete,Denominazione degli oggetti Amazon S3.

PutObject

  • If-None-Match— Carica l'oggetto solo se nel bucket specificato non esiste già alcun oggetto esistente con lo stesso nome di chiave. È necessario utilizzare il valore* (asterisco) con questo parametro.

Il comando di put-object esempio seguente mostra come è possibile utilizzare AWS CLI per caricare un oggetto con un'intestazione di scrittura condizionale utilizzando il if-none-match parametro.

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

Per ulteriori informazioni, consulta put-objectnel AWS CLI Command Reference.

Per informazioni su AWS CLI, consulta What is the AWS Command Line Interface? nella Guida AWS Command Line Interface per l'utente.

Per ulteriori informazioni su queste intestazioni, vedere PutObjectnell'Amazon Simple Storage Service API Reference.

CompleteMultipartUpload

  • If-None-Match— Completa il caricamento solo se nel bucket specificato non esiste già alcun oggetto esistente con lo stesso nome chiave. È necessario utilizzare il valore* (asterisco) con questo parametro.

Il comando di complete-multipart-upload esempio seguente mostra come utilizzare il AWS CLI per completare un caricamento in più parti con un'intestazione di scrittura condizionale utilizzando il parametro. if-none-match

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 "*"

Per ulteriori informazioni, consulta complete-multipart-uploadnel Command Reference.AWS CLI

Per informazioni su AWS CLI, consulta What is the AWS Command Line Interface? nella Guida AWS Command Line Interface per l'utente.

Per ulteriori informazioni su queste intestazioni, vedere CompleteMultipartUploadnell'Amazon Simple Storage Service API Reference.

Comportamento di scrittura condizionale

Le scritture condizionali vengono valutate in base agli oggetti esistenti in un bucket. Se nel bucket non è presente alcun oggetto esistente con lo stesso nome di chiave, l'operazione di scrittura ha esito positivo e viene generata una risposta. 200 Se esiste un oggetto esistente, l'operazione di scrittura ha esito negativo e viene generata una 412 Precondition Failed risposta. Per i bucket con il controllo delle versioni abilitato, S3 verifica la presenza di una versione corrente dell'oggetto con lo stesso nome nell'ambito della valutazione condizionale. Se non esiste una versione corrente dell'oggetto con lo stesso nome o se la versione dell'oggetto corrente è un marker di eliminazione, l'operazione di scrittura ha esito positivo. In caso contrario, l'operazione di scrittura non è riuscita con una 412 Precondition Failed risposta.

Se vengono eseguite più scritture condizionali per lo stesso nome di oggetto, la prima operazione di scrittura completata avrà esito positivo. Amazon S3 fallirà quindi le scritture successive con una 412 Precondition Failed risposta.

Puoi anche ricevere una 409 Conflict risposta in caso di richieste simultanee, se una richiesta di eliminazione di un oggetto ha esito positivo prima che un'operazione di scrittura condizionale su quell'oggetto possa essere completata. Questo perché la richiesta di eliminazione ha la precedenza sull'operazione di scrittura condizionale avviata in precedenza. Quando si utilizzano le scritture condizionali conPutObject, i caricamenti possono essere ritentati dopo aver ricevuto un errore. 409 Quando si utilizzaCompleteMultipartUpload, è necessario riavviare il caricamento CreateMultipartUpload in più parti per caricare nuovamente l'oggetto dopo la ricezione di un errore. 409

Considerate i seguenti scenari in cui due client eseguono operazioni sullo stesso bucket.

4.1.2 Precondizione: Risposta non riuscita

Le scritture condizionali non prendono in considerazione le richieste di caricamento in più parti in corso poiché non si tratta ancora di oggetti completamente scritti. Considerate il seguente esempio in cui il Client 1 sta caricando un oggetto utilizzando il caricamento in più parti. Durante il caricamento in più parti, il Client 2 è in grado di scrivere correttamente lo stesso oggetto con l'operazione di scrittura condizionale. Successivamente, quando il Client 1 tenta di completare il caricamento in più parti utilizzando una scrittura condizionale, il caricamento fallisce poiché l'oggetto esiste già.

Un esempio di due client che scrivono elementi con lo stesso nome chiave. Uno con UploadPart for MPU e uno con PutObject e una scrittura condizionale. L' CompleteMultipartUpload operazione, che inizia dopo, fallisce.
409 Risposta al conflitto

Se una richiesta di eliminazione ha esito positivo prima del completamento di una richiesta di scrittura condizionale, Amazon S3 restituisce 409 Conflict una risposta per l'operazione di scrittura. Questo perché la richiesta di eliminazione avviata in precedenza ha la precedenza sull'operazione di scrittura condizionale. Considerate il seguente esempio in cui un file puppy.txt esiste in un bucket. Il client 1 avvia un caricamento in più parti per un altro file denominato anch'esso puppy.txt con l'intento di completare il caricamento in più parti con una scrittura condizionale. Durante il caricamento, il Client 2 lo elimina puppy.txt dal bucket. Quando il Client 1 tenta di CompleteMultipartUpload caricare il proprio puppy.txt file con una scrittura condizionale, fallirà e restituirà una risposta. 409 Conflict In questi casi, è necessario avviare un nuovo caricamento in più parti.

Un esempio di due client, uno che utilizza il caricamento in più parti e l'altro che invia una richiesta di eliminazione dopo l'MPUavvio. La richiesta di eliminazione termina prima dell'inizio della scrittura condizionale.
Nota

Per ridurre al minimo i costi di archiviazione, ti consigliamo di configurare una regola del ciclo di vita per eliminare i caricamenti in più parti incompleti dopo un numero di giorni specificato utilizzando l'operazione AbortIncompleteMultipartUpload. Per ulteriori informazioni sulla creazione di una regola del ciclo di vita per eliminare i caricamenti in più parti incompleti, consulta Configurazione del ciclo di vita del bucket per l'eliminazione dei caricamenti in più parti incompleti.