micro service간의 통합을 위해 queue를 적극적으로 사용하려고 하면서 system 외부로 부터의 request는 어떻게 처리해야 할까 고민을 하게 되었다. 그리고 결국 AWS APIGateway를 사용하기로 결정이 났다. 사실 처음에는 system 외부 다른 서버들이 바로 SQS SDK를 사용하여 통신하면 될 것인데 SDK의 dependency도 제거 하자는 의견이었다. (개인적은 생각으로는 AWS SDK가 대다수의 많은 platform을 커버하고 있고 SQS 자체도 http를 지원하고 있기 때문에 API를 앞에 두는게 무슨 의미가 있나?라고 생각 했지만 REST로 구현 한다면 client들의 플랫폼별 구현은 통일 되는것은 분명해 보인다.)

일단 API server로는 AWS API gateway -> SQS -> service 이런 식으로 구성하였고 각 micro service들은 SQS를 통해 메세지를 받아 처리하는 식으로 추가될 것이다. 경우에 따라서는 SQS가 안 붙을 수 있겠지만 결국 API gateway를 통해서 외부 request를 처리하도록 하였다.

그림과 같이 마이크로 서비스 앞에 SQS를 적용하면서 API gateway와 연동 되어야 했는데 같은 AWS 서비스니까 클릭만으로 될꺼야...라고 넘겨짚은 것이 화근이었다. 분명 다음 그림 같이 API method에는 AWS service의 SQS를 고르는게 있어서 다 된 줄 알았다.

오! SQS 고르기만 하면 되나 보네!?

역시 AWS!! 라고 속으로 좋아하는 순간 test 결과는?

역시 꽁짜는 없었다...

error message가 "access to the resource is denied."... Execution role을 다시 봤지만 문제 없었다... 뭐가 문제지???하며 보내는 쪽이 문제 없다면 받는쪽은? 하는 생각이 들었고 SQS의 spec을 뒤지기 시작함.

금방 관련 내용을 찾아 내었다. https://docs.aws.amazon.com/ko_kr/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-making-api-requests.html

내용인 즉슨... 아래와 같음...

아... form-urlencoded로 보내야 되는거네... 그런데 API gateway를 쓰는데 어떻게 변환해??? 가능해??? 당황하고 있을 때 역시 이 내용도 정리된 내용이 있었다.

http://hunrik.me/posts/put-message-straight-into-sqs

 

How to put request straight into SQS

You dont need any fancy lambda to post into SQS

hunrik.me

감사해요 hunrik님~ 다음은 Integration Request에서 바꾸는 내용이다.

보낼 때 위 그림같이 header와 body를 변환해서 SQS API대로 넣어준다. 결론은?

해피엔딩~ ^^

+ Recent posts