Введение
Службе исполнения заказов нужны недавно размещённые заказы, а события оплаты и отмены предназначены другим получателям. Вы направите совпадающие события в очередь и проверите, какие сообщения действительно поступают.
Сначала выполните Отправку и потребление заданий с SQS и Защиту бакета ресурсной политикой. Эта независимая VM предоставляет собственный доступ CLI и эталонные данные; прежние очереди и учётные данные не используются.
Связь с сертификацией
Эта лабораторная работа помогает на практике изучить следующие темы экзаменов.
- Cloud Practitioner (CLF-C02) · Задача 3.8: Сопоставление событий EventBridge, цели и авторизация доставки.
- Solutions Architect – Associate (SAA-C03) · Задача 2.1: Сопоставление событий EventBridge, цели и авторизация доставки.
- Developer – Associate (DVA-C02) · Задача 1.1: Сопоставление событий EventBridge, цели и авторизация доставки.
- CloudOps Engineer – Associate (SOA-C03) · Задача 1.2: Сопоставление событий EventBridge, цели и авторизация доставки.
- DevOps Engineer – Professional (DOP-C02) · Задача 4.3: Базовая практика: Сопоставление событий EventBridge, цели и авторизация доставки.
- Data Engineer – Associate (DEA-C01) · Задача 3.1: Базовая практика: Сопоставление событий EventBridge, цели и авторизация доставки.
Подготовка шины и очереди назначения
На этом шаге создайте независимые места, куда поступают события и где совпадающая работа ожидает потребителя.
Используйте AWS View рядом с Terminal, чтобы сравнивать запросы CLI с реальными ресурсами и результатами этой работы. Сохраните предоставленные эталонные данные.
Amazon EventBridge направляет события, описывающие произошедшее. Шина получает события, правило сопоставляет поля, а цель получает совпадающие события. Собственная шина отделяет события приложения от шины по умолчанию. Очередь SQS хранит доставки до их обработки потребителем. Начните в каталоге проекта. Присваивания оболочки сохраняют идентификаторы, возвращённые CLI; --query выбирает нужное поле, а --output text делает его пригодным для следующей команды.
cd /home/labex/project
BUS_NAME=labex-ev01-bus
RULE_NAME=labex-ev01-orders
aws events create-event-bus --name "$BUS_NAME"
QUEUE_URL=$(aws sqs create-queue \
--queue-name labex-ev01-jobs \
--query QueueUrl \
--output text)
QUEUE_ARN=$(aws sqs get-queue-attributes \
--queue-url "$QUEUE_URL" \
--attribute-names QueueArn \
--query Attributes.QueueArn \
--output text)
Ответ шины содержит её ARN, а QUEUE_URL определяет очередь для операций с сообщениями. ARN очереди определяет её в цели или политике разрешений. Эти идентификаторы служат разным целям.
Проверьте оба пустых ресурса:
aws events list-rules --event-bus-name "$BUS_NAME"
aws sqs get-queue-attributes \
--queue-url "$QUEUE_URL" \
--attribute-names ApproximateNumberOfMessages ApproximateNumberOfMessagesNotVisible
Правил пока нет, а очередь не содержит доступных или обрабатываемых сообщений. AWS View показывает вашу собственную шину и пустую очередь. Выполните проверку подготовки.
Сопоставление заказов и авторизация одного правила
На этом шаге подключите правило сопоставления к очереди и авторизуйте доставки только этого правила.

Совпадающее правило выбирает событие; разрешение очереди для исходного правила отдельно допускает его доставку.
Шаблон события — фильтр полей события. source называет производителя, а detail-type — категорию события. Каждый массив ниже перечисляет допустимые значения. Here-document записывает буквальный JSON между маркерами JSON; кавычки маркера предотвращают подстановки оболочки. file:// указывает 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)
Правило включено, но одно совпадение не авторизует доставку. Ресурсная политика очереди должна разрешать отправку сервису EventBridge с ограничением aws:SourceArn этим правилом. Запишите обычную политику JSON; оболочка подставляет ARN вашей очереди и правила.
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
API атрибутов хранит политику как строку JSON, поэтому --rawfile читает этот документ в атрибут Policy. Разрешение охватывает одну очередь и одно исходное правило.
Цель — место назначения правила. Её идентификатор позволяет позже обновить или удалить это подключение:
cat > targets.json <<EOF
[
{
"Id": "order-queue",
"Arn": "$QUEUE_ARN"
}
]
EOF
aws events put-targets \
--rule "$RULE_NAME" \
--event-bus-name "$BUS_NAME" \
--targets file://targets.json
aws events describe-rule --name "$RULE_NAME" --event-bus-name "$BUS_NAME"
aws events list-targets-by-rule --rule "$RULE_NAME" --event-bus-name "$BUS_NAME"
FailedEntryCount равен нулю для конфигурации цели, описанное правило имеет нужный шаблон, а ARN цели соответствует вашей очереди. Теперь AWS View показывает правило и его очередь назначения. События для доставки пока нет. Выполните проверку подключения.
Подтверждение границ сопоставления и доставки
На этом шаге опубликуйте совпадающие и несвязанные события, затем проверьте отсутствие разрешения источника без добавления нового сообщения очереди.
Событие EventBridge имеет поля маршрутизации и полезную нагрузку detail. API PutEvents принимает Detail как строку, закодированную в JSON. Запишите три читаемые записи: один размещённый заказ, одно событие оплаты и одну отмену. jq преобразует каждый объект Detail в требуемую API строку.
cat > event-inputs.json <<EOF
[
{
"EventBusName": "$BUS_NAME",
"Source": "labex.orders",
"DetailType": "OrderPlaced",
"Detail": {
"id": "route-order",
"quantity": 2
}
},
{
"EventBusName": "$BUS_NAME",
"Source": "labex.billing",
"DetailType": "OrderPlaced",
"Detail": {
"id": "billing-event",
"quantity": 9
}
},
{
"EventBusName": "$BUS_NAME",
"Source": "labex.orders",
"DetailType": "OrderCancelled",
"Detail": {
"id": "cancelled-event",
"quantity": 1
}
}
]
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
Ответ публикации сообщает о нуле неудачных записей и идентификаторе события для каждой принятой записи. Только route-order совпадает с обоими полями, поэтому очередь содержит одно доступное сообщение. AWS View показывает полный конверт события: источник, тип detail, аккаунт, регион и detail.
Прочитайте действительное тело, видимое потребителю. Получение обычно скрывает сообщение на время тайм-аута видимости; --visibility-timeout 0 делает эту проверку немедленно видимой снова. Запрос выводит только идентификатор и тело, исключая дескриптор получения из отображения. Эта проверка не завершает бизнес-обработку и не подтверждает сообщение.
fromjson делает каждое тело JSON читаемым, сохраняя его идентификатор сообщения SQS. Он меняет только отображаемый вывод.
aws sqs receive-message \
--queue-url "$QUEUE_URL" \
--max-number-of-messages 10 \
--visibility-timeout 0 \
--output json | jq '[.Messages[] | {MessageId, Body: (.Body | fromjson)}]'
В теле detail.id равен route-order, а detail.quantity равен 2. Записи оплаты и отмены не поступили в эту очередь.
Пример ниже показывает включённое правило сопоставления, его цель очереди и реальное полное событие заказа, включая аккаунт и регион.

Теперь укажите другой ARN источника в политике очереди, сохранив правило и цель включёнными:
jq --arg wrong "${RULE_ARN}-other" '.Statement[0].Condition.ArnEquals["aws:SourceArn"]=$wrong' queue-policy.json > wrong-source-policy.json
jq -n --rawfile policy wrong-source-policy.json '{Policy:$policy}' > wrong-source-attributes.json
aws sqs set-queue-attributes \
--queue-url "$QUEUE_URL" \
--attributes file://wrong-source-attributes.json
cat > event-inputs.json <<EOF
[
{
"EventBusName": "$BUS_NAME",
"Source": "labex.orders",
"DetailType": "OrderPlaced",
"Detail": {
"id": "denied-order",
"quantity": 4
}
}
]
EOF
jq 'map(.Detail |= tojson)' event-inputs.json > denied-event.json
aws events put-events --entries file://denied-event.json
aws sqs get-queue-attributes \
--queue-url "$QUEUE_URL" \
--attribute-names ApproximateNumberOfMessages ApproximateNumberOfMessagesNotVisible
EventBridge принимает это событие, но у правила нет требуемого разрешения очереди. Исходное сообщение остаётся единственным событием в очереди; denied-order отсутствует. При диагностике конвейера различайте принятие события и доставку цели. Это упражнение не исследует повторные попытки доставки.
Восстановите нужное разрешение и проверьте снова:
aws sqs set-queue-attributes \
--queue-url "$QUEUE_URL" \
--attributes file://queue-attributes.json
aws sqs receive-message \
--queue-url "$QUEUE_URL" \
--max-number-of-messages 10 \
--visibility-timeout 0 \
--output json | jq '[.Messages[] | {MessageId, Body: (.Body | fromjson)}]'
Присутствует только исходный route-order. Исправленная политика авторизует последующие доставки; эта работа не зависит от повторной попытки ранее отклонённого события. Выполните проверку маршрутизации.
Удаление конвейера событий
На этом шаге удалите свою цель, правило, собственную шину и временную очередь, сохранив несвязанные ресурсы.
Удалите цель перед удалением её правила. Затем удалите собственную шину и очередь. Удаление очереди отбрасывает синтетическое событие, сохранённое для проверки маршрутизации; его бизнес-результат не заявлялся.
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"
Успешные запросы только для чтения устанавливают оставшиеся ресурсы:
aws events list-event-buses
aws events list-rules --event-bus-name default
aws sqs list-queues
aws dynamodb scan --table-name labex-ev01-reference --query Items
Остаётся только шина по умолчанию, её список правил пуст, URL очередей отсутствуют, а эталонная запись содержит keep unchanged. Ошибки аутентификации или сети не подтверждают удаление. AWS View показывает пустые списки пользовательских ресурсов и сохранённый эталон.
Удалите созданные вами обычные файлы:
rm -f event-inputs.json order-pattern.json queue-policy.json queue-attributes.json targets.json events.json wrong-source-policy.json wrong-source-attributes.json denied-event.json
Выполните проверку очистки перед завершением VM.
Резюме
Вы создали собственную шину EventBridge, сопоставили события размещения заказов и подключили цель очереди с точным разрешением исходного правила. Реальные тела очереди показали, какие события поступили потребителю, а проверка запрещённого источника разделила принятие события и доставку. Вы удалили ресурсы упражнения, сохранив шину по умолчанию и эталонные данные.
Следующая работа преобразует конверт события в меньшую полезную нагрузку, необходимую потребителю очереди.



