Node.js Serverless and Lamda


Serverless 아키텍처와 AWS Lambda 활용 (Serverless Architecture and Using AWS Lambda)

Serverless 아키텍처는 클라우드 제공자가 서버 관리와 운영을 맡아주는 아키텍처 모델로, 개발자는 애플리케이션 코드만 작성하면 됩니다. AWS Lambda는 이러한 서버리스 컴퓨팅을 제공하는 서비스로, 서버를 관리할 필요 없이 코드를 실행할 수 있게 해줍니다. 이 문서에서는 Serverless 아키텍처의 개념과 AWS Lambda의 활용 방법에 대해 상세히 설명하고, 다양한 예제를 제공합니다.

Serverless 아키텍처의 개념 (Concept of Serverless Architecture)

Serverless 아키텍처에서는 서버 인프라의 관리가 클라우드 제공자에게 맡겨집니다. 개발자는 애플리케이션의 기능을 코드로 작성하고, 이를 클라우드 환경에서 실행하게 됩니다. 주요 특징은 다음과 같습니다:

  1. 무서버 (No Server Management):
    개발자는 서버를 직접 관리하지 않고, 클라우드 제공자가 서버의 유지보수와 관리, 스케일링을 담당합니다.
  2. 이벤트 기반 실행 (Event-Driven Execution):
    서버리스 함수는 특정 이벤트(HTTP 요청, 데이터베이스 변화, 파일 업로드 등)가 발생했을 때만 실행됩니다.
  3. 자동 스케일링 (Automatic Scaling):
    애플리케이션의 요청량에 따라 자동으로 인스턴스가 추가되거나 제거됩니다.
  4. 비용 효율성 (Cost Efficiency):
    사용한 만큼만 비용을 지불합니다. 코드가 실행된 시간만큼만 비용이 청구되므로, 서버를 계속 켜두는 것보다 경제적입니다.

AWS Lambda 개요 (Overview of AWS Lambda)

AWS Lambda는 AWS에서 제공하는 서버리스 컴퓨팅 서비스로, 사용자가 서버를 관리하지 않고도 코드를 실행할 수 있도록 해줍니다. Lambda 함수는 특정 이벤트에 반응하여 실행됩니다.

  1. Lambda 함수 생성:
    AWS Lambda에서는 코드, 런타임, 메모리 등을 설정하여 함수를 정의합니다.
  2. 이벤트 소스:
    Lambda 함수는 AWS S3, DynamoDB, SNS 등 다양한 AWS 서비스와 연동하여 이벤트 기반으로 실행됩니다.
  3. 배포 및 관리:
    Lambda 함수는 AWS Management Console, AWS CLI, 또는 AWS SDK를 통해 배포 및 관리할 수 있습니다.

AWS Lambda 설치 및 설정 (Setting Up AWS Lambda)

AWS Lambda를 사용하여 Node.js 애플리케이션을 서버리스로 배포하는 방법을 단계별로 설명합니다.

  1. AWS 계정 생성: AWS Lambda를 사용하기 위해 AWS 계정이 필요합니다. AWS 웹사이트에서 계정을 생성합니다.
  2. AWS Lambda 함수 생성: AWS Management Console에 로그인한 후, Lambda 서비스로 이동하여 새로운 함수를 생성합니다.
  • Function Name: 함수의 이름을 입력합니다.
  • Runtime: Node.js 런타임을 선택합니다.
  • Execution Role: Lambda 함수가 사용할 IAM 역할을 설정합니다. (새로운 역할을 생성하거나 기존 역할을 선택할 수 있습니다.)
  1. 코드 작성: 함수의 코드를 작성합니다. 기본적인 Node.js Lambda 함수 예제는 다음과 같습니다.
   // index.js
   exports.handler = async (event) => {
       const message = 'Hello, world!';
       console.log(message);
       return {
           statusCode: 200,
           body: JSON.stringify({ message: message }),
       };
   };
  1. 함수 테스트: AWS Management Console에서 Lambda 함수를 테스트할 수 있습니다. 테스트 이벤트를 정의하고 실행하여 함수가 예상대로 동작하는지 확인합니다.
  2. 배포: 함수를 작성하고 테스트한 후, 변경 사항을 저장하고 배포합니다.

AWS Lambda와 API Gateway 연동 (Integrating AWS Lambda with API Gateway)

Lambda 함수를 HTTP 요청으로 트리거할 수 있도록 API Gateway와 연동합니다.

  1. API Gateway 생성: AWS Management Console에서 API Gateway를 생성하고 새로운 API를 만듭니다.
  2. 리소스 및 메서드 설정: API Gateway에서 리소스를 생성하고, 메서드를 추가하여 Lambda 함수를 트리거하도록 설정합니다.
  • Resource: /myresource와 같은 리소스를 추가합니다.
  • Method: GET, POST 등 필요한 HTTP 메서드를 추가합니다.
  • Integration: Lambda Function을 선택하고, 해당 Lambda 함수를 지정합니다.
  1. 배포: API Gateway의 설정이 완료되면, API를 배포하여 엔드포인트 URL을 생성합니다. 이 URL을 통해 Lambda 함수를 HTTP 요청으로 호출할 수 있습니다.

AWS Lambda와 DynamoDB 연동 (Integrating AWS Lambda with DynamoDB)

AWS Lambda와 DynamoDB를 연동하여 데이터베이스 작업을 처리할 수 있습니다.

  1. DynamoDB 테이블 생성: AWS Management Console에서 DynamoDB 테이블을 생성합니다. 예를 들어, Users라는 테이블을 생성하고 userId를 기본 키로 설정합니다.
  2. Lambda 함수와 DynamoDB 연동: Lambda 함수에서 DynamoDB를 사용하려면 AWS SDK를 활용하여 데이터베이스 작업을 수행합니다. 아래는 기본적인 데이터 읽기 예제입니다.
   // index.js
   const AWS = require('aws-sdk');
   const dynamoDb = new AWS.DynamoDB.DocumentClient();

   exports.handler = async (event) => {
       const params = {
           TableName: 'Users',
           Key: {
               userId: '12345',
           },
       };

       try {
           const data = await dynamoDb.get(params).promise();
           return {
               statusCode: 200,
               body: JSON.stringify(data.Item),
           };
       } catch (error) {
           return {
               statusCode: 500,
               body: JSON.stringify({ error: 'Could not fetch data' }),
           };
       }
   };
  1. IAM 역할 설정: Lambda 함수가 DynamoDB에 접근할 수 있도록 적절한 IAM 역할과 권한을 설정합니다.

AWS Lambda와 S3 연동 (Integrating AWS Lambda with S3)

AWS Lambda와 S3를 연동하여 파일 업로드와 같은 작업을 처리할 수 있습니다.

  1. S3 버킷 생성: AWS Management Console에서 S3 버킷을 생성합니다.
  2. Lambda 트리거 설정: S3 버킷에서 객체가 업로드되거나 삭제될 때 Lambda 함수를 자동으로 호출하도록 설정합니다.
  • Bucket: 기존 S3 버킷을 선택합니다.
  • Event Type: PUT (업로드) 이벤트를 선택합니다.
  • Lambda Function: 호출할 Lambda 함수를 선택합니다.
  1. Lambda 함수 코드: S3에서 업로드된 파일을 처리하는 Lambda 함수의 예제는 다음과 같습니다.
   // index.js
   const AWS = require('aws-sdk');
   const s3 = new AWS.S3();

   exports.handler = async (event) => {
       for (const record of event.Records) {
           const bucket = record.s3.bucket.name;
           const key = record.s3.object.key;

           const params = {
               Bucket: bucket,
               Key: key,
           };

           try {
               const data = await s3.getObject(params).promise();
               console.log('File content:', data.Body.toString('utf-8'));
           } catch (error) {
               console.error('Error getting file:', error);
           }
       }

       return {
           statusCode: 200,
           body: JSON.stringify({ message: 'File processed successfully' }),
       };
   };

Serverless Framework과 AWS Lambda (Using Serverless Framework with AWS Lambda)

Serverless Framework은 Serverless 애플리케이션을 쉽게 배포하고 관리할 수 있는 도구입니다.

  1. Serverless Framework 설치: 글로벌로 Serverless Framework을 설치합니다.
   npm install -g serverless
  1. 프로젝트 생성: 새로운 Serverless 프로젝트를 생성합니다.
   serverless create --template aws-nodejs --path my-service
   cd my-service
  1. serverless.yml 설정: serverless.yml 파일을 사용하여 함수와 리소스를 정의합니다.
   service: my-service

   provider:
     name: aws
     runtime: nodejs14.x

   functions:
     hello:
       handler: handler.hello
       events:
         - http:
             path: hello
             method: get
  1. 핸들러 코드 작성: handler.js 파일에 Lambda 함수 코드를 작성합니다.
   // handler.js
   module.exports.hello = async (event) => {
     return {
       statusCode: 200,
       body: JSON.stringify({ message: 'Hello, world!' }),
     };
   };
  1. 배포: Serverless Framework을 사용하여 애플리케이션을 AWS에 배포합니다.
   serverless deploy

배포 후, 생성된 API Gateway URL을 통해 Lambda 함수를 호출할 수 있습니다.

결론

AWS Lambda와 Serverless 아키텍처는 서버 관리의 부담을 덜어주고, 애플리케이션 개발과 유지보수를 간소화합니다. 다양한 AWS 서비스와의 연동을 통해 복잡한 애플리케이션을 간단하게 구축하고 관리할 수 있습니다. AWS Lambda와 Serverless Framework을 활용하여 효율적이고 확장 가능한 서버리스 애플리케이션을 구축할 수 있다.


Leave a Reply

Your email address will not be published. Required fields are marked *