Introdução
A equipe de embalagem precisa dos pedidos NEW de todos os clientes. A chave primária de cliente e data não pode atender a esse padrão de acesso com uma Query na tabela base. Você adicionará um índice secundário global, selecionará uma projeção, consultará a fila efetiva e observará um pedido embalado mudar entre partições do índice após uma gravação na tabela base.
Conclua primeiro Consulte pedidos com uma chave de partição e de ordenação. Esta VM nova prepara apenas a tabela base, registros sintéticos, tabela de referência e a estrutura da aplicação. Criar o índice e configurar sua consulta são seu trabalho. Use /home/labex/project, a AWS CLI oficial e AWS View.
Relação com as certificações
| Certificação | Tarefa do exame | Prática |
|---|---|---|
| Solutions Architect – Associate (SAA-C03) | Tarefa 3.3 | Índices secundários DynamoDB e projeção de atributos. |
| Developer – Associate (DVA-C02) | Tarefa 1.3 | Índices secundários DynamoDB e projeção de atributos. |
| Data Engineer – Associate (DEA-C01) | Tarefa 2.4 | Prática dos fundamentos: Índices secundários DynamoDB e projeção de atributos. |
Visão geral do laboratório

Adicione um padrão alternativo de acesso
Nesta etapa, você adicionará um índice para uma fila de embalagem que precisa dos pedidos NEW de todos os clientes. A tabela preparada usa customer_id e order_key; uma Query na tabela base não pode selecionar todos os clientes por status porque status não é sua chave de partição. Um índice secundário global (GSI) fornece outra visualização dos mesmos itens por chave de partição e de ordenação.
A consulta por cliente e a fila de preparação respondem a perguntas de negócio diferentes sobre os mesmos pedidos. O GSI permite que a fila selecione diretamente uma partição de status entre clientes. Adicionar um filtro de status à Query por cliente ainda examinaria apenas a partição desse cliente; não criaria o caminho alternativo necessário para a fila.

A tabela de pedidos e três registros sintéticos são preparados de forma independente para que você se concentre no novo padrão de acesso. Inspecione-os primeiro; mantenha todos os registros inalterados, exceto pela atualização de status ensinada.
cd /home/labex/project
aws dynamodb describe-table --table-name labex-d03-orders --query 'Table.KeySchema'
aws dynamodb scan --table-name labex-d03-orders --consistent-read
Adicione StatusDateIndex com status como chave de partição e order_key como chave de ordenação. Uma projeção determina quais atributos o índice armazena. INCLUDE adiciona amount; as chaves da tabela e do índice são incluídas automaticamente. O atributo source, que não é chave, permanecerá apenas na tabela base. Armazenamento e gravações do índice têm custo na AWS.
aws dynamodb update-table \
--table-name labex-d03-orders \
--attribute-definitions AttributeName=status,AttributeType=S AttributeName=order_key,AttributeType=S \
--global-secondary-index-updates '[{"Create":{"IndexName":"StatusDateIndex","KeySchema":[{"AttributeName":"status","KeyType":"HASH"},{"AttributeName":"order_key","KeyType":"RANGE"}],"Projection":{"ProjectionType":"INCLUDE","NonKeyAttributes":["amount"]}}}]'
aws dynamodb describe-table \
--table-name labex-d03-orders \
--query 'Table.GlobalSecondaryIndexes[].{Name:IndexName,State:IndexStatus,Keys:KeySchema,Projection:Projection}'
Continue apenas quando StatusDateIndex informar ACTIVE. A criação pode levar tempo na AWS; repita o comando describe enquanto o índice ainda estiver sendo criado. Um waiter table-exists não comprova que um novo índice está pronto. AWS View mostra o índice dentro do cartão da tabela após o serviço informá-lo.
Consulte o índice de status e inspecione sua projeção
Nesta etapa, você lerá a fila NEW pelas chaves alternativas. --index-name seleciona o GSI. A condição de chave usa igualdade de status; um filtro em um scan da tabela base leria itens não relacionados primeiro.
aws dynamodb query \
--table-name labex-d03-orders \
--index-name StatusDateIndex \
--key-condition-expression '#state = :state' \
--expression-attribute-names '{"#state":"status"}' \
--expression-attribute-values '{":state":{"S":"NEW"}}'
O índice retorna O100 de Ada e O200 de Bob, cada um com amount. Seu atributo source está ausente porque não foi projetado. Buscar atributos adicionais da tabela base exigiria uma leitura separada por chave.
As atualizações de GSI são assíncronas na AWS e suas leituras têm consistência eventual. Não adicione --consistent-read a uma Query de GSI: essa solicitação é rejeitada com ValidationException. Espere e repita uma leitura se uma gravação recente ainda não chegou ao índice; não trate um resultado desatualizado como prova de que a gravação falhou.
A aplicação order-lookup fornecida no laboratório anterior lê as configurações comuns de lookup.json. Escreva a solicitação para escolher este índice e a fila NEW. Um heredoc entre aspas grava JSON literalmente; ConsistentRead: false explicita a escolha de leitura do índice.
cat > lookup.json <<'JSON'
{
"paginate": true,
"request": {
"TableName": "labex-d03-orders",
"IndexName": "StatusDateIndex",
"KeyConditionExpression": "#state = :state",
"ExpressionAttributeNames": {
"#state": "status"
},
"ExpressionAttributeValues": {
":state": {
"S": "NEW"
}
},
"ConsistentRead": false
}
}
JSON
./order-lookup
A aplicação retorna os mesmos dois pedidos. Expanda StatusDateIndex no AWS View e compare a projeção efetiva com o resultado da consulta. Manter ambos os clientes é correto para uma fila por status, embora uma visualização específica de cliente exigisse outro padrão de chaves.
Observe um pedido mudar entre filas de status
Nesta etapa, você marcará O100 como embalado e observará sua entrada de índice mudar. Um GSI acompanha gravações na tabela base; você não grava diretamente no índice. Atualizar status altera a partição do item no índice enquanto sua chave primária na tabela base permanece a mesma.
aws dynamodb update-item \
--table-name labex-d03-orders \
--key '{"customer_id":{"S":"ada"},"order_key":{"S":"2026-10-01#O100"}}' \
--update-expression 'SET #state = :state' \
--expression-attribute-names '{"#state":"status"}' \
--expression-attribute-values '{":state":{"S":"PACKED"}}' \
--return-values ALL_NEW
./order-lookup
A fila NEW agora contém apenas O200 de Bob. Consulte PACKED para confirmar que O100 aparece junto de O101 em vez de desaparecer do serviço.
aws dynamodb query \
--table-name labex-d03-orders \
--index-name StatusDateIndex \
--key-condition-expression '#state = :state' \
--expression-attribute-names '{"#state":"status"}' \
--expression-attribute-values '{":state":{"S":"PACKED"}}'
Espere O100 e O101 de Ada em PACKED. Na AWS, repita essas leituras até a propagação do índice ficar visível. A resposta de atualização e uma leitura consistente da tabela base representam o estado imediato oficial do item; o GSI é uma visualização derivada com consistência eventual. AWS View mostra o novo status de O100 e a consulta NEW contendo apenas O200.

Remova o índice e a tabela do exercício
Nesta etapa, você removerá a visualização alternativa e depois a tabela do exercício. Excluir um índice deixa os itens da tabela base intactos; excluir uma tabela remove os itens e seus índices restantes. Indique apenas os recursos do exercício.
aws dynamodb update-table \
--table-name labex-d03-orders \
--global-secondary-index-updates '[{"Delete":{"IndexName":"StatusDateIndex"}}]'
aws dynamodb describe-table \
--table-name labex-d03-orders \
--query 'Table.GlobalSecondaryIndexes'
Continue quando a lista de índices estiver vazia. Na AWS, repita DescribeTable enquanto a exclusão estiver em andamento. A tabela ainda contém três itens neste momento.
aws dynamodb scan --table-name labex-d03-orders --consistent-read --select COUNT
aws dynamodb delete-table --table-name labex-d03-orders
aws dynamodb wait table-not-exists --table-name labex-d03-orders
aws dynamodb list-tables
aws dynamodb get-item \
--table-name labex-d03-reference \
--key '{"id":{"S":"platform"}}' \
--consistent-read
A tabela de pedidos e seu índice estão ausentes; a nota de referência permanece keep unchanged. Leituras bem-sucedidas do inventário e da referência distinguem limpeza de um serviço desconectado. AWS View mantém apenas a referência não relacionada. A conexão descartável termina com a VM.
Resumo
Você adicionou um GSI para uma fila por status de todos os clientes, selecionou atributos projetados e usou as chaves do índice em consultas efetivas. Uma atualização de status na tabela base moveu o pedido entre partições do índice sem alterar sua chave primária. Você distinguiu o estado imediato da tabela base da propagação eventual do índice e depois excluiu apenas o índice e a tabela do exercício.
Para aprofundar o tema, consulte a documentação da AWS: Índices secundários globais, projeções e consistência.



