SNS + SQS 사용 시 Payload 간소화하기
https://docs.aws.amazon.com/sns/latest/dg/sns-large-payload-raw-message-delivery.html
결론
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 에 메시지 본문 전달된다)