Transforme Eventos de Pedidos para um Consumidor de Fila

AWSBeginner
Pratique Agora

Introdução

O produtor envia um evento de pedido completo, mas o consumidor precisa apenas do ID do pedido e da quantidade. Você transformará dois eventos em mensagens compactas de fila, preservando o filtro de roteamento.

Conclua primeiro Encaminhe Eventos de Pedidos com EventBridge. Construa este fluxo em sua VM independente; nenhum barramento, regra ou fila anterior é reutilizado.

Relação com as certificações

Este laboratório oferece prática nos seguintes tópicos de exame.

Prepare Recursos de Roteamento Independentes

Nesta etapa, crie um barramento personalizado e uma fila vazia para tarefas de atendimento de pedidos.

Use AWS View ao lado do Terminal para comparar as consultas da CLI com os recursos e resultados reais deste laboratório. Preserve os dados de referência fornecidos.

O evento do produtor contém metadados de roteamento, informações do cliente e um pedido aninhado. O consumidor da fila precisa apenas do ID do pedido e da quantidade. A transformação de entrada escolhe campos do evento e constrói o corpo no destino, reduzindo a dependência do consumidor em relação ao envelope do produtor.

Este novo ambiente de trabalho contém acesso configurado à CLI e dados de referência não relacionados. Ele não reutiliza recursos de EV01. Comece no diretório do projeto. Atribuições no shell salvam identificadores retornados; --query seleciona um campo da resposta e --output text torna esse campo reutilizável no próximo comando.

cd /home/labex/project
BUS_NAME=labex-ev02-bus
RULE_NAME=labex-ev02-orders
aws events create-event-bus --name "$BUS_NAME"
QUEUE_URL=$(aws sqs create-queue \
  --queue-name labex-ev02-jobs \
  --query QueueUrl \
  --output text)
QUEUE_ARN=$(aws sqs get-queue-attributes \
  --queue-url "$QUEUE_URL" \
  --attribute-names QueueArn \
  --query Attributes.QueueArn \
  --output text)

O ARN do barramento identifica o destino do evento; a URL da fila é usada para operações de mensagens, enquanto seu ARN identifica um destino de regra. Confirme o estado inicial:

aws events list-rules --event-bus-name "$BUS_NAME"
aws sqs get-queue-attributes \
  --queue-url "$QUEUE_URL" \
  --attribute-names ApproximateNumberOfMessages ApproximateNumberOfMessagesNotVisible

Não há regras ou mensagens. Clique em AWS View ao lado do Terminal para inspecionar o mesmo barramento personalizado e a fila vazia. Execute a verificação da preparação.

Conecte um Destino com um Transformador de Entrada

Nesta etapa, identifique pedidos feitos correspondentes, autorize a regra e defina o conteúdo compacto para o consumidor.

Detalhe do evento para o corpo do consumidor

Selecione os campos aninhados do pedido e construa o corpo id/quantity do consumidor; mantenha o filtro de roteamento.

O padrão de uma regra identifica correspondências no produtor e na categoria do evento. Um here-document com marcador entre aspas grava JSON literal sem expansão pelo shell; file:// lê esse arquivo na solicitação da CLI.

cat > order-pattern.json <<'JSON'
{"source":["labex.orders"],"detail-type":["OrderPlaced"]}
JSON
RULE_ARN=$(aws events put-rule \
  --name "$RULE_NAME" \
  --event-bus-name "$BUS_NAME" \
  --event-pattern file://order-pattern.json \
  --state ENABLED \
  --query RuleArn \
  --output text)

A fila precisa de uma permissão exata para a regra de origem. Escreva uma política JSON comum usando os ARNs de sua fila e regra. Depois, --rawfile a codifica como o atributo Policy do SQS, cujo valor é uma string.

cat > queue-policy.json <<EOF
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "events.amazonaws.com"
      },
      "Action": "sqs:SendMessage",
      "Resource": "$QUEUE_ARN",
      "Condition": {
        "ArnEquals": {
          "aws:SourceArn": "$RULE_ARN"
        }
      }
    }
  ]
}
EOF
jq -n --rawfile policy queue-policy.json '{Policy:$policy}' > queue-attributes.json
aws sqs set-queue-attributes \
  --queue-url "$QUEUE_URL" \
  --attributes file://queue-attributes.json

Um InputPathsMap nomeia campos selecionados por JSONPath. $ significa a raiz do evento; $.detail.order.id seleciona o ID aninhado do pedido. Um InputTemplate usa marcadores entre sinais de menor e maior para construir a mensagem. O marcador de ID fica dentro das aspas de uma string JSON; a quantidade é um número JSON e não tem aspas. O exemplo usa IDs simples e quantidades inteiras positivas.

cat > targets.json <<EOF
[
  {
    "Id": "order-queue",
    "Arn": "$QUEUE_ARN",
    "InputTransformer": {
      "InputPathsMap": {
        "id": "\$.detail.order.id",
        "quantity": "\$.detail.order.quantity"
      },
      "InputTemplate": "{\"id\":\"<id>\",\"quantity\":<quantity>}"
    }
  }
]
EOF
aws events put-targets \
  --rule "$RULE_NAME" \
  --event-bus-name "$BUS_NAME" \
  --targets file://targets.json
aws events list-targets-by-rule --rule "$RULE_NAME" --event-bus-name "$BUS_NAME"

FailedEntryCount é zero. O destino listado inclui o ARN de sua fila e os dois caminhos de mapeamento e o template. O sucesso da configuração ainda precisa de um teste real de entrega. AWS View mostra a regra habilitada e o transformador; a fila permanece vazia. Execute a verificação da conexão.

Compare Dois Conteúdos Reais para o Consumidor

Nesta etapa, publique dois pedidos feitos distintos e inspecione as mensagens resultantes na fila.

Escreva os detalhes dos eventos como objetos JSON comuns. PutEvents exige que cada Detail seja uma string codificada em JSON; o comando curto de jq abaixo converte apenas esse campo. Cada evento também contém informações sintéticas de cliente de que o consumidor de atendimento de pedidos não precisa. Um terceiro evento de cancelamento testa que o filtro de roteamento continua sendo aplicado.

cat > event-inputs.json <<EOF
[
  {
    "EventBusName": "$BUS_NAME",
    "Source": "labex.orders",
    "DetailType": "OrderPlaced",
    "Detail": {
      "order": {
        "id": "transform-order-a",
        "quantity": 2
      },
      "customer": {
        "email": "synthetic-a@example.test"
      }
    }
  },
  {
    "EventBusName": "$BUS_NAME",
    "Source": "labex.orders",
    "DetailType": "OrderPlaced",
    "Detail": {
      "order": {
        "id": "transform-order-b",
        "quantity": 4
      },
      "customer": {
        "email": "synthetic-b@example.test"
      }
    }
  },
  {
    "EventBusName": "$BUS_NAME",
    "Source": "labex.orders",
    "DetailType": "OrderCancelled",
    "Detail": {
      "order": {
        "id": "cancelled-order",
        "quantity": 9
      }
    }
  }
]
EOF
jq 'map(.Detail |= tojson)' event-inputs.json > events.json
aws events put-events --entries file://events.json
aws sqs get-queue-attributes \
  --queue-url "$QUEUE_URL" \
  --attribute-names ApproximateNumberOfMessages ApproximateNumberOfMessagesNotVisible

Os três eventos são aceitos, mas apenas os dois pedidos feitos correspondem ao filtro. A fila tem duas mensagens disponíveis. Receber com visibilidade zero deixa as mensagens disponíveis imediatamente após a inspeção. A consulta exibe apenas IDs e corpos de mensagens, mantendo os identificadores de recebimento privados.

fromjson torna cada corpo JSON legível, mantendo seu ID de mensagem SQS. Ele altera apenas a saída exibida.

aws sqs receive-message \
  --queue-url "$QUEUE_URL" \
  --max-number-of-messages 10 \
  --visibility-timeout 0 \
  --output json | jq '[.Messages[] | {MessageId, Body: (.Body | fromjson)}]'

Os corpos são {"id":"transform-order-a","quantity":2} e {"id":"transform-order-b","quantity":4}; sua ordem não é avaliada. Eles têm IDs de mensagem distintos e valores derivados dos eventos correspondentes. Nenhum contém o email do cliente, metadados de roteamento ou um objeto order aninhado. O pedido cancelado está ausente. Isso comprova a transformação e a entrega, não o atendimento concluído ou a confirmação das mensagens.

AWS View mostra os mapeamentos do destino ao lado dos corpos compactos reais das mensagens na fila.

O exemplo abaixo mostra os dois mapeamentos de campos aninhados e as duas mensagens compactas reais para o consumidor.

AWS View mostra duas mensagens de pedidos transformadas

Execute a verificação do conteúdo.

Remova o Fluxo Descartável

Nesta etapa, remova seus recursos de roteamento e preserve o estado não relacionado.

Remova o destino antes de sua regra e, depois, exclua o barramento personalizado e a fila. A fila contém apenas mensagens sintéticas de inspeção; excluí-la as descarta sem alegar processamento de negócio.

aws events remove-targets \
  --rule "$RULE_NAME" \
  --event-bus-name "$BUS_NAME" \
  --ids order-queue
aws events delete-rule --name "$RULE_NAME" --event-bus-name "$BUS_NAME"
aws events delete-event-bus --name "$BUS_NAME"
aws sqs delete-queue --queue-url "$QUEUE_URL"

Consultas nativas de inventário bem-sucedidas comprovam a exclusão:

aws events list-event-buses
aws events list-rules --event-bus-name default
aws sqs list-queues
aws dynamodb scan --table-name labex-ev02-reference --query Items

Apenas o barramento padrão permanece, sem regras; as URLs de fila estão ausentes. O item de referência ainda diz keep unchanged. Erros de rede ou de autenticação não comprovam a exclusão. AWS View mostra os recursos personalizados vazios e a referência preservada.

Remova os arquivos comuns criados neste laboratório:

rm -f event-inputs.json order-pattern.json queue-policy.json queue-attributes.json targets.json events.json

Execute a verificação da limpeza antes de encerrar a VM.

Resumo

Você mapeou campos aninhados de pedidos para um contrato compacto de consumidor SQS, verificou valores distintos de dois eventos reais e manteve a filtragem de eventos e as permissões da regra de origem. Você removeu o fluxo descartável, preservando os dados de referência.

A próxima unidade conecta tarefas reais de negócio em um fluxo de pedidos.