Como evitar substituições de objeto com gravações condicionais
Com gravações condicionais, é possível adicionar outro cabeçalho às solicitações de gravação a fim de especificar condições prévias para a operação do S3. Isso pode evitar a substituição de dados existentes ao confirmar que não há nenhum objeto existente com o mesmo nome de chave no bucket. As gravações condicionais funcionam para solicitações de API em buckets de uso geral e buckets de diretório.
Ao fazer upload de um objeto no Amazon S3, você precisa especificar o nome da chave. Nome de chave é um identificador exclusivo, que diferencia maiúsculas e minúsculas, de um objeto em um bucket. Se você fizer upload de um objeto com um nome de chave idêntico em um bucket sem versão ou com versão suspensa, o objeto será substituído. Em um bucket com versionamento, o objeto cujo upload foi feito mais recentemente se tornará a versão atual do objeto.
As gravações condicionais vão conferir a existência de um objeto durante a operação WRITE
. Se um nome de chave idêntico for encontrado no bucket, a operação WRITE
falhará. Com as gravações condicionais, vários clientes podem gravar no mesmo bucket sem o risco de substituir os objetos existentes.
Para realizar gravações condicionais, é necessário ter a permissão s3:PutObject
. Essa permissão possibilita que o chamador confira se existem objetos no bucket. É possível usar gravações condicionais com URLs pré-assinados com os SDKs da AWS.
nota
Para usar gravações condicionais, é necessário fazer as solicitações por HTTPS (TLS) ou usar o AWS Signature Version 4 para assinar a solicitação.
APIs compatíveis
As seguintes APIs do S3 são compatíveis com o uso de gravações condicionais:
É possível usar os cabeçalhos a seguir para gravar um objeto que depende do nome da chave do objeto. Para ter informações sobre nomes de chave de objeto, consulte Nomear objetos do Amazon S3.
PutObject
-
If-None-Match
: fará upload do objeto somente se não existir nenhum objeto com o mesmo nome de chave no bucket especificado. É necessário usar o valor * (asterisco) com esse parâmetro.
O exemplo de comando put-object
a seguir mostra como usar a AWS CLI para fazer upload de um objeto com um cabeçalho de gravação condicional usando o parâmetro if-none-match
.
aws s3api put-object --bucket
amzn-s3-demo-bucket
--key dir-1/my_images.tar.bz2 --body my_images.tar.bz2 --if-none-match "*"
Para obter mais informações, consulte put-object
Para obter informações sobre o AWS CLI, consulte O que é AWS Command Line Interface? no Guia do usuário do AWS Command Line Interface.
Para ter mais informações sobre esses cabeçalhos, consulte PutObject na Referência da API do Amazon Simple Storage Service.
CompleteMultipartUpload
-
If-None-Match
: concluirá o upload somente se não existir nenhum objeto com o mesmo nome de chave no bucket especificado. É necessário usar o valor * (asterisco) com esse parâmetro.
O exemplo de comando complete-multipart-upload
a seguir mostra como usar a AWS CLI para concluir o carregamento fracionado de um cabeçalho de gravação condicional usando o parâmetro 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 "*"
Para obter mais informações, consulte complete-multipart-upload na Referência de comandos da AWS CLI.
Para obter informações sobre o AWS CLI, consulte O que é AWS Command Line Interface? no Guia do usuário do AWS Command Line Interface.
Para ter mais informações sobre esses cabeçalhos, consulte CompleteMultipartUpload na Referência da API do Amazon Simple Storage Service.
Comportamento de uma gravação condicional
As gravações condicionais são avaliadas em relação aos objetos existentes em um bucket. Se não houver nenhum objeto existente com o mesmo nome de chave no bucket, a operação de gravação será bem-sucedida, resultando em uma resposta 200
. Se houver um objeto existente, a operação de gravação falhará, resultando em uma resposta 412 Precondition Failed
. Para buckets com versionamento habilitado, o S3 confere a presença de uma versão atual do objeto com o mesmo nome como parte da avaliação condicional. Se não houver uma versão atual do objeto com o mesmo nome, ou se a versão atual do objeto for um marcador de exclusão, a operação de gravação será bem-sucedida. Caso contrário, isso resultará em uma resposta 412 Precondition Failed
, que indica uma falha na operação de gravação.
Se ocorrerem várias gravações condicionais para o mesmo nome de objeto, a primeira operação de gravação que for concluída será bem-sucedida. O Amazon S3 então rejeitará as gravações subsequentes com uma resposta 412 Precondition
Failed
.
Também é possível receber uma resposta 409 Conflict
no caso de solicitações simultâneas, se uma solicitação de exclusão de um objeto for bem-sucedida antes que uma operação de gravação condicional nesse objeto seja concluída. Isso ocorre porque a solicitação de exclusão tem precedência sobre a operação de gravação condicional iniciada anteriormente. Ao usar gravações condicionais com PutObject
, os uploads podem ser repetidos após o recebimento de um erro 409
. Ao usar CompleteMultipartUpload
, o carregamento fracionado deve ser reiniciado com CreateMultipartUpload
para que o objeto seja carregado novamente após o recebimento de um erro 409
.
Considere os casos a seguir, em que dois clientes estão executando operações no mesmo bucket.
412 Resposta de falha na condição prévia
As gravações condicionais não levam em conta nenhuma solicitação de carregamento fracionado em andamento, pois nesse caso os objetos ainda não foram totalmente gravados. Considere o exemplo a seguir, em que o Cliente 1 está fazendo upload de um objeto usando o carregamento fracionado. Durante o carregamento fracionado, o Cliente 2 consegue gravar com êxito o mesmo objeto com a operação de gravação condicional. Posteriormente, quando o Cliente 1 tenta concluir o carregamento fracionado usando uma gravação condicional, o upload falha, pois o objeto já existe.
409 Resposta de conflito
Se uma solicitação de exclusão for bem-sucedida antes que uma solicitação de gravação condicional possa ser concluída, o Amazon S3 exibirá uma resposta 409 Conflict
para a operação de gravação. Isso ocorre porque a solicitação de exclusão iniciada anteriormente tem precedência sobre a operação de gravação condicional. Considere o exemplo a seguir, em que um arquivo puppy.txt
existe em um bucket. O Cliente 1 inicia o carregamento fracionado de outro arquivo também denominado puppy.txt
com a intenção de concluir o carregamento fracionado com uma gravação condicional. Durante o upload, o Cliente 2 exclui puppy.txt
do bucket. Quando o Cliente 1 tentar usar CompleteMultipartUpload
para fazer upload de seu próprio arquivo puppy.txt
com uma gravação condicional, é exibida uma resposta de falha 409
Conflict
. Nesses casos, é necessário iniciar um novo carregamento fracionado.
nota
Para minimizar os custos de armazenamento, recomendamos que você configure uma regra de ciclo de vida para excluir uploads incompletos de várias partes após um determinado número de dias usando a ação AbortIncompleteMultipartUpload
. Para obter mais informações sobre como criar uma regra de ciclo de vida para excluir uploads incompletos de várias partes, consulte Configurando uma política de ciclo de vida de bucket para anular multipart uploads incompletos.