Serverless란?

naeganugu·2023년 9월 14일

클라우드☁️

목록 보기
1/1

서버리스.. 아직 서버란 무엇인가에서 헤엄치고 있는데 이젠 서버리스 시대가 온다 어쩌구...

개념 자체가 잘 서지 않아서 공부해보고 싶다 생각했는데 때마침 동아리에서 서버리스 스터디를 하게 되었고.. 또 첫번째 발표자가 되었다는 소식 전하면서.. 공부한 내용을 정리해보고자 한다.

클라우드 기반 함수 실행하기

클라우드 컴퓨팅 시대로 오면서 개발자들이 인프라를 관리할 부담을 덜어주었다. 개발자들은 인프라 신경쓸 필요 없이 개발에 집중할 수 있게 되었다. AWS Lambda도 사용하게 되면 인프라 관리에 대한 부담을 적게 가져갈 수 있다.

AWS Lambda에서는 Lambda 함수를 등록하고 이 함수를 호출하는 식으로 동작된다. Lambda 함수를 호출시키는 주체는 누구인가? 직접 호출해 실행할 수 있지만 서버리스 환경에서는 주로 이벤트를 통해 실행된다. 이벤트 발생 시 Lambda 함수 실행

특정 파일이 업로드되거나 데이터베이스 항목이 수정됨(이벤트) ➡️ AWS Lambda 함수 실행(Lambda 함수가 이벤트 발생에 반응)


AWS Lambda 실행

기존에 물리 서버를 두거나 클라우드 기반 가상 서버를 두었을 때 접근 방식과 AWS Lambda는 다르다. 여러 함수로 구성된 논리적인 구성과 이들 함수를 실행하는 서비스만 신경쓰면 된다. 각 함수는 컨테이너에서 실행된다. 컨테이너는 일종의 서버 가상화 방식인데, AWS Lambda를 사용할 때 이런 인프라를 관리할 필요는 없다.

각 함수는 컨테이너에서 실행한다. 각 컨테이너는 운영체제의 커널이 격리된 환경을 구현하는 서버 가상화 방식이다. AWS Lambda를 사용하면 물리적 서버의 가상 컨테이너 내에서 코드가 실행되지만, 그러한 인프라를 관리할 필요는 없다. 그런 측면에서 이러한 접근 방식을 서버리스(serverless)로 정의하고 있다.

Lambda 함수를 만들 때 여러 지정해줘야 할 값이 있다.

  • 함수 이름
  • 메모리 크기 ➡️ 함수를 실행하기 위한 최대 메모리 크기
  • 제한 시간 ➡️ 이 시간 안에 함수가 실행되지 않으면 종료
  • 역할 지정 ➡️ AWS 다른 자원에 어디까지 접근할 수 있는지 권한 역할

참고로 Lambda는 비용을 계산할 때 총 호출 수, 함수 실행시간을 기준으로 측정한다. 장점.. 저렴함!! 호출 수를 기반으로 하니 실행이 될 때만 비용으로 계산되니 이런 점이 좋은 듯 하다.


Lambda 함수를 만들 때 위처럼 이름을 지정해주고 함수를 작성하는데 사용할 언어를 지정합니다. 저는 JS를 쓸 예정이어서 JS 런타임인 Node를 선택했습니다.

export const handler = async (event) => {
  // TODO implement
  const response = {
    statusCode: 200,
    body: JSON.stringify('Hello from Lambda!'),
  };
  return response;
};

처음 함수를 만들면 위와 같은 예제가 기본적으로 나온다. event란 함수에 대한 입력 매개변수를 보내는 방법. JSON으로 표현된다.


백엔드 함수 구성하기

원래 백엔드 구축할 때

  • 웹 애플리케이션을 만들어서 서버에 배포
  • 기존 웹앱에 서버 기반 프로그래밍 언어와 함께 결과 렌더링
    이런 방식으로 진행되었다.

서버에 전체 백엔드 웹 애플리케이션을 개발 및 배포하는 대신 여러 개의 Lambda 함수를 구현해두고 이를 호출할 수도 있다. 이러한 방식이 Serverless

기존에는 API 방식을 사용해서 API를 호출하면 백엔드에서 무언가를 수행하여 결과를 반환 받는다.

이 각 API 호출 시 수행되는 로직들을 AWS Lambda를 사용하여 백엔드 기반 함수로 구현할 수 있다.

모든 백엔드 API를 AWS Lambda가 관리하는 기능으로 구현할 수 있다.

기존 백엔드 API 방식을 AWS Lambda를 쓰게 바꿀 수 있다! AWS Lambda 기능을 클라이언트 애플리케이션의 백엔드 API로 직접 사용할 수 있다!


이벤트 기반 애플리케이션

API처럼 클라이언트 애플리케이션에서 직접 요청되었을 때 Lambda 함수가 호출될 수도 있지만, 다른 리소스에서 생성되는 이벤트를 구독할 수도 있다.

이렇게 클라이언트 애플리케이션의 직접 요청뿐만 아니라 애플리케이션에서 사용하는 리소스 변경에도 반응할 수 있도록 백엔드의 내부 동작을 변경할 수 있다.

그러니까.... 꼭 API로 클라이언트가 호출되어서 Lambda 함수가 호출되는 게 아니라 DB나 파일저장소에 어떤 이벤트가 발생되었을 때(새로 무언가 저장되었다 등등..)에도 Lambda 함수를 호출시킬 수 있다.

람다 함수를 이벤트에 등록하면 동작 관계에 따라 자동적이고 연쇄적으로 실행한다. 예를 들어, 사진에서 새 메타데이터를 업데이트하면 파일 저장소에서 생성된 이벤트에 의해 첫 번째 함수가 호출되어 데이터베이스상의 메타데이터를 업데이트한다. 그러면 콘텐츠를 볼 수 있는 모든 사용자의 콘텐츠 목록을 업데이트하는 두 번째 함수를 호출하는 새 이벤트가 발생하고, 연결된 람다 함수를 실행한다.


클라이언트에서 함수 호출하기

클라이언트에서 Lambda 함수를 호출 할 때 Invoke API를 통해서 함수를 호출한다. 이때 클라이언트가 권한이 있는지를 확인하는 과정이 필요하다.

Amazon API Gateway는 백엔드의 부하를 줄이기 위해서 다양한 기능을 제공하는데, AWS Lambda 함수를 이 Amazon API Gateway를 통해 제공함으로써 아무 클라이언트가 직접 실행하거나 접근하는 것을 방지한다. 보안이 뛰어나다!

Amazon API Gateway를 통해 일부 API는 공개할 수도 있는데 이 경우 인증키가 필요하지 않다.




AWS Lambda 인 액션

위 책 내용을 바탕으로 정리함.

profile
seungseung-zanggu

0개의 댓글