본문 바로가기
Spring/SpringBoot

[SpringBoot] AWS Lambda로 배치 만들기 (2) - Lambda 생성해서 배포하기

by J4J 2022. 12. 12.
300x250
반응형

안녕하세요. J4J입니다.

 

이번 포스팅은 AWS Lambda로 배치 만들기 두 번째인 Lambda 생성해서 배포하는 방법에 대해 적어보는 시간을 가져보려고 합니다.

 

 

 

이전 글

 

[SpringBoot] AWS Lambda로 배치 만들기 (1) - Spring 세팅 및 로컬 테스트

 

 

반응형

 

 

Spring 세팅

 

이전 글을 참고하면 DB에 로그 데이터를 쌓는 기본적인 비즈니스 로직 구성이 완료되어 있습니다.

 

이번엔 구성되어 있는 비즈니스 로직들이 Lambda에 배포했을 때 정상적으로 동작될 수 있는 추가 설정들을 해보도록 하겠습니다.

 

 

 

[ 1. 의존성 추가 ]

 

<dependencies>
    <!-- Lambda 배포 -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-function-adapter-aws</artifactId>
        <version>3.2.8</version>
    </dependency>

    <!-- Lambda 배포 -->
    <dependency>
        <groupId>com.amazonaws</groupId>
        <artifactId>aws-lambda-java-events</artifactId>
        <version>3.11.0</version>
    </dependency>

    <!-- Lambda 배포 -->
    <dependency>
        <groupId>com.amazonaws</groupId>
        <artifactId>aws-lambda-java-core</artifactId>
        <version>1.2.2</version>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <excludes>
                    <exclude>
                        <groupId>org.projectlombok</groupId>
                        <artifactId>lombok</artifactId>
                    </exclude>
                </excludes>
            </configuration>

            <!-- Lambda 배포 -->
            <dependencies>
                <dependency>
                    <groupId>org.springframework.boot.experimental</groupId>
                    <artifactId>spring-boot-thin-layout</artifactId>
                    <version>1.0.28.RELEASE</version>
                </dependency>
            </dependencies>
        </plugin>

        <!-- Lambda 배포 -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <configuration>
                <createDependencyReducedPom>false</createDependencyReducedPom>
                <shadedArtifactAttached>true</shadedArtifactAttached>
                <shadedClassifierName>aws</shadedClassifierName>
            </configuration>
        </plugin>
    </plugins>
</build>

 

 

 

[ 2. Handler 추가 ]

 

Lambda에 등록할 Handler 추가가 필요합니다.

 

Handler는 추가한 의존성을 활용하여 다음과 같이 작성해주시기만 하면 됩니다.

 

package com.lambda.batch.handler;

import org.springframework.cloud.function.adapter.aws.FunctionInvoker;

public class LambdaLogHandler extends FunctionInvoker {

}

 

 

 

[ 3. Lambda 동작 함수 등록 ]

 

이번엔 Lambda가 실행할 함수를 등록해줘야 합니다.

 

application.properties (or application.yml) 파일에 다음과 같이 기존에 만들어 뒀던 Consumer Bean을 등록해주시면 됩니다.

 

spring.cloud.function.definition=lambdaLogConsumerBean

 

 

 

[ 4. 파일 빌드 ]

 

설정이 완료되었다면 빌드 처리해주시면 됩니다.

 

그러면 다음과 같이 *-aws.jar 형태의 파일이 빌드된 것을 확인할 수 있습니다.

 

해당 파일이 Lambda에 사용되는 파일입니다.

 

파일 빌드

 

 

 

 

S3 세팅

 

빌드 파일을 바로 Lambda에 업로드해도 되지만 AWS에서는 빌드 파일의 크기가 클수록 S3에 업로드하는 것을 추천하고 있습니다.

 

그렇기 때문에 배포를 위한 S3를 생성한 뒤 배포할 jar파일을 관리하고 Lambda에서 해당 파일을 가져다 사용할 수 있도록 해보겠습니다.

 

 

 

[ 1. S3 접속 ]

 

S3 접속

 

 

 

[ 2. 버킷 만들기 ]

 

좌측에 있는 버킷 메뉴를 선택한 뒤 우측에 있는 버킷 만들기 버튼을 클릭합니다.

 

버킷 만들기

 

 

 

[ 3. S3 정보 입력 - 일반 구성 ]

 

일반 구성에는 사용할 버킷의 이름과 리전을 선택해주면 됩니다.

 

S3 정보 입력 - 일반 구성

 

 

 

[ 4. S3 정보 입력 - 객체 소유권, 퍼블릭 액세스 설정 ]

 

다음 정보들을 상황에 따라 자유롭게 설정해주시면 됩니다.

 

일반적으로 보안을 위해서는 ACL 비활성화와, 액세스 차단을 해주시는 것이 좋기에 저는 다음과 같이 설정하겠습니다.

 

S3 정보 입력 - 객체 소유권, 퍼블릭 액세스 설정

 

 

 

[ 5. S3 정보 입력 - 버킷 버전, 암호화 설정 ]

 

버킷 버전과 암호화 설정도 자유롭게 설정해주시면 됩니다.

 

저는 기본 설정값을 그대로 활용하여 다음과 같이 설정했습니다.

 

모든 정보 입력이 완료되었다면 버킷을 최종적으로 생성해주시면 됩니다.

 

S3 정보 입력 - 버킷 버전, 암호화 설정

 

 

 

[ 6. jar파일 업로드 ]

 

버킷을 생성했다면 생성된 버킷에 들어가 위에서 만들어둔 jar파일을 업로드하겠습니다.

 

다음과 같이 업로드 버튼을 클릭하여 *-aws.jar 형태로 만들어진 파일을 업로드해주시면 됩니다.

 

jar파일 업로드 - (전)

 

jar파일 업로드 - (후)

 

 

 

[ 7. 객체 URL 확인 ]

 

업로드가 완료되었다면 업로드한 파일을 클릭하여 다음과 같이 상세 정보를 확인할 수 있습니다.

 

이 중 객체 URL 쪽은 Lambda에 활용되기 때문에 이후 사용 예정입니다.

 

객체 URL 확인

 

 

 

 

Lambda 세팅

 

이번엔 Lambda를 생성하여 S3에 업로드된 객체를 연결한 뒤 정상적으로 실행되는지까지 확인해보겠습니다.

 

 

 

[ 1. Lambda 접속 ]

 

Lambda 접속

 

 

 

[ 2. 함수 생성 ]

 

좌측 메뉴에서 함수를 선택한 뒤 우측에 있는 함수 생성 버튼을 클릭해줍니다.

 

함수 생성

 

 

 

[ 3. 함수 정보 입력 - 기본 정보 ]

 

기본 정보는 다음과 같이 함수 이름을 자유롭게 입력해주시고 런타임은 Java 11로 선택해주시면 됩니다.

 

함수 정보 입력 - 기본 정보

 

 

 

[ 4. 함수 정보 입력 - 고급 설정 ]

 

고급 설정 쪽에서는 VPC를 확인해주셔야 합니다.

 

현재 저의 작업 상황으로는 Lambda에서 RDS로 만들어둔 MySQL에 접속할 수 있어야 합니다.

 

즉, RDS에 속해있는 보안 그룹쪽에 Lambda가 속해있어야 합니다.

 

각자 설정하신 것에 맞게 Lambda가 RDS에 접속할 수 있게 VPC 설정을 추가해주시면 됩니다.

 

다만 저는 테스트이기 때문에 RDS를 모든 IP에 오픈해놔서 따로 설정하지는 않겠습니다.

 

모든 설정이 완료되었다면 함수를 생성해주시면 됩니다.

 

함수 정보 입력 - 고급 설정

 

 

 

 

[ 5. 코드 소스 업로드 ]

 

함수가 생성되었다면 아래와 같이 코드 소스 쪽에 업로드 버튼을 클릭한 뒤 S3를 선택해줍니다.

 

코스 소스 업로드

 

 

 

그리고 S3 링크 URL에 위에서 업로드했던 jar파일 객체 URL을 복사하여 저장해줍니다.

 

S3 객체 URL 복사

 

 

 

[ 6. 런타임 설정 ]

 

이번엔 런타임 설정 쪽에서 핸들러를 각자 설정한 것에 맞게 변경해줘야 합니다.

 

먼저 런타임 설정 쪽에서 편집 버튼을 클릭해줍니다.

 

런타임 편집

 

 

 

그리고 핸들러 쪽에 다음과 같이 위에서 만들었던 핸들러를 등록해줍니다.

 

패키지명부터 시작해서 클래스명까지 입력을 해주면 됩니다.

 

스프링 프로젝트 구조

 

핸들러 변경

 

 

 

[ 7. 구성 변경 - 일반 구성 ]

 

이번엔 구성 탭으로 넘어간 뒤 일반 구성의 편집 버튼을 클릭해줍니다.

 

일반 구성 편집

 

 

 

제한 시간 같은 경우는 15초가 기본 값으로 설정되어 있는데 스프링을 Lambda에서 실행시킬때 15초는 타임 리밋에 걸리기 충분한 시간입니다.

 

각자 개발한 소스코드에 맞게 메모리, 제한 시간 등을 적절하게 변경해주시면 됩니다.

 

저는 제한 시간만 다음과 같이 2분으로 변경하도록 하겠습니다.

 

제한 시간 변경

 

 

 

[ 8. 구성 변경 - 환경 변수 ]

 

이번엔 환경 변수로 넘어가서 시간대를 설정해줄 겁니다.

 

좌측의 환경 변수 메뉴를 선택한 뒤 우측에 있는 편집 버튼을 클릭해줍니다.

 

환경 변수 편집

 

 

 

그리고 환경 변수 추가 버튼을 클릭한 뒤 키/값을 다음과 같이 입력하고 저장해줍니다.

 

시간대 설정

 

 

 

 

[ 9. 테스트 ]

 

모든 설정이 완료되었다면 Lambda가 정상적으로 동작되는지 테스트를 해주면 됩니다.

 

테스트 탭으로 넘어가서 다음과 같이 JSON 값을 변경해주고 테스트 버튼을 클릭해주면 됩니다. (필요하신 분들은 테스트 템플릿을 작성하여 저장을 해주셔도 됩니다.)

 

테스트

 

 

 

테스트가 정상적으로 동작되었다면 다음과 같은 결과 메시지를 확인할 수 있습니다.

 

테스트 성공 메시지

 

 

 

그리고 DB에도 다음과 같이 스프링에서 작성한 소스코드의 결과물을 확인할 수 있습니다.

 

DB 데이터 적재

 

 

 

 

CloudWatch Event Bridge 세팅

 

Lambda 테스트까지 모두 완료되었다면 이제 CloudWatch를 이용하여 배치 시간만 등록해주면 됩니다.

 

배치 시간 등록을 위해선 CloudWatch Event Bridge를 사용하며 다음과 같이 설정해주시면 됩니다.

 

 

 

[ 1. Lambda 트리거 추가 ]

 

Lambda 트리거 추가

 

 

 

[ 2. Event Bridge 등록 ]

 

트리거로 EventBridge를 선택한 뒤 규칙 이름을 자유롭게 입력해주면 됩니다.

 

그리고 이벤트가 발생될 유형을 선택해주면 되는데 저는 crontab을 활용했습니다.

 

아래 예약 표현식에서 작성된 crontab은 매일 오전 12시 30분이 될 때마다 Lambda 함수를 실행시키라는 표현식입니다.

 

crontab의 순서는 분/시간/일/월/주/년이며 자세한 사항은 AWS 예약 표현식 규칙 가이드를 참고 부탁드립니다.

 

Event Bridge 등록

 

 

 

[ 3. 이벤트 일정 확인 ]

 

Event Bridge 등록이 완료되었다면 생성된 Event Bridge를 클릭하여 세부 정보로 들어갑니다.

 

그러면 다음과 같이 입력한 예약 표현식에 맞게 이벤트가 발생되는 일정이 확인 가능합니다.

 

이벤트 일정 확인

 

 

 

[ 4. 이벤트 발생 확인 ]

 

테스트를 위해 이벤트 발생 시간을 변경한 뒤 정상적으로 동작하는지 확인해봤습니다.

 

만약 모든 설정이 올바르게 되어 있다면 다음과 같이 등록된 시간마다 이벤트가 발생되어 Lambda가 실행된 결과물을 DB에서 확인할 수 있습니다.

 

배치 동작으로 데이터 적재 확인

 

 

 

 

 

 

 

 

 

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

 

읽어주셔서 감사합니다.

 

 

 

728x90
반응형

댓글