안녕하세요. J4J입니다.
이번 포스팅은 AWS Lambda와 API Gateway로 Serverless 구성하기 두 번째인 Lambda 생성해서 배포하는 방법에 대해 적어보는 시간을 가져보려고 합니다.
이전 글
[SpringBoot] AWS Lambda와 API Gateway로 Serverless 구성하기 (1) - Spring 세팅 및 로컬 테스트
Spring 세팅
이전 글을 확인해보시면 로컬에서 Lambda에 배포할 Spring 코드를 작성하여 테스트한 것을 확인해 볼 수 있습니다.
해당 설정을 기반으로 Lambda에 배포하기 위한 추가 설정을 다음과 같이 진행해보겠습니다.
[ 1. 의존성 추가 ]
// Lambda Deploy
import com.github.jengelman.gradle.plugins.shadow.transformers.*
// Lambda Deploy
buildscript {
dependencies {
classpath "com.github.jengelman.gradle.plugins:shadow:5.1.0"
classpath("org.springframework.boot.experimental:spring-boot-thin-gradle-plugin:1.0.28.RELEASE")
}
}
dependencies {
// Lambda Local
implementation 'org.springframework.cloud:spring-cloud-function-web:3.2.8'
// Lambda Deploy
implementation 'org.springframework.cloud:spring-cloud-function-adapter-aws:3.2.8'
implementation 'com.amazonaws:aws-lambda-java-events:3.11.0'
implementation 'com.amazonaws:aws-lambda-java-core:1.2.2'
}
// Lambda Deploy
apply plugin: 'com.github.johnrengelman.shadow'
apply plugin: 'org.springframework.boot.experimental.thin-launcher'
assemble.dependsOn = [shadowJar, thinJar]
// Lambda Deploy
shadowJar {
classifier = 'aws'
dependencies {
exclude(
dependency("org.springframework.cloud:spring-cloud-function-web:3.2.8"))
}
// Required for Spring
mergeServiceFiles()
append 'META-INF/spring.handlers'
append 'META-INF/spring.schemas'
append 'META-INF/spring.tooling'
transform(PropertiesFileTransformer) {
paths = ['META-INF/spring.factories']
mergeStrategy = "append"
}
}
[ 2. Handler 추가 ]
Handler는 Lambda를 생성할 때 사용되며 다음과 같이 만들어주시면 됩니다.
package com.lambda.apigateway.handler;
import org.springframework.cloud.function.adapter.aws.FunctionInvoker;
public class LambdaApiGatewayHandler extends FunctionInvoker {
}
[ 3. Lambda 실행 함수 등록 ]
Lambda에 배포되었을 때 실행될 함수를 등록해줘야 합니다.
application.properties (or application.yml) 파일에 Application에 등록했었던 Bean을 다음과 같이 설정해 줍니다.
spring.cloud.function.definition=lambdaApiGatewayFunctionBean
[ 4. Request 데이터 변경 ]
최종 목적은 APIGateway를 이용하여 Lambda가 사용되는 것이기 때문에 이전 글에 작성해둔 소스코드를 APIGateway를 위해 사용되는 Request로 변경해 주겠습니다.
package com.lambda.apigateway.function;
import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyRequestEvent;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
@Component
@Slf4j
public class LambdaApiGatewayFunction implements Function<APIGatewayProxyRequestEvent, List<String>> {
@Override
public List<String> apply(APIGatewayProxyRequestEvent apiGatewayProxyRequestEvent) {
log.info("lambda apply 수행");
List<String> strings = new ArrayList<>();
if (StringUtils.hasText(apiGatewayProxyRequestEvent.getBody())) {
Map<String, Object> map;
try {
map = new ObjectMapper().readValue(apiGatewayProxyRequestEvent.getBody(), Map.class);
} catch (JsonProcessingException e) {
throw new RuntimeException(e);
}
strings.add(map.get("title").toString());
strings.add(map.get("name").toString());
}
strings.add("sample");
log.info("lambda apply 종료");
return strings;
}
}
package com.lambda.apigateway;
import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyRequestEvent;
import com.lambda.apigateway.function.LambdaApiGatewayFunction;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import java.util.List;
import java.util.function.Function;
@SpringBootApplication
public class LambdaApiGatewayApplication {
@Bean
public Function<APIGatewayProxyRequestEvent, List<String>> lambdaApiGatewayFunctionBean() {
return new LambdaApiGatewayFunction();
}
public static void main(String[] args) {
SpringApplication.run(LambdaApiGatewayApplication.class, args);
}
}
[ 5. 빌드 ]
위의 설정을 모두 완료했다면 빌드를 해줍니다.
Gradle 기준으로 build/libs 경로에 다음과 같이 *-aws.jar 파일이 만들어지면 정상적으로 수행된 것입니다.
해당 파일은 Lambda에 배포할 때 업로드 될 파일입니다.
S3 세팅
빌드된 파일을 직접적으로 Lambda에 업로드해도 문제 될 것은 없지만 AWS에서는 빌드 파일이 큰 경우 S3를 통해 배포하는 것을 선호하기에 S3 설정까지 해보겠습니다.
빌드해서 만들어진 jar 파일을 S3에 보관하고 Lambda에는 S3에 보관되어 있는 jar 파일 경로를 바라보도록 설정하겠습니다.
[ 1. S3 접속 ]
[ 2. 버킷 만들기 ]
왼쪽에 있는 버킷 메뉴를 선택한 뒤 오른쪽에 있는 버킷 만들기 버튼을 클릭해 줍니다.
[ 3. 버킷 정보 입력 ]
각자의 상황에 맞게 원하시는 정보들을 입력해 주시면 되며 저 같은 경우는 다음과 같이 입력한 뒤 생성했습니다.
실제 입력할 때 화면에 보이지 않는 정보들은 따로 입력한 것이 없습니다.
[ 4. jar 파일 업로드 ]
버킷 생성을 완료했으면 버킷에 들어가 위에서 빌드할 때 만들어진 *-aws.jar 파일을 업로드하겠습니다.
[ 5. 객체 URL 확인 ]
업로드를 완료했다면 상세 정보로 들어가 객체 URL을 확인해 줍니다.
객체 URL은 Lambda에 배포할 때 활용될 예정입니다.
Lambda 세팅
S3에 jar 파일 업로드가 완료되었다면 Lambda를 생성하여 배포해 보겠습니다.
[ 1. Lambda 접속 ]
[ 2. 함수 생성 ]
왼쪽에 있는 함수 메뉴를 선택한 뒤 오른쪽에 있는 함수 생성 버튼을 클릭해 줍니다.
[ 3. 함수 정보 입력 ]
함수 이름을 입력하고 런타임은 사용하시는 Java 버전에 맞게 선택해 주시면 됩니다.
정보 입력이 완료되었다면 생성을 해줍니다.
[ 4. 코드 소스 업로드 ]
함수 생성이 완료되었다면 코드 소스를 업로드해 줍니다.
코드 소스 항목에서 "에서 업로드" 버튼을 클릭한 뒤 Amazon S3 위치를 선택해 줍니다.
그리고 URL에 위에 S3에 업로드해 둔 jar파일의 객체 URL을 입력해 줍니다.
[ 5. 핸들러 등록 ]
이번엔 런타임 설정 항목에서 소스에 설정해 둔 핸들러를 등록하겠습니다.
"편집" 버튼을 클릭한 뒤 다음과 같이 핸들러의 패키지 경로를 포함한 클래스 정보를 입력해 줍니다.
[ 6. 일반 구성 설정 ]
이번엔 구성 탭으로 넘어가줍니다.
배포되는 파일이 어떤지에 따라 기본 설정 값에 문제가 발생될 수 있습니다.
배포 파일에 맞게 메모리, 스토리지, 제한 시간 등을 수정해 주시면 됩니다.
저는 다음과 같이 설정해 보겠습니다.
[ 7. 환경 변수 설정 ]
이번엔 환경 변수를 설정하겠습니다.
환경 변수에서는 타임 존 설정과 Application 클래스를 메인 클래스로 다음과 같이 등록해 주시면 됩니다.
[ 8. 테스트 ]
모든 설정이 완료되었다면 테스트를 해보겠습니다.
테스트 탭으로 넘어와서 이벤트 JSON에는 이전 글에서 포스트맨으로 진행했던 테스트와 동일한 값을 입력해 준 뒤 오른쪽 위에 있는 테스트 버튼을 클릭해 줍니다.
그러면 약간의 시간이 지난 후 다음과 같은 결과를 볼 수 있습니다.
이전 글에서 포스트맨으로 했을 때와 다른 결과가 나오는 것을 확인할 수 있습니다.
이유는 위에서 전달받은 Request 값을 변경했기 때문입니다.
다음 글에서 실제로 APIGateway에 Lambda를 적용하여 API 호출이 올바르게 되는지 확인해보도록 하겠습니다.
이상으로 AWS Lambda와 API Gateway로 Serverless 구성하기 두 번째인 Lambda 생성해서 배포하는 방법에 대해 간단하게 알아보는 시간이었습니다.
읽어주셔서 감사합니다.
'Spring > SpringBoot' 카테고리의 다른 글
[SpringBoot] SpringBatch 사용하기 (1) - Scheduler를 이용하여 Tasklet, Chunk 배치 만들기 (0) | 2023.08.22 |
---|---|
[SpringBoot] AWS Lambda와 API Gateway로 Serverless 구성하기 (4) - GitLab으로 Lambda 자동배포하기 (0) | 2023.05.10 |
[SpringBoot] AWS Lambda와 API Gateway로 Serverless 구성하기 (1) - Spring 세팅 및 로컬 테스트 (0) | 2023.04.28 |
[SpringBoot] MockMVC를 이용하여 API 테스트하기 (0) | 2023.04.09 |
[SpringBoot] WebClient를 이용하여 외부 API 호출하기 (1) | 2023.03.15 |
댓글