[SpringBoot] AWS Lambda에 배포하기

애이용·2021년 7월 11일
0

springboot

목록 보기
17/20
post-thumbnail
post-custom-banner

build.gradle 설정

build.gradle에서
라이브러리는 org.springframework.cloud:spring-cloud-config-server를 사용한다.

ext {
    set('springCloudVersion', "Greenwich.SR1")
}

dependencyManagement {
    imports {
        mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
    }
}

dependencies {
   // ... 생략

    // Spring Cloud Function 을 위한 의존성
    implementation 'org.springframework.cloud:spring-cloud-function-adapter-aws'

    // AWS Lambda 에 배포하기 위한 의존성
    implementation group: 'com.amazonaws', name: 'aws-lambda-java-core', version: '1.2.1'
    // AWS Lambda 이벤트를 다루기 위한 의존성
    implementation group: 'com.amazonaws', name: 'aws-lambda-java-events', version: '3.9.0'
}

코드 작성

  • 간단하게 입력값 input과 length가 있다고 하면 input의 길이와 length 가 같은지 확인하는 간단한 코드를 짜봤다.
  • 해당 클래스는 스프링 컨테이너에서 다뤄야 하므로 Bean으로 등록되어야 한다. (@Component)
  • Function, Consumer, Supplier와 같은 함수형 인터페이스를 구현해야 한다.
  • StringCheck
  @Component // 하나의 함수
  public class StringCheck implements Function<StringRequest, StringResponse> {
      @Override
      public StringResponse apply(StringRequest stringRequest) {
          String input = stringRequest.getInput();

          if (input.length() != stringRequest.getLength()) {
              return new StringResponse(false);
          }

          return new StringResponse(true);
      }
  }
  • StringRequest (요청 DTO)
  @Getter
  public class StringRequest {
      private String input;
      private int length;
  }
  • StringResponse (응답 DTO)
  @AllArgsConstructor
  @Getter
  public class StringResponse {
      private boolean check;
  }

로컬 테스트

  • 로컬에서 테스트하려면 의존성을 추가해야 한다.
    implementation 'org.springframework.cloud:spring-cloud-starter-function-web'
  • Request
    요청 URL
    - POST http://localhost:8080/
    - POST http://localhost:8080/stringValidator
    {
        "input": "test",
        "length": 6
    }
  • Response
    {
        "check": false
    }

AWS 배포

  • AWS Handlers 생성
    AWS Lambda가 Spring Cloud Funtion 프로젝트를 다루기 위해 Spring Cloud Function AWS에서 제공하는 핸들러를 상속받은 클래스가 필요하다.
    (해당 클래스는 요청 정보를 AWS Lambda에서 다룰 수 있도록 하고, 프로젝트에 접근할 수 있도록 도와준다.)
import org.springframework.cloud.function.adapter.aws.SpringBootStreamHandler;

public class LambdaHandler extends SpringBootStreamHandler {

}


SpringBootStreamHandler를 보면 InputStream과 OutputStream을 입력 받고 적절한 핸들러를 찾아서 실행하는 handleRequest를 확인할 수 있다.

  • zip 파일로 만들기 위해 build.gradle에 task 추가
task buildZip(type: Zip) {
    from compileJava
    from processResources
    into('lib') {
        from configurations.runtimeClasspath
    }
}
  • sudo ./gradlew buildZip 명령을 실행하면 ./build/distributions 디렉토리에 zip 파일이 생성된다.

AWS Lambda Function 만들기

해당 링크로 들어가서 람다 함수를 생성한다.

  • 프로젝트 내의 Handler 클래스 위치를 입력한다. ([런타임 설정] 탭 > [Handler])

  • [구성] > [환경 변수] > [편집] 에서 환경 변수 수정하기
    FUNCTION_NAME : 원하는 Bean 이름, MAIN_CLASS : main 메서드가 위치한 클래스명

AWS Lambda Function 테스트

[테스트] 탭에서

  {
    "input": "val",
    "length": 3
  }

위의 내용을 입력하고 테스트를 해보자

응답 결과를 확인해보자 원하는 응답을 확인할 수 있다.

틀린 문자열 길이를 입력했을 때 테스트를 해보자.

  {
    "input": "val",
    "length": 5
  }


성공 ~_~

API Gateway 설정하기

설명 링크

참고 링크

profile
로그를 남기자 〰️
post-custom-banner

1개의 댓글

comment-user-thumbnail
2023년 6월 20일

진짜 진짜 감사해요!! 저 계속 이거 실패했는데 겨우 성공했어요!!!!

답글 달기