로컬에서 spring 기반으로 작업하던 소스를 주기적으로 수행할 필요가 생겼다.
개인 pc를 서버처럼 계속 켜두고, spring batch 같은걸로 해도 될 것 같았지만,,
굳이 전기 낭비하면서 켜둘 이유도 없었고, 맥북 에어로 서버 켜놓으면 다른 작업을 아예 못할듯해서
aws lambda 를 활용해보려고 하였다.
1. spring initializr
https://start.spring.io/
초기 환경을 위 페이지에서 다운로드 받아서 하면 되겠다.
gradle java17 3.2.1 등 선택한다.
디펜던시는 그냥 무난하게
- spring web
- lombok
정도만 우선 세팅하고 프로젝트를 열어보자
2. build.gradle
람다를 쓰기 위해서 추가해주어야 하는 부분이 있다.
기존 디펜던시 하위에 필요한것을 추가하면되고, task buildZip 부분은 통째로 추가한다.
참고로 zip 파일로 빌드할때 사용하려고 있는것이다.
※ 코드를 s3로 올리게 된다면 불필요한 부분일 수 있으니 나중에 방향을 바꿔볼 필요가 있겠다.
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
implementation 'com.amazonaws:aws-lambda-java-core:1.2.1' // 추가
}
// 아래 문단은 통째로 추가
task buildZip(type: Zip) {
from compileJava
from processResources
into('lib') {
from configurations.runtimeClasspath
}
}
3. hadler 파일 생성
기본 application.java 파일이 위치한 폴더에 handler 파일을 하나 생성해준다.
(파일명이나 위치는 꼭 고정되지 않아도 되지만, aws에 등록할때 확실하게 챙겨주어야 한다)
나의 경우 'LambdaHandler' 라는 클래스를 하나 생성해주었다.
package com.example.tistory;
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
public class LambdaHandler implements RequestHandler<String, String> {
@Override
public String handleRequest(String input, Context context) {
return input.toUpperCase();
}
}
여기서 핵심은
'implements RequestHandler' 이고, override 를 해서 그 안에서 로직을 구현하는것이 핵심이라고 보면 된다.
우선은 테스트이기 때문에, 위 정도 까지만 작성하고
빌드 후 람다에 업로드를 해보면 좋겠다.
4. 빌드
터미널에서 아래 명령어로 빌드를 수행하면 build 폴더가 생성된다.
./gradlew buildZip
build > distributions 하위에
... SNAPSHOT.zip 인 파일이 생성되는데 이를 람다에 업로드 해보자.
5. 람다 업로드 및 테스트
aws 접속하여 람다 서비스에 들어온 후 우측상단에 "함수 생성"이 있다.
이름은 적당히 기입하고, 런타임에는 Java 17을 선택하자.
(이외에 세세한 설정은 잘 모르겠다)
생성하고 나면, 우측에 zip 파일 업로드하는곳이 있는데 아까 생성산 스냅샷.zip 파일을 업로드 해본다.
후에 하위 런타임 설정 편집을 꼭 들어간다.
핸들러 부분에 위에서 본인이 작성한 패키지 경로에 맞게 기입해주어야 람다가 제대로 찾아가서 수행한다.
나의 경우 자바 클래스 이름을 'LambdaHandler' 라고 하였으니, 이 경로에 hadlerRequest 가 있다고 알려주는것이라고 이해하면 된다.
저장한 후 테스트 텝으로 이동해서 테스트를 하여 성공을 받으면 람다가 알아듣게 잘 구성이 되었다고 생각하면 되겠다!
6. 테스트
우리는 RequestHandler의 매개타입을 Object 로 받지 않고 String 으로 하였었기 때문에,
테스트할때 이렇게 string 형태로 넣어주어야 합니다.
입력된 문자열을 그냥 대문자로 반환하는것이었는데 올바르게 수행된것을 확인할 수 있다.
이렇게 해놓고 로직부분에서 하고싶은 내용을 구현하면 되겠다!