Infra

SNS + SQS 사용 시 Payload 간소화하기

에드박 2023. 3. 31. 11:07

https://docs.aws.amazon.com/sns/latest/dg/sns-large-payload-raw-message-delivery.html

 

Amazon SNS raw message delivery - Amazon Simple Notification Service

Amazon SNS raw message delivery To avoid having Amazon Kinesis Data Firehose, Amazon SQS, and HTTP/S endpoints process the JSON formatting of messages, Amazon SNS allows raw message delivery: When you enable raw message delivery for Amazon Kinesis Data Fir

docs.aws.amazon.com

결론
SNS -> SQS 구독 시 메시지 본문에 전달했던 값만 받고싶으면 SNS 구독을 생성할 때 원시 메시지 전송 활성화를 체크하자

 

 

SNS에서 주제를 생성하고 SQS 에서 메시지를 구독했을 때 필요하지 않은 값들이 Payload에 채워져서 오는 이슈가 있었다.

 

원하는 것은 payload에 메시지 본문만 담겨서 아래와 같이 오기를 바랬다

{
  "memberId" : 1234
}

 

하지만 SQS 에서 polling 한 메시지는 payload 메시지에 SNS 메타데이터가 함께 전달됐다.

{
  "Type" : "Notification",
  "MessageId" : "c0db8760-e7b4-5914-9743-dbc0dd264675",
  "TopicArn" : ~~~,
  "Message" : "{\"memberId\":7}", <--- 해당 값만 필요한데..
  "Timestamp" : "2023-03-31T01:33:06.145Z",
  "SignatureVersion" : "1",
  "Signature" : ~~~
  "SigningCertURL" : ~~~
  "UnsubscribeURL" : ~~~
}

 

SQS와 연결한 프로젝트는 kotlin + springboot + spring-cloud-starter-aws-messaging 을 사용하고있었다.

우선은 Map 타입으로 매핑해서 'Message' 값을 꺼내 사용하는 쪽으로 구현했다.

 

다음은 spring-cloud-starter-aws-messaging 에서 payload 전체를 매핑하는 객체를 제공하는지 찾아봤다.

결론을 말하면 payload 전체를 매핑한 객체는 찾지 못했다.

 

하지만 매핑해주는 객체를 찾아보던 중

SQS 에 직접 메시지를 생성하고 polling 할 때는 payload 가 메시지 본문만 왔다는 기억이 나서

SNS 에서 `payload 를 간단하게 보내는 기능이 있지 않을까?` 하여 찾아봤다.

 

https://stackoverflow.com/questions/10898538/amazon-sns-sqs-message-body

https://docs.aws.amazon.com/sns/latest/dg/sns-large-payload-raw-message-delivery.html

 

SNS 에서 구독할 대상을 생성할 때 원시 메시지 전달 하도록 활성화할 수 있었다.

(원시 메시지 전달을 활성화하면 payload 에 메시지 본문 전달된다)