본문 바로가기

개발일기장

AWS 람다로 서버리스 서비스 만들기 (1) 로컬에서 테스트

사이드 프로젝트 Xuni를 진행하고 있습니다. 빨간색으로 밑줄 그어진 부분은 클라이언트의 요청이 없더라도 서버가 특정 이벤트를 마주하면 처리해야되는 부분입니다. 모두 시작일, 종료일이라는 트리거?가 존재합니다. 스프링 스케줄러를 이용하면 간단하게 해결가능합니다.

 

 

 

다만, 스케줄러를 이용하면 다음과 같은 고민이 필요할지도 모릅니다.

(1) 멀티 서버 환경에서 서버 수 만큼 실행되는 스케줄러

 이 경우 ShedLock이라는 것을 통해 해결할 수 있다고 합니다.

(2) 스케줄러 동작 여부

슬랙 API를 이용하면 이 또한 해결할 수 있긴 합니다.

 

요즘 AWS 책 한 권을 사서 조금씩 보고있는데요. 무슨 바람이 든건지 AWS 람다를 활용하면 이 문제를 조금 더 효율적으로 해결할 수 있을 것 같다는 생각이 들었습니다.

 

이번 포스팅에서는 로컬 환경에서 서버리스의 주축인 람다 함수를 스프링을 이용해서 만들어보겠습니다.

 

목차

1. 삽질을 통해 배운 것..

2. 로컬 환경에 람다 함수 적용해보기


삽질을 통해 배운 것

 

(1) 초보자는 스프링 클라우드는 3.x.x 버전을 주입 받자

spring.io AWS Lambda 문서를 참고하면 스프링을 통해 AWS 람다를 사용하려면 FunctionInvoker 클래스가 필요하다고 하다. 이 FunctionInvoker 클래스를 상속받은 객체 정보를 아래 핸들러 정보에 입력해주어야 AWS 람다에서 이를 람다 함수로 인식할? 수 있다고 하는 것 같다.

 

AWS 람다 함수 런타임 설정

 

문제는 FunctionInvoker 클래스를 사용하기 위해서는 4.0.9 이상을 주입 받아야 합니다.

implementation 'org.springframework.cloud:spring-cloud-function-web:4.0.0'

 

분명 공식 문서에 따르면 되야하는 것 같은데... 잘 안되서 블로그들을 찾아봤는데도 잘 안되었다... 그래서 3시간 정도 삽질하고 버전 문제인가? 라는 추측을 했다. (물론 내가 못해서 그럴 확률이 더 높겠지만...ㅎ)

 

3.x.x 버전까지는 Functionlnvoker 대신 SpringBootStreamHandler 를 이용했던 것 같습니다. 자세한 내용은 spring-clloud-function 2.1.0 공식 문서를 참고하면 될 것 같습니다. 

 

(2) 잘 모르면 속 편하게 자바 11이하 버전을 사용하자

이 말은 즉슨 스프링 부트도 2.x.x 버전을 사용해야한다는 말인데요. AWS에서 다양한 런타임 환경을 제공해주고 있습니다. 자바 17은 보이지 않죠

 

 

 

물론 사용자 지정 런타임이 있기는 하지만 저는 예상치 못한 오류를 런타임 환경으로 돌리기 싫기 때문에.. 자바 11, 스프링부트 2.x.x 버전을 사용하기로 했습니다.

 


로컬 환경에 람다 함수 적용해보기

Spring Cloud Function 문서를 참고하였습니다.

 

 

우선 람다 함수를 구현하기 위해서는 자바8에서 제공하는 함수형 인터페이스 중 3가지를 선택할 수 있습니다.

 

 

구현 하는 방법은 매우 간단합니다. 함수형 인터페이스를 구현해서 스프링 빈으로 등록하면 됩니다.

 

아래와 같이 @Bean으로 직접 등록할 수 있습니다.

 

 

로직이 조금 복잡하다면 @Component 를 통해 오토 스캔 대상이 되도록 하고 로직을 작성해주면 됩니다. 

 

 

실제로 호출되는지 확인해봅시다. 저는 포스트맨을 통해 람다 함수를 테스트하겠습니다. 두 가지만 알면 테스트 할 수 있습니다.

 

1. HTTP 메서드는 POST를 선택해야 합니다.

2. 각 람다 함수의 엔드포인트는 스프링 빈 이름으로 설정됩니다. 

 

스프링 빈으로 등록된 GroupStatusHandler 람다 함수를 먼저 테스트 해보겠습니다.

스프링 빈 네이밍 규칙은 빈으로 등록될 클래스의 이름에서 첫 글자를 소문자로 만들고 빈 이름으로 등록합니다.

//예시 
GroupStatusHandler -> groupStatusHandler

 

이제 호출해봅시다.

 

 

 

body에 담겨온 groupStatus 값이 START기 때문에 check는 true를 반환해주었습니다. 다음 포스팅에서는 이렇게 만들어진 람다 함수들을 AWS Lambda에 올려보도록 하겠습니다.