[AWS] Lambda 사용해보기

Yehyeok Bang·2023년 10월 9일
2

무료 크레딧

작년 GDSC 활동을 하면서 Google Cloud Platform, GCP에 가입하고 무료 크레딧을 받아서 사용했어요. 처음 스프링 부트를 배워서 애플리케이션을 만들고 VM 인스턴스에서 처음 실행되었을 때는 진짜 뿌듯했었던 기억이 있어요.

하지만 무료 크레딧에는 사용기한이 존재하고, 언젠가는 비용을 지불하게 될 것 같아요. 실제로 저도 GCP 크레딧 사용 기한이 만료되어 현재는 AWS 프리티어를 통해 클라우드 환경을 경험하고 있어요.


아까운 크레딧

GCP나 AWS를 경험해보면서 가장 많이 사용했던 것은 아무래도 VM 인스턴스나 EC2처럼 가상의 컴퓨터 환경을 대여하고 그 위에 원하는 대로 설정하고 사용하는 방법이었어요.

그렇게 조그만한 프로젝트를 만들고 클라우드 환경에 올리고 내리고를 반복하다 보니 이런 생각이 들었어요. 어쩌다 사용하는데 귀찮기도 하고 돈도 아깝다.

사용할 때마다 가상 환경을 켜고 끄는 것은 매우 불편하고, 계속 켜두기엔 돈이 아깝다는 생각이었어요. 그래서 쉬운 방법을 찾아보던 중 Serverless Architecture 를 발견하게 되었어요.


Serverless Architecture

처음 서버리스라는 단어를 봤을 때 서버가 없겠다고 생각했어요. 하지만 실제로 서버가 없는 것은 아니고, 그저, 특정 작업을 수행하기 위해서 컴퓨터를 혹은 가상머신에 서버를 설정하고, 이를 통하여 처리 하는 것이 아님을 의미한다고 해요. 해당 방법 대신에 BaaS (Backend as a Service) 혹은 FaaS (Function as a Service) 에 의존하여 작업을 처리하게 된다고 해요.

앞서 말한 것처럼 서버가 존재하지 않는 것은 아니에요. 그러나 우리는 서버에 대해서 신경쓰지 않아도 돼요. (서버의 사양, 네트워크 등)

BaaS

데이터를 저장하고, 공유하기 위해서는 서버 개발이 필수에요. 만약 서버 개발을 한다면 기본적인 백엔드 지식, 서버 확장성, 보안 등 생각해야 할 부분이 많으며, 이는 곧 비용의 증가로 이어져요. 하지만 BaaS는 서비스 개발에 필요한 기능(DB, 파일 업로드 등)들을 API 형태로 제공하여 서버 개발을 하지 않아도 쉽고 빠르게 기능을 구현 할 수 있게 해줘요.

추가로 사용한 만큼 비용이 나가며, 무료 사용량도 제공하기 때문에 소규모 프로젝트를 진행할 때 유용하게 사용할 수 있을 것 같아요.

BaaS 중 가장 대표적인 것은 Firebase에요.

FaaS

특정 이벤트에 대한 응답하는 함수를 만들어서 등록하고 등록된 함수가 실행된 만큼 비용을 지불하는 방식이에요.

FaaS를 사용하면 물리적 하드웨어, 가상 머신 운영 체제 및 웹 서버 소프트웨어 관리를 모두 클라우드 서비스 제공자가 처리해주기 때문에 개발자는 애플리케이션 코드의 개별 함수에만 집중할 수 있어요.

중요한 점은 애플리케이션이 아닌 함수를 배포하며, 계속 실행되고 있는 것이 아닌, 특정 이벤트가 발생 했을 때 실행되며, 실행이 되었다가 작업을 마치면 종료돼요.

FaaS 중 대표적인 것은 AWS Lambda, Google Cloud Functions, Azure Functions가 있어요.


AWS Lambda

어쩌다 사용할 기능들을 가상 머신에 올려두며 비용을 낭비하지 않기를 바라기 때문에 계속 실행되지 않고 등록한 함수가 실행된 만큼 비용을 지불하는 FaaS를 사용해보려고 해요.

그중에서도 가장 관심이 많은 AWS Lambda를 선택했고, 제가 주로 사용하는 Java 언어로 간단한 함수를 만들어보려고 해요.

AWS Lambda는 AWS 에서 제공하는 FaaS 서비스이며, 서버를 프로비저닝 또는 관리하지 않고도 실제로 모든 유형의 애플리케이션 또는 백엔드 서비스에 대한 코드를 실행할 수 있는 이벤트 중심의 서버리스 컴퓨팅 서비스라고 해요.

Lambda 만들기

  • 이름은 myFunction 이라고 했어요.
  • 런타임은 Java 17 로 설정했어요.
  • 실행 역할은 기본 Lambda 권한을 가진 새 역할 생성 로 선택했어요.

Hello Lambda

생성한 함수를 테스트해보면 다음과 같이 결과를 볼 수 있어요.


함수 코드 소스 수정하기

.zip 또는 .jar 파일을 업로드하거나 Amazon S3 를 이용하여 수정할 수 있어요.

간단하게 이름과 학과를 전달하면 자기소개 내용을 리턴하는 Java 코드를 작성하고 수정해보려고 해요.

구조

MyFunction.java

public class MyFunction {
    
    public record Input(String name, String major) {}
    
    public record Output(String message) {}

    public String introduce(Input input) {
        return new Output(String.format("Hi, I'm %s. I study %s", input.name(), input.major()));
    }

}

Java 14 이상에서 사용 가능한 record 키워드를 활용하여 간단한 입력을 정의하고, 그에 따라 자기 소개 메시지를 생성하는 함수에요.

  • Input : 이 레코드는 이름(name)과 전공(major) 두 개의 필드를 가지며, 입력으로 사용돼요.
  • Output : 이 레코드는 메시지 필드를 가지며, 출력으로 사용돼요.
  • introduce() : Input 객체를 인자로 받아, 해당 객체의 name과 major 필드 값을 이용하여 "Hi, I'm [name]. I study [major]" 형태의 메시지 가진 새로운 Output 객체를 반환해요.

컴파일 및 패키징

$ javac MyFunction.java // 컴파일, JVM에서 실행 가능한 .class 파일이 생성

$ zip my_func.zip *.class // 모든 .class 파일(*.class)을 my_func.zip 이름의 ZIP 파일로 압축

컴파일 후 패키지화 하고 코드 소스를 수정해요.

코드 소스 수정

만든 my_func.zip 파일을 업로드하고 런타임 설정을 수정해요.

핸들러 부분을 MyFunction::introduce 로 변경하고 저장해요.

MyFunction 테스트

이벤트 JSON을 지정하고 테스트를 클릭하면, 다음과 같이 응답을 받을 수 있어요.

이렇게 간단한 기능을 구현해봤는데, API Gateway 를 사용해서 외부에서 접근할 수 있기도 하고, 여러 유용한 설정도 많은 것 같아요.


마무리

이렇게 AWS Lambda를 사용하면 간단한 프로젝트나 기능 같은 경우에는 유지 비용을 크게 줄일 수 있을 것 같아요.

항상 저는 프로젝트를 진행하면 GCP의 VM 인스턴스나 AWS의 EC2를 사용했어요. 항상 구현부터 좋은 코드를 작성하려고 하고 어떤 기술을 쓰더라도 이유가 있는 선택을 하려고 노력했어요. 하지만 정작 배포할 때는 당연하게 EC2를 선택했던 것 같아요. 앞으로는 프로젝트나 상황에 적합한 환경으로 배포하려고 고민을 해보려고 해요.


참고

AWS Lambda
Serverless Post
Java 17 + AWS Lambda

0개의 댓글