[AWS스터디] Lambda

송성우·2024년 2월 29일

0. 생겨난 계기

Lambda는 기존의 서버 기반 아키텍처에서 벗어나, 개발자들이 서버 운영에 대한 부담을 덜고 비즈니스 로직에 집중할 수 있도록 하기 위해 생겨났다.

1. Lambda란 무엇일까?

Lambda는 AWS에서 제공하는 서버리스 컴퓨팅 플랫폼이다.

서버리스란, 개발자가 서버를 관리할 필요 없이 애플리케이션을 빌드하고 실행할 수 있도록 하는 클라우드 네이티브 개발 모델

AWS Lambda의 장점

  • 간편한 가격 설정:
    • 요청당 지불 및 계산 시간
    • 1,000,000 AWS Lambda 요청 및 400,000 GB의 컴퓨팅 시간을 제공하는 무료 계층
  • 전체 AWS 서비스 제품군과 통합
  • 많은 프로그래밍 언어와 통합됨
  • AWS CloudWatch를 통한 간편한 모니터링
  • 기능당 더 많은 리소스를 쉽게 얻을 수 있습니다(최대 10GB의 RAM!)
  • RAM을 늘리면 CPU와 네트워크도 향상

람다의 예시

2. Lambda 내용정리

AWS Lambda는 이벤트에 대한 응답으로 코드를 실행하고 자동으로 기본 컴퓨팅 리소스를 관리하는 서버리스 컴퓨팅 서비스이다.(이벤트: 상태 변경 또는 업데이트)

커스텀 로직으로 다른 AWS 서비스 확장

  • Amazon S3 버킷, Amazon DynamoDB 테이블 등의 AWS 리소스에 사용자 지정 로직을 추가하여 데이터를 클라우드로 들어오거나 클라우드를 통해 이동할 때 쉽게 컴퓨팅을 적용
  • Amazon API Gateway를 통해 구축된 사용자 지정 API 또는 Lambda 애플리케이션 프로그래밍 인터페이스(API)를 통해 온디맨드로 트리거되는 새로운 백엔드 애플리케이션 서비스를 생성

자체 코드 사용 가능

  • Java, Go, PowerShell, Node.js, C#, Python, Ruby 등 다양한 프로그래밍 언어를 지원
  • Runtime API를 통해 다른 언어로 함수를 작성

완전히 자동화된 관리

  • 서버 및 운영 체제 유지 관리, 용량 프로비저닝, 자동 크기 조정, 코드 및 보안 패치 배포, 로깅 등을 Lambda가 자동으로 처리

내결함성 기본 제공

  • 여러 가용 영역(AZ)의 컴퓨팅 용량을 유지 관리하여 개별 시스템이나 데이터 센터 시설에 장애가 발생해도 코드를 보호

자동 조정

  • 필요한 경우에만 코드를 호출하고 수신되는 요청 속도를 지원할 수 있도록 자동 확장
  • 코드는 무상태이므로 Lambda는 배포와 구성에 대한 지연 없이 필요한 만큼 많은 인스턴스를 시작

3. 간단한 실습

람다 시작페이지 접근
아래에 실행버튼을 누르면 람다 함수가 코드를 실행시킨다.

람다 함수가 어떻게 호출되는지 알아보자.
아래의 사진을 보면 람다 함수가 "Hello from Lambda!"를 반복해서 출력하고 있다.

아래 그림을 자세히 보면 전송하는 load가 많을수록, 람다도 자동적으로 늘어난다.

그러면 실제로 함수를 생성해보자.

생성이 완료되면 아래와 같이 코드 편집기에 내가 작성한 코드를 볼 수 있다.

이제 생성된 코드로 테스트를 진행해보자.

저장한 후 테스트를 실행하면 아래와 같은 결과를 볼 수 있다.

기본 구성에서 기본 설정을 편집할 수 있다.

또한 코드 수정도 가능하다. 코드 편집기에서 아래와 같이 코드를 수정한 후, 배포를 하면 테스트의 결과가 달라짐을 확인할 수 있다.

실제 스프링부트를 통한 Lambda 적용(서버리스)

먼저 실습을 진행하기 전에 토이 프로젝트를 생성한 뒤, 기본세팅을 했다.

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
	implementation 'org.springframework.boot:spring-boot-starter-security'
	implementation 'org.springframework.boot:spring-boot-starter-web'
	implementation 'org.springframework.boot:spring-boot-starter-webflux'
	implementation 'org.springframework.boot:spring-boot-starter-websocket'
	compileOnly 'org.projectlombok:lombok'
	runtimeOnly 'com.mysql:mysql-connector-j'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
	testImplementation 'io.projectreactor:reactor-test'
	testImplementation 'org.springframework.security:spring-security-test'

	//implementation 'com.amazonaws.serverless:aws-serverless-java-container-springboot2:1.5.0'
    // Spring Cloud Function 을 위한 의존성
	implementation 'org.springframework.cloud:spring-cloud-function-adapter-aws:3.1.4'
    // 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'
}

spring-cloud-function-adapter-aws의 버전을 꼭 명시해주자..

  • StringCheck


    input으로 String, length를 받고 실제 길이와 비교하여 true, false를 반환하는 메소드 구현

  • LambdaHandler

    AWS Handlers 생성(AWS Lambda가 Spring Cloud Funtion 프로젝트에 접근 가능하게)

public class LambdaHandler extends SpringBootStreamHandler {

}
  • handleRequest
    이렇게 handleRequest 메소드는 AWS Lambda 이벤트를 받아서 처리하고, 결과를 반환
    public void handleRequest(InputStream input, OutputStream output, Context context) throws IOException {
        this.initialize(context);
        Object value = this.convertStream(input);
        Publisher<?> flux = this.apply(this.extract(value));
        this.mapper.writeValue(output, this.result(value, flux));
    }

zip 파일로 생성하는 과정에서 ./gradlew buildZip을 상행하면 아래와 같은 에러가 떴다. 롬복 관련 문제로 추측되는데, 문명 build.gradlecompileOnly 'org.projectlombok:lombok'를 추가해줬다.

annotationProcessor 'org.projectlombok:lombok'를 추가했더니 해결되었다.
이유: Gradle에서는 compileOnly 설정을 사용하여 컴파일 시점에만 필요한 라이브러리를 추가할 수 있습니다. compileOnly로 추가된 라이브러리는 컴파일된 코드가 실행되는 환경에는 포함되지 않습니다. 따라서 이 설정은 실행 시점에 라이브러리가 필요하지 않은 경우에 유용합니다.
그런데 Lombok은 컴파일 시점에 코드를 생성하는 라이브러리입니다. 이렇게 코드를 생성하는 라이브러리는 annotationProcessor 설정을 사용하여 추가해야 합니다. annotationProcessor 설정은 컴파일 시점에 어노테이션을 처리하는 데 사용됩니다.


파일이 잘 생성되었음을 확인할 수 있다.

이제 AWS Lambda에서 람다 함수를 생성해주자.

환경변수 설정

Reference

https://velog.io/@ayoung0073/SpringBoot-AWS-Lambda%EC%97%90-%EB%B0%B0%ED%8F%AC%ED%95%98%EA%B8%B0
https://www.udemy.com/course/best-aws-certified-developer-associate/learn/lecture/29388284#overview
https://www.lgcns.com/blog/cns-tech/aws-ambassador/49072/
https://www.baeldung.com/spring-boot-aws-lambda

profile
소통을 지향하며 성장하는 것이 목표입니다.

0개의 댓글