Como executar exclusões condicionais - Amazon Simple Storage Service

Como executar exclusões condicionais

É possível usar as exclusões condicionais para avaliar se o objeto existe ou não foi alterado antes de excluí-lo. Você pode realizar exclusões condicionais usando as operações de API DeleteObject ou DeleteObjects em buckets de diretório e de uso geral do S3. Para começar, ao fazer uma solicitação de exclusão condicional, você pode usar o cabeçalho HTTP If-Match com o valor da pré-condição * para verificar se o objeto existe ou o cabeçalho If-Match com a ETag fornecida para verificar se o objeto foi modificado.

É possível aplicar exclusões condicionais em nível de bucket de uso geral usando as políticas de bucket do S3 ou do Identity and Access Management (IAM). Para obter mais informações, consulte Impor exclusões condicionais em buckets do Amazon S3.

nota

As avaliações de exclusão condicional só se aplicam à versão atual do objeto.

Como verificar se o objeto foi modificado antes de excluí-lo

Com as exclusões condicionais, você pode proteger sua aplicação contra exclusões acidentais de objetos. Você pode usar o cabeçalho HTTP If-Match com o valor ETag para verificar se um objeto foi modificado. Se o valor ETag de um objeto em um bucket do S3 não corresponder à ETag que você fornece durante a operação de exclusão, a operação falhará. Para excluir condicionalmente vários objetos usando a operação DeleteObjects, você deve fornecer o valor ETag no elemento ETag do objeto no corpo da solicitação XML. Para obter mais informações, consulte Usar Content-MD5 e a ETag para verificar objetos carregados.

nota

Para realizar exclusões condicionais com o cabeçalho If-Match com o valor ETag, você deve ter as permissões s3:DeleteObject e s3:GetObject.

O cabeçalho If-Match com o valor ETag é avaliado em relação aos objetos existentes em um bucket. Se já houver um objeto com o mesmo nome de chave e a ETag correspondente, as solicitações DeleteObject terão êxito e exibirão a resposta 204 No content. Se não houver correspondência com a ETag, a operação de gravação falhará, exibindo a resposta 412 Precondition Failed. Se houver, a API DeleteObjects responderá com um 200 OK e fornecerá o status de cada objeto no corpo da resposta da solicitação de exclusão em lote. Se as condições prévias não forem satisfeitas para uma solicitação DeleteObjects, o Amazon S3 excluirá os objetos e exibirá uma resposta de erro de que a Pre-condition não foi satisfeita.

Também é possível receber uma resposta de erro 409 Conflict no caso de solicitações simultâneas se uma solicitação DELETE ou PUT de um objeto tiver êxito antes que uma operação de gravação condicional nesse objeto seja concluída. Você receberá uma resposta 404 Not Found se uma solicitação simultânea de exclusão de um objeto for bem-sucedida antes que uma operação de gravação condicional nesse objeto seja concluída, já que a chave do objeto não existe mais.

Você pode usar o cabeçalho If-Match com o valor ETag para as seguintes APIs:

O exemplo de comando delete-object a seguir tenta realizar uma exclusão condicional com o valor de ETag 6805f2cfc46c0f04559748bb039d69al fornecido.

aws s3api delete-object --bucket amzn-s3-demo-bucket --key dir-1/my_images.tar.bz2 --if-match "6805f2cfc46c0f04559748bb039d69al"

Para ter mais informações, consulte delete-object na Referência de comandos da AWS CLI.

O exemplo de comando delete-objects a seguir tenta realizar uma exclusão condicional com o valor de ETag 6805f2cfc46c0f04559748bb039d69al fornecido.

aws s3api delete-objects --bucket amzn-s3-demo-bucket --delete '{"Objects":[{"Key":"my_images.tar.bz2", "ETag": "6805f2cfc46c0f04559748bb039d69al"}]}'

Para ter mais informações, consulte delete-objects 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.

Como verificar se o objeto existe antes de excluí-lo

Você pode usar o cabeçalho If-Match com o valor * para verificar se o objeto existe antes de tentar excluí-lo. O valor * significa que a operação só deve continuar se o objeto existir, independentemente de ter sido modificado ou não.

Os marcadores de exclusão são objetos especiais em buckets de uso geral versionados do S3 que indicam que um objeto foi excluído. Eles são espaços reservados que fazem o objeto parecer excluído, preservando as versões anteriores. Portanto, quando você usar If-Match:* com uma API DeleteObject, a operação só terá êxito com um 204 No Content se o objeto existir. Quando a versão mais recente do objeto é um marcador de exclusão, o objeto não existe e a API DeleteObject falha, exibindo a resposta 412 Precondition Failed. Para obter mais informações sobre marcadores de exclusão, consulte Trabalhar com marcadores de exclusão.

Para excluir condicionalmente vários objetos usando a operação DeleteObjects, você pode fornecer * no elemento ETag do objeto no corpo da solicitação XML. Se a pré-condição for satisfeita, a operação DeleteObjects responderá com um 200 OK e fornecerá o status de cada objeto no corpo da resposta. Se a pré-condição for satisfeita, a resposta desse objeto será capturada no elemento <Deleted> do corpo da resposta. Se a pré-condição não for satisfeita, a resposta desse objeto será capturada no elemento <Error> do corpo da resposta. Se o objeto não existir ao avaliar qualquer uma das pré-condições, o S3 rejeitará a solicitação e exibirá a resposta de erro Not Found.

nota

Para realizar exclusões condicionais com If-Match:*, você deve ter permissões s3:DeleteObject.

Você pode usar o cabeçalho If-Match com o valor * para as seguintes APIs:

O exemplo de comando delete-object a seguir tenta executar uma exclusão condicional de um objeto com um nome de chave my_images.tar.bz2 que tem o valor *, que representa qualquer ETag.

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

Para ter mais informações, consulte delete-object na Referência de comandos da AWS CLI.

O exemplo de comando delete-objects a seguir tenta executar uma exclusão condicional de um objeto com um nome de chave my_images.tar.bz2 que tem o valor *, que representa qualquer ETag.

aws s3api delete-objects --bucket amzn-s3-demo-bucket --delete '{"Objects":[{"Key":"my_images.tar.bz2", "ETag": "*"}]}'

Para ter mais informações, consulte delete-objects 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.