[AWS] Lambda+API Gateway로 webhook 받기 : Serverless Architecture
AWS 의 Lambda와 API Gateway를 통해 Serverless Callback URL을 구성하였다.
외부 플랫폼에서 데이터를 우리 플랫폼으로 가져오기 위해서 batch 형태로 데이터를 export할 수 있는 API를 제공받을 수도 있고, 실시간으로 데이터를 수신할 수 있는 webhook을 제공받을 수도 있을 것이다. 가끔은 매뉴얼하게 메일로 파일을 정기적으로 주고받는 경우도 있다.
어떤 방식을 사용하여 데이터를 교환할지는 데이터의 적시성과 중요도, 지속성 등을 고려하여 결정하게 될 것이다.
이번에는 특정 외부 마케팅 플랫폼에서 제공하는 event trigger에 webhook을 붙여서 실시간으로 데이터를 받아올 수 있도록 구성하였다.
사실 이 경우는 실시간 처리까지는 필요 없는 성격의 데이터였는데, 데이터 를 제공하는 플랫폼에서 별도의 data dump가 가능한 API등의 batch 성 처리를 제공하지 않고, webhook으로만 제공해서 선택의 여지가 없었다.
Webhook이란
서버에서 어떠한 작업이 수행 되었을 때 해당 작업이 수행되었음을
HTTP POST
로 알리는 개념을 말합니다. Webhook을 구현한 웹 애플리케이션은, 특정 작업이 수행될 때URL
에 대해POST
방식으로 요청을 생성합니다. 이 때, url(콜백 url)은 웹 애플리케이션을 사용하는 유저가 자신의URL
을 지정할 수 있습니다.
저의 입장에서는 지속적으로 데이터를 폴링(polling)하여 대부분의 경우 불필요한 정보를 받는 대신, webhook을 활용하여 중요한 이벤트가 발생했을 때에만 정보를 수신할 수 있습니다. 이를 활용하여 유저의 커스텀 기능이나 다른 애플리케이션과 통합하거나 기능을 확장할 수 있습니다. (https://docs.iamport.kr/tech/webhook)
Webhook 생성
아래는 event trigger로 보낼 webhook을 설정하는 예시이다.
플랫폼마다 방식이 다르겠지만, 우리가 사용하는 플랫폼의 경우 어떤 이벤트가 발생 시 webhook을 발생시킬 것인지, 어떤 데이터를 body에 넣을 것인지를 설정할 수 있다.
Webhook을 수신할 Callback URL을 테스트해보자.
https://requestbin.com에서 쉽게 테스트해볼 수 있다.
특별히 private mode로 사용해야 하는 경우가 아니면 아니면 계정 생성이나 로그인 필요 없이 바로 URL을 받아서 테스트해볼 수 있다.
자 이제 Lambda와 API gateway를 이용해서 webhook을 받아보자.
Lambda Function
AWS의 Serverless 코드 실행 서비스. 서버 없이 바로 코드만 입력해서 application이나 function을 실행할 수 있다.
실시간 데이터 처리나 모니터링을 위한 코드 구성에 유용하게 활용할 수 있다.
요금은 코드 실행 건당 * 메모리 사용량 *코드 수행 시간 + 외부 데이터 전송량 등을 고려하여 계산되는데, Massive하게 사용하는 케이스가 아니라면, 비용도 상당히 합리적으로 사용할 수 있다. https://aws.amazon.com/ko/lambda/pricing/
그러나 클라우드 서비스를 쓸 땐 항상 긴장해야한다. 막상 invoice를 받아보면 항상 예상 외로 어디서 줄줄 새고 있더라..
아래와 같이 다양한 데이터 소스로 부터 데이터를 받고, Lambda Function으로 데이터를 처리하고, 원하는 목적지로 보낼 수 있다. 코드 실행 시간에 따라 비용이 부과되므로, 가능한 간단하게 처리하도록 하는 것이 좋다.
Lambda Function에서 돌아가는 코드의 경우, 기본적으로 AWS의 Component간 데이터 처리를 위한 케이스들은 javascript 또는 python 등의 blueprint를 제공하기도 한다.
데이터 파이프라인은 아래와 같은 형태로 구성하였다.
람다 이후 단계로 SQS 또는 Kafka로 보내는 것을 고려하였으나, 해당 Webhook에서 trigger되는 데이터의 수가 크지 않아 메세지별로 바로 S3 object로 생성하는 방식으로 결정하였다.
아래는 API Gateway에서 받아서 S3에서 각각 파일을 생성하기 위한 Lambda Function script sample.
(business context를 없애기 위해서 실제 해당 케이스에 사용된 코드에서 일부 변경함.)
1개의 webhook event당 1개의 S3 object가 생성된다. 따라서 많은 트래픽이 발생하는 작업에는 적합하지 않을 것이다.
(해당 케이스에서는 시간당 50–100건 정도 발생 예상)
이제 Webhook을 받기 위한 Callback URL 구성이 필요하다. Lambda에 연결된 API Gateway를 통해 생성하자.
API Gateway
간단하게 웹콘솔을 통해 API endpoint를 생성할 수 있다.
- Security mechanism 선택을 위해서 REST API는 IAM이나 API key 선택이 가능
- HTTP API는 JWT 가능
생성을 마치면 아래와 같은 형태로 Lamda와 연결된 API Gateway가 생성된다.
그리고 이벤트가 발생되면.. 지정한 S3 object가 아래와 같이 착착 쌓이는 것을 확인할 수 있다!
Lambda를 이용한 Webhook 받기는 끝!
이후에 분석플랫폼에서의 활용이 용이하도록 데이터를 제공하기 위해서는 몇가지 가공 작업이 더 필요하다.
- (Spark) Json type file -> parquet file로 재적재
- (Airflow) 위 Job의 스케쥴링
- (Glue) 데이터 S3 Location에 Schema 지정을 통해 테이블을 생성하여, 최종 사용자들이 Athena 등을 통해 편하게 쿼리할 수 있도록 제공
- (SQS) 데이터 생성 완료가 확인되는 시점에 SQS(AWS Simple Queue Service)로 메시지 전송
(해당 데이터가 필요한 다른 팀에서 SQS의 queue를 polling하고 있다가 완료 시점 이후에 데이터를 조회하여 활용한다.)
위 작업까지 모두 포함한 파이프라인은 아래와 같은 형태로 구성된다.