대기열 소비자를 위한 주문 이벤트 변환

AWSBeginner
지금 연습하기

소개

생산자는 전체 주문 이벤트를 보내지만 소비자에게는 주문 ID와 수량만 필요합니다. 라우팅 필터를 유지하면서 두 이벤트를 간결한 대기열 메시지로 변환합니다.

EventBridge로 주문 이벤트 라우팅을 먼저 완료하세요. 독립적인 VM에서 이 파이프라인을 구축하세요. 이전 버스, 규칙이나 대기열은 재사용하지 않습니다.

인증 시험 관련 주제

이 실습은 다음 시험 주제에 대한 실습 경험을 제공합니다.

독립적인 라우팅 리소스 준비

이 단계에서는 주문 이행 작업을 위한 사용자 지정 버스와 빈 대기열을 만듭니다.

Terminal 옆에서 AWS View를 사용하여 CLI 쿼리를 이 실습의 실제 리소스 및 결과와 비교하세요. 제공된 참조 데이터를 유지하세요.

생산자 이벤트에는 라우팅 메타데이터, 고객 정보와 중첩된 주문이 포함됩니다. 대기열 소비자에게는 주문 ID와 수량만 필요합니다. 입력 변환은 이벤트에서 필드를 선택하여 대상 본문을 구성하고 소비자가 생산자의 봉투에 의존하는 정도를 줄입니다.

이 새 작업 공간에는 설정된 CLI 접근과 관련 없는 참조 데이터가 있습니다. EV01 리소스는 재사용하지 않습니다. 프로젝트 디렉터리에서 시작하세요. 셸 할당은 반환된 식별자를 저장하고 --query는 응답 필드를 선택하며 --output text는 다음 명령에서 해당 필드를 재사용할 수 있게 합니다.

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)

버스 ARN은 이벤트 대상을 식별합니다. 대기열 URL은 메시지 작업에 사용하며 ARN은 규칙 대상을 식별합니다. 초기 상태를 확인하세요.

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

규칙이나 메시지가 없습니다. Terminal 옆의 AWS View를 클릭하여 동일한 사용자 지정 버스와 빈 대기열을 확인하세요. 준비 검사를 실행하세요.

입력 변환기가 있는 대상 연결

이 단계에서는 접수된 주문을 일치시키고 규칙에 권한을 부여하며 간결한 소비자 페이로드를 정의합니다.

이벤트 세부 정보에서 소비자 본문으로

중첩된 주문 필드를 선택하고 소비자의 id/quantity 본문을 구성하세요. 라우팅 필터는 유지합니다.

규칙의 패턴은 생산자와 이벤트 범주를 일치시킵니다. 따옴표가 있는 here-document는 셸 확장 없이 리터럴 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)

대기열에는 정확한 소스 규칙 권한이 필요합니다. 대기열과 규칙 ARN을 사용하여 일반 정책 JSON을 작성하세요. 이후 --rawfile은 이를 문자열 값인 SQS Policy 속성으로 인코딩합니다.

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

InputPathsMap은 JSONPath로 선택한 필드에 이름을 부여합니다. $는 이벤트의 루트를 의미하고 $.detail.order.id는 중첩된 주문 ID를 선택합니다. InputTemplate은 꺾쇠괄호 자리 표시자로 메시지를 구성합니다. ID 자리 표시자는 JSON 문자열 따옴표 안에 있습니다. 수량은 JSON 숫자이므로 따옴표가 없습니다. 예시는 간단한 ID와 양의 정수 수량을 사용합니다.

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는 0입니다. 나열된 대상에는 본인의 대기열 ARN과 두 매핑 경로/템플릿이 포함됩니다. 설정이 성공해도 실제 전달 테스트가 필요합니다. AWS View는 활성화된 규칙과 변환기를 보여 주며 대기열은 여전히 비어 있습니다. 연결 검사를 실행하세요.

두 실제 소비자 페이로드 비교

이 단계에서는 서로 다른 접수 주문 두 개를 게시하고 생성된 대기열 메시지를 확인합니다.

이벤트 세부 정보를 일반 JSON 객체로 작성하세요. PutEvents는 각 Detail이 JSON으로 인코딩된 문자열이어야 합니다. 아래의 짧은 jq 명령은 해당 필드만 변환합니다. 각 이벤트에는 주문 이행 소비자에게 필요하지 않은 테스트용 고객 정보도 포함됩니다. 세 번째 취소 이벤트는 라우팅 필터가 여전히 적용되는지 테스트합니다.

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

세 이벤트는 모두 접수되지만 접수 주문 두 개만 일치합니다. 대기열에는 사용 가능한 메시지 두 개가 있습니다. 표시 제한 시간을 0으로 하여 수신하면 확인 직후 메시지를 다시 사용할 수 있습니다. 쿼리는 메시지 ID와 본문만 표시하여 수신 핸들을 비공개로 유지합니다.

fromjson은 SQS 메시지 ID를 유지하면서 각 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)}]'

본문은 {"id":"transform-order-a","quantity":2}와 {"id":"transform-order-b","quantity":4}입니다. 순서는 평가하지 않습니다. 각각 서로 다른 메시지 ID와 해당 이벤트에서 나온 값을 갖습니다. 둘 다 고객 이메일, 라우팅 메타데이터나 중첩된 order 객체를 포함하지 않습니다. 취소된 주문은 없습니다. 이는 변환과 전달을 증명하며 주문 이행 완료나 메시지 확인 처리를 증명하지는 않습니다.

AWS View는 대상 매핑을 실제 간결한 대기열 본문 옆에 보여 줍니다.

아래 예시는 두 중첩 필드 매핑과 두 실제 간결한 소비자 메시지를 보여 줍니다.

AWS View에 표시된 변환된 주문 메시지 두 개

페이로드 검사를 실행하세요.

일회용 파이프라인 제거

이 단계에서는 라우팅 리소스를 제거하고 관련 없는 상태를 유지합니다.

규칙보다 먼저 대상을 제거한 다음 사용자 지정 버스와 대기열을 삭제하세요. 대기열에는 확인용 테스트 메시지만 들어 있습니다. 삭제하면 비즈니스 처리를 주장하지 않고 이를 버립니다.

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-ev02-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

VM을 종료하기 전에 정리 검사를 실행하세요.

요약

중첩된 주문 필드를 간결한 SQS 소비자 데이터 형식에 매핑하고 두 실제 이벤트의 서로 다른 값을 검증했으며 이벤트 필터링과 소스 규칙 권한을 유지했습니다. 참조 데이터를 유지하면서 일회용 파이프라인을 제거했습니다.

다음 단원에서는 주문 워크플로에서 실제 비즈니스 작업을 연결합니다.