Expire registros temporários com TTL

AWSBeginner
Pratique Agora

Introdução

Registros temporários de sessão devem deixar de ser fornecidos ao expirar, mesmo que a limpeza do armazenamento ainda não tenha ocorrido. Você ativará TTL, corrigirá um atributo de expiração com tipo incorreto e configurará uma aplicação fornecida para excluir dados expirados usando leituras efetivas do serviço.

Conclua primeiro Crie uma tabela DynamoDB para pedidos e Consulte pedidos com uma chave de partição e de ordenação. O ambiente novo fornece uma tabela independente de sessões, três registros sintéticos e uma estrutura de leitura, pronta para você configurar TTL e o filtro de leitura. Use /home/labex/project, a AWS CLI oficial e AWS View. Este laboratório avalia a configuração de TTL e leituras que consideram a expiração; ele não promete um prazo de exclusão em segundo plano na AWS.

Relação com as certificações

Certificação Tarefa do exame Prática
Developer – Associate (DVA-C02) Tarefa 1.3 Configuração de TTL DynamoDB e leituras que consideram a expiração.
Data Engineer – Associate (DEA-C01) Tarefa 2.3 Prática dos fundamentos: Configuração de TTL DynamoDB e leituras que consideram a expiração.

Visão geral do laboratório

Diagrama conceitual com ícones AWS4, exportado com draw.io: TTL usa um atributo Number de expiração em segundos; o leitor fornecido exclui sessões expiradas e retorna as ativas e permanentes, independentemente da exclusão assíncrona.

Ative a expiração na tabela de sessões preparada

Nesta etapa, você configurará o atributo de expiração de uma tabela. Time to Live (TTL) permite que DynamoDB remova itens expirados posteriormente. É uma manutenção assíncrona, não um temporizador que exclui cada item no segundo exato de expiração. As aplicações ainda devem recusar dados expirados enquanto a exclusão pelo serviço está pendente.

Para este leitor de sessões, poder servir um registro e removê-lo do armazenamento são resultados distintos. Você verificará o estado de TTL, corrigirá o tipo da expiração e comparará a aplicação com uma leitura direta. ENABLED comprova a configuração; omitir uma sessão expirada comprova a política de leitura, não a exclusão do item pelo serviço.

O ambiente novo contém uma tabela de sessões com registros sintéticos ativo, expirado e permanente. Inspecione seus tipos e o estado desativado de TTL antes de ativar qualquer coisa.

cd /home/labex/project
aws dynamodb scan --table-name labex-d05-sessions --consistent-read
aws dynamodb describe-time-to-live --table-name labex-d05-sessions

Ative TTL em expires_at. Cada item fornece seu próprio horário de expiração; a configuração da tabela seleciona qual atributo o serviço TTL examina. A ausência do atributo significa que esse item não tem expiração TTL.

aws dynamodb update-time-to-live \
  --table-name labex-d05-sessions \
  --time-to-live-specification Enabled=true,AttributeName=expires_at
aws dynamodb describe-time-to-live --table-name labex-d05-sessions

Continue quando a descrição informar ENABLED e expires_at. Na AWS, a ativação pode levar tempo; repita o comando describe enquanto estiver ENABLING em vez de alterar a configuração repetidamente. Observe AWS View na parte superior e expanda a entrada TTL dentro do cartão de sessões.

Corrija o tipo do atributo do registro expirado

Nesta etapa, você armazenará um valor válido de expiração. TTL do DynamoDB exige um Number contendo segundos Unix epoch: segundos desde 1970-01-01 UTC. Milissegundos representariam um horário muito distante no futuro. Uma string que parece um timestamp ainda é uma String, e o processo TTL a ignora.

Inspecione o registro expirado fornecido pela chave exata. Seu expires_at está intencionalmente codificado com S; ativar TTL não corrigiu seu tipo.

aws dynamodb get-item \
  --table-name labex-d05-sessions \
  --key '{"session_id":{"S":"expired"}}' \
  --consistent-read

Calcule uma expiração de uma hora atrás com o comando Linux date. +%s exibe segundos Unix, e $(...) armazena essa saída em EXPIRED. O valor varia a cada vez; ele deve ser anterior ao horário atual.

EXPIRED=$(date -u -d '1 hour ago' +%s)
echo "$EXPIRED"

Coloque o valor tipado em um pequeno arquivo JSON. Este heredoc usa um delimitador JSON sem aspas para que o shell substitua $EXPIRED pelo seu timestamp; delimitadores anteriores entre aspas mantinham valores literais. Manter o JSON em um arquivo evita escapar suas aspas.

cat > expiry-values.json <<JSON
{":expires":{"N":"$EXPIRED"}}
JSON

Use UpdateItem para substituir apenas o atributo de expiração. file:// carrega o arquivo de valores; a condição de existência evita recriar um registro caso a exclusão assíncrona já o tenha removido.

aws dynamodb update-item \
  --table-name labex-d05-sessions \
  --key '{"session_id":{"S":"expired"}}' \
  --update-expression 'SET expires_at = :expires' \
  --condition-expression 'attribute_exists(session_id)' \
  --expression-attribute-values file://expiry-values.json \
  --return-values ALL_NEW

O item expirado retornado tem expires_at: {"N": "..."} no passado e mantém seu purpose. O item ativo permanece no futuro; o item permanente ainda não tem expiração. Na AWS, se o registro foi removido antes de uma leitura ou atualização posterior, trate isso como exclusão apenas após uma resposta bem-sucedida do serviço, não uma falha de conexão.

Exclua dados expirados do caminho de leitura da aplicação

Nesta etapa, você protegerá as leituras enquanto a limpeza por TTL está pendente. Uma aplicação session-reader fornecida lê configurações comuns de session-reader.json e realiza solicitações Scan efetivas. Sua configuração padrão intencionalmente retorna dados expirados também. O código-fonte da aplicação está disponível para inspeção; não é necessário escrever Python.

./session-reader

Neste ambiente, o leitor sem filtro ainda retorna os três registros, incluindo expired. Isso não comprova que TTL está configurado incorretamente. A exclusão em segundo plano na AWS pode ocorrer depois, e nenhum cronograma preciso faz parte da aceitação deste laboratório.

Ative o filtro de expiração da aplicação. Um heredoc entre aspas grava JSON literalmente, substituindo o arquivo de configurações.

cat > session-reader.json <<'JSON'
{
  "table": "labex-d05-sessions",
  "filter_expired": true
}
JSON
./session-reader

A aplicação usa attribute_not_exists(expires_at) OR expires_at > :now com os segundos Number atuais e segue as chaves de continuação de Scan. Agora ela retorna apenas active e permanent, com Count 2 e FilterExpired true. O registro permanente é intencional porque não tem política de expiração. O filtro impede fornecer dados expirados, mas não desfaz o trabalho de leitura de um scan.

Após ativar o filtro da aplicação, dados expirados são excluídos mesmo enquanto seu registro armazenado permanece.

Compare a leitura bruta por chave com o resultado da aplicação.

aws dynamodb get-item \
  --table-name labex-d05-sessions \
  --key '{"session_id":{"S":"expired"}}' \
  --consistent-read

A leitura bruta ainda pode conter expired enquanto a aplicação o exclui. Se a AWS já o excluiu, um GetItem vazio bem-sucedido também é compatível com TTL. AWS View mostra a configuração TTL e o resultado efetivo de dois itens do leitor sem fingir que o filtro excluiu fisicamente o registro armazenado.

TTL está ativado enquanto a aplicação exclui dados expirados de seu resultado efetivo de leitura.

Remova a tabela de sessões do exercício

Nesta etapa, você limpará explicitamente a tabela após verificar a configuração de expiração e o comportamento da aplicação. Não espere TTL remover a tabela inteira: TTL exclui itens, não a própria tabela. Excluir esta tabela descartável também remove sua configuração TTL.

aws dynamodb delete-table --table-name labex-d05-sessions
aws dynamodb wait table-not-exists --table-name labex-d05-sessions
aws dynamodb list-tables
aws dynamodb get-item \
  --table-name labex-d05-reference \
  --key '{"id":{"S":"platform"}}' \
  --consistent-read

Resta apenas a tabela de referência e sua nota é keep unchanged. Leituras bem-sucedidas do inventário e da referência comprovam que a conexão ainda funciona após a exclusão. AWS View remove a tabela de sessões e o resultado do leitor. A conexão descartável termina com esta VM.

Resumo

Você ativou TTL em expires_at, substituiu um timestamp String por segundos epoch numéricos e excluiu sessões expiradas em um caminho efetivo de leitura da aplicação. Você distinguiu expiração lógica de exclusão física assíncrona e manteve registros permanentes deliberadamente. Por fim, excluiu a tabela do exercício e preservou a referência não relacionada.

Para aprofundar o tema, consulte a documentação da AWS: Expiração TTL e exclusão assíncrona de itens.