본문 바로가기
Spring/SpringBoot

[SpringBoot] AWS Lambda와 API Gateway로 Serverless 구성하기 (2) - Lambda 생성해서 배포하기

by J4J 2023. 4. 30.
300x250
반응형

안녕하세요. 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 접속 ]

 

S3 접속

 

 

 

[ 2. 버킷 만들기 ]

 

왼쪽에 있는 버킷 메뉴를 선택한 뒤 오른쪽에 있는 버킷 만들기 버튼을 클릭해 줍니다.

 

버킷 만들기

 

 

 

[ 3. 버킷 정보 입력 ]

 

각자의 상황에 맞게 원하시는 정보들을 입력해 주시면 되며 저 같은 경우는 다음과 같이 입력한 뒤 생성했습니다.

 

실제 입력할 때 화면에 보이지 않는 정보들은 따로 입력한 것이 없습니다.

 

버킷 정보 - 일반 구성

 

버킷 정보 - 객체 소유권

 

버킷 정보 - 액세스 차단 설정

 

버킷 정보 - 버전 관리

 

버킷 정보 - 기본 암호화

 

 

 

[ 4. jar 파일 업로드 ]

 

버킷 생성을 완료했으면 버킷에 들어가 위에서 빌드할 때 만들어진 *-aws.jar 파일을 업로드하겠습니다.

 

업로드 전

 

업로드 후

 

 

 

[ 5. 객체 URL 확인 ]

 

업로드를 완료했다면 상세 정보로 들어가 객체 URL을 확인해 줍니다.

 

객체 URL은 Lambda에 배포할 때 활용될 예정입니다.

 

객체 URL 확인

 

 

 

 

Lambda 세팅

 

S3에 jar 파일 업로드가 완료되었다면 Lambda를 생성하여 배포해 보겠습니다.

 

 

 

[ 1. Lambda 접속 ]

 

Lambda 접속

 

 

 

[ 2. 함수 생성 ]

 

왼쪽에 있는 함수 메뉴를 선택한 뒤 오른쪽에 있는 함수 생성 버튼을 클릭해 줍니다.

 

함수 생성

 

 

 

[ 3. 함수 정보 입력 ]

 

함수 이름을 입력하고 런타임은 사용하시는 Java 버전에 맞게 선택해 주시면 됩니다.

 

정보 입력이 완료되었다면 생성을 해줍니다.

 

함수 정보 입력

 

 

 

[ 4. 코드 소스 업로드 ]

 

함수 생성이 완료되었다면 코드 소스를 업로드해 줍니다.

 

코드 소스 항목에서 "에서 업로드" 버튼을 클릭한 뒤 Amazon S3 위치를 선택해 줍니다.

 

그리고 URL에 위에 S3에 업로드해 둔 jar파일의 객체 URL을 입력해 줍니다.

 

에서 업로드

 

S3 객체 URL 입력

 

 

 

 

[ 5. 핸들러 등록 ]

 

이번엔 런타임 설정 항목에서 소스에 설정해 둔 핸들러를 등록하겠습니다.

 

"편집" 버튼을 클릭한 뒤 다음과 같이 핸들러의 패키지 경로를 포함한 클래스 정보를 입력해 줍니다.

 

런타임 설정 편집

 

핸들러 등록

 

 

 

[ 6. 일반 구성 설정 ]

 

이번엔 구성 탭으로 넘어가줍니다.

 

배포되는 파일이 어떤지에 따라 기본 설정 값에 문제가 발생될 수 있습니다.

 

배포 파일에 맞게 메모리, 스토리지, 제한 시간 등을 수정해 주시면 됩니다.

 

저는 다음과 같이 설정해 보겠습니다.

 

일반 구성 설정

 

기본 설정

 

 

 

[ 7. 환경 변수 설정 ]

 

이번엔 환경 변수를 설정하겠습니다.

 

환경 변수에서는 타임 존 설정과 Application 클래스를 메인 클래스로 다음과 같이 등록해 주시면 됩니다.

 

환경 변수 설정

 

환경 변수 설정

 

 

 

[ 8. 테스트 ]

 

모든 설정이 완료되었다면 테스트를 해보겠습니다.

 

테스트 탭으로 넘어와서 이벤트 JSON에는 이전 글에서 포스트맨으로 진행했던 테스트와 동일한 값을 입력해 준 뒤 오른쪽 위에 있는 테스트 버튼을 클릭해 줍니다.

 

테스트

 

 

 

그러면 약간의 시간이 지난 후 다음과 같은 결과를 볼 수 있습니다.

 

이전 글에서 포스트맨으로 했을 때와 다른 결과가 나오는 것을 확인할 수 있습니다.

 

이유는 위에서 전달받은 Request 값을 변경했기 때문입니다.

 

다음 글에서 실제로 APIGateway에 Lambda를 적용하여 API 호출이 올바르게 되는지 확인해보도록 하겠습니다.

 

테스트 결과

 

 

 

 

 

 

 

 

이상으로 AWS Lambda와 API Gateway로 Serverless 구성하기 두 번째인 Lambda 생성해서 배포하는 방법에 대해 간단하게 알아보는 시간이었습니다.

 

읽어주셔서 감사합니다.

 

 

 

728x90
반응형

댓글