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'WRITE
operazione 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-object
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-iduploadID
--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à.
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.
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.