서버리스 아키텍처 – AWS Lambda 활용법

서버리스 아키텍처 – AWS Lambda 활용법


서버리스 아키텍처는 서버 관리의 부담을 줄이고, 코드 실행에만 집중할 수 있게 해주는 클라우드 컴퓨팅 모델입니다. AWS Lambda는 서버리스 아키텍처를 구현하는 가장 대표적인 서비스 중 하나로, 서버를 직접 관리할 필요 없이 코드를 실행할 수 있습니다. 이번 포스팅에서는 "서버리스 아키텍처", "AWS Lambda", "서버리스 활용"을 중심으로 AWS Lambda를 활용한 서버리스 애플리케이션의 개념과 구현 방법을 상세히 설명하겠습니다. 


서버리스 아키텍처란?


서버리스 아키텍처는 애플리케이션 개발자가 서버를 프로비저닝, 관리, 운영할 필요 없이, 코드 실행에만 집중할 수 있는 클라우드 컴퓨팅 모델입니다. 서버리스에서는 클라우드 서비스 제공자가 인프라를 관리하며, 개발자는 코드와 비즈니스 로직에만 집중할 수 있습니다.


서버리스 아키텍처의 장점


  1. 자동 확장: 서버리스 서비스는 요청에 따라 자동으로 확장되므로, 트래픽 증가에 대해 걱정할 필요가 없습니다.
  2. 비용 효율성: 사용한 만큼만 비용을 지불하며, 유휴 시간에 대해 비용을 지불할 필요가 없습니다.
  3. 쉬운 배포: 코드만 작성하여 배포하면 되므로, 서버 설정이나 관리에 대한 부담이 없습니다.
  4. 빠른 개발 주기: 인프라 관리 부담이 적어 개발 주기가 단축됩니다.

서버리스 아키텍처의 단점


  1. 제한된 제어: 서버와 인프라에 대한 제어가 제한적이어서 특정 요구사항에 맞는 세부 조정을 할 수 없습니다.
  2. 콜드 스타트: 처음 요청 시 함수가 실행되기까지 지연 시간이 발생할 수 있습니다.
  3. 벤더 종속성: 특정 클라우드 서비스 제공자에 종속될 가능성이 있습니다.

AWS Lambda 소개


AWS Lambda는 Amazon Web Services(AWS)에서 제공하는 서버리스 컴퓨팅 서비스로, 코드를 서버리스 방식으로 실행할 수 있습니다. AWS Lambda는 이벤트 기반으로 동작하며, 다양한 AWS 서비스와 통합하여 강력한 서버리스 애플리케이션을 구축할 수 있습니다.


AWS Lambda의 주요 기능


  1. 이벤트 기반 실행: S3, DynamoDB, API Gateway 등 다양한 이벤트 소스에서 트리거하여 함수를 실행할 수 있습니다.
  2. 자동 확장: Lambda 함수는 요청에 따라 자동으로 확장됩니다.
  3. 비용 효율성: 함수 호출에 따라 비용이 청구되며, 사용한 만큼만 비용을 지불합니다.
  4. 다양한 언어 지원: Node.js, Python, Java, Go, .NET 등 다양한 언어를 지원합니다.

AWS Lambda 시작하기


AWS Lambda를 사용하여 서버리스 애플리케이션을 개발하는 방법을 살펴보겠습니다. AWS 콘솔과 AWS CLI를 사용하여 Lambda 함수를 생성하고, 간단한 예제를 구현합니다.


Lambda 함수 생성


AWS 콘솔에서 Lambda 함수 생성


  1. AWS 관리 콘솔에 로그인하고, "Lambda" 서비스를 선택합니다.
  2. "함수 생성" 버튼을 클릭합니다.
  3. 함수를 작성하는 두 가지 방법을 선택할 수 있습니다. "새로 작성"을 선택하고, 함수를 설정합니다.
    • 함수 이름: MyFirstLambda
    • 런타임: Node.js 14.x
  4. "함수 생성" 버튼을 클릭하여 함수를 생성합니다.

AWS CLI를 사용하여 Lambda 함수 생성


AWS CLI를 사용하여 Lambda 함수를 생성할 수도 있습니다. 먼저 AWS CLI를 설치하고, 구성합니다.


# AWS CLI 설치 및 구성
pip install awscli
aws configure

Lambda 함수를 생성하기 위해 index.js 파일을 준비합니다.


// index.js
exports.handler = async (event) => {
  const response = {
    statusCode: 200,
    body: JSON.stringify('Hello, AWS Lambda!'),
  };
  return response;
};

다음 명령어를 사용하여 함수를 생성합니다.


zip function.zip index.js

aws lambda create-function --function-name MyFirstLambda \
--zip-file fileb://function.zip --handler index.handler \
--runtime nodejs14.x --role arn:aws:iam::YOUR_ACCOUNT_ID:role/YOUR_ROLE

여기서 --role 옵션은 Lambda 함수가 실행될 때 사용할 IAM 역할을 지정합니다. 적절한 권한이 설정된 IAM 역할을 미리 생성해 두어야 합니다.


Lambda 함수 테스트


Lambda 함수를 생성한 후, AWS 콘솔이나 CLI를 사용하여 함수를 테스트할 수 있습니다.


AWS 콘솔에서 테스트


  1. 생성한 Lambda 함수 페이지에서 "테스트" 버튼을 클릭합니다.
  2. 새 테스트 이벤트를 생성하고, 이벤트 템플릿을 선택합니다.
  3. "테스트" 버튼을 클릭하여 함수를 실행하고, 결과를 확인합니다.

AWS CLI에서 테스트


AWS CLI를 사용하여 Lambda 함수를 테스트할 수도 있습니다.


aws lambda invoke --function-name MyFirstLambda --payload '{}' output.txt
cat output.txt

Lambda 함수 업데이트


Lambda 함수를 업데이트하려면 새로운 코드를 업로드하고 함수를 다시 배포합니다.


// index.js (업데이트)
exports.handler = async (event) => {
  const response = {
    statusCode: 200,
    body: JSON.stringify('Hello, AWS Lambda! This is an updated version.'),
  };
  return response;
};

zip function.zip index.js

aws lambda update-function-code --function-name MyFirstLambda --zip-file fileb://function.zip

Lambda 함수와 다른 AWS 서비스 통합


Lambda 함수는 다양한 AWS 서비스와 통합하여 강력한 서버리스 애플리케이션을 구축할 수 있습니다. 다음은 S3와 API Gateway를 사용하여 Lambda 함수를 트리거하는 예제입니다.


S3 이벤트 트리거 설정


Lambda 함수를 S3 이벤트와 통합하여 S3 버킷에 파일이 업로드될 때 함수를 실행할 수 있습니다.


  1. AWS 관리 콘솔에서 S3 서비스를 선택합니다.
  2. 이벤트를 설정할 S3 버킷을 선택합니다.
  3. "속성" 탭에서 "이벤트 알림"을 설정하고, "이벤트 생성" 버튼을 클릭합니다.
  4. 이벤트 이름을 입력하고, "Lambda 함수"를 선택한 다음, Lambda 함수를 지정합니다.
  5. "이벤트 유형"으로 "모든 객체 생성 이벤트"를 선택하고, 저장합니다.

API Gateway와 Lambda 통합


Lambda 함수를 API Gateway와 통합하여 HTTP 요청에 응답하는 서버리스 API를 구축할 수 있습니다.


  1. AWS 관리 콘솔에서 "API Gateway" 서비스를 선택합니다.
  2. "REST API"를 선택하고, "새 API 생성" 버튼을 클릭합니다.
  3. API 이름을 입력하고, API를 생성합니다.
  4. "리소스 생성" 버튼을 클릭하여 새로운 리소스를 생성합니다.
  5. "메서드 생성" 버튼을 클릭하여 메서드를 추가합니다. 예를 들어, "GET" 메서드를 추가합니다.
  6. "Lambda 함수" 통합 유형을 선택하고, Lambda 함수를 지정합니다.
  7. 메서드를 배포하고, API 엔드포인트 URL을 복사하여 브라우저나 API 클라이언트에서 테스트합니다.

서버리스 애플리케이션 구축 예제


서버리스 아키텍처를 사용하여 간단한 애플리케이션을 구축해보겠습니다. AWS Lambda, API Gateway, DynamoDB를 사용하여 서버리스 CRUD 애플리케이션을 구현합니다.


DynamoDB 테이블 생성


  1. AWS 관리 콘솔에서 "DynamoDB" 서비스를 선택합니다.
  2. "테이블 생성" 버튼을 클릭합니다.
  3. 테이블 이름을 입력하고, 기본 키를 설정합니다. 예를 들어, 테이블 이름은 Items, 기본 키는 id로 설정합니다.
  4. 테이블을 생성합니다.

Lambda 함수 작성


DynamoDB와 통합하여 CRUD 기능을 수행하는 Lambda 함수를 작성합니다.


// createItem.js
const AWS = require('aws-sdk');
const dynamoDb = new AWS.DynamoDB.DocumentClient();

exports.handler = async (event) => {
  const { id, name } = JSON.parse(event.body);
  const params = {
    TableName: 'Items',
    Item: { id, name },
  };

  try {
    await dynamoDb.put(params).promise();
    return {
      statusCode: 200,
      body: JSON.stringify({ message: 'Item created successfully' }),
    };
  } catch (error) {
    return {
      statusCode: 500,
      body: JSON.stringify({ error: error.message }),
    };
  }
};

// updateItem.js, getItem.js, deleteItem.js도 비슷한 방식으로 작성

Lambda 함수 배포 및 API Gateway 통합


각 Lambda 함수를 AWS CLI를 사용하여 배포하고, API Gateway와 통합하여 HTTP 메서드와 매핑합니다.


# Lambda 함수 생성 및 업데이트
zip createItem.zip createItem.js
aws lambda create-function --function-name createItem --zip-file fileb://createItem.zip --handler createItem.handler --runtime nodejs14.x --role arn:aws:iam::YOUR_ACCOUNT_ID:role/YOUR_ROLE

# API Gateway와 통합하여 API 엔드포인트 설정
# 예제는 생략합니다.

Lambda 함수 테스트


API 엔드포인트를 호출하여 Lambda 함수가 정상적으로 동작하는지 확인합니다. Postman과 같은 API 클라이언트를 사용하여 CRUD 기능을 테스트합니다.


# 예제 엔드포인트 호출
curl -X POST -H "Content-Type: application/json" -d '{"id": "1", "name": "Item1"}' https://your-api-endpoint/create

서버리스 아키텍처의 베스트 프랙티스


서버리스 아키텍처를 효과적으로 구현하기 위한 몇 가지 베스트 프랙티스를 살펴보겠습니다.


최소한의 권한 원칙


Lambda 함수와 다른 AWS 서비스 간의 권한을 설정할 때 최소한의 권한만 부여하여 보안을 강화합니다. IAM 역할을 생성하고 필요한 권한만 부여합니다.


{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "dynamodb:PutItem",
      "Resource": "arn:aws:dynamodb:YOUR_REGION:YOUR_ACCOUNT_ID:table/Items"
    }
  ]
}

함수 크기 및 실행 시간 최적화


Lambda 함수의 크기와 실행 시간을 최적화하여 비용을 절감하고 성능을 향상시킵니다. 함수 코드를 가능한 한 작게 유지하고, 불필요한 종속성을 제거합니다.


로깅 및 모니터링


AWS CloudWatch를 사용하여 Lambda 함수의 로그를 수집하고, 모니터링합니다. 오류나 성능 문제를 신속히 감지하고 대응할 수 있습니다.


const AWS = require('aws-sdk');
const cloudwatch = new AWS.CloudWatch();

exports.handler = async (event) => {
  console.log('Received event:', JSON.stringify(event, null, 2));
  // 함수 로직
};

결론


서버리스 아키텍처는 서버 관리의 부담을 줄이고, 개발 생산성을 향상시키는 강력한 클라우드 컴퓨팅 모델입니다. AWS Lambda는 서버리스 애플리케이션을 구현하는 데 매우 유용한 도구입니다. 이번 포스팅에서는 AWS Lambda를 사용하여 서버리스 애플리케이션을 구축하는 방법을 설명하였으며, Lambda 함수 생성, AWS 서비스 통합, 최적화 방법 등을 다루었습니다. 이러한 기술을 잘 활용하면 더 빠르고 효율적인 서버리스 애플리케이션을 개발할 수 있습니다.

이 포스팅이 서버리스 아키텍처와 AWS Lambda를 이해하고 활용하는 데 도움이 되길 바랍니다. 질문이나 추가 정보가 필요하시면 언제든지 댓글로 남겨주세요.

다음 이전