본문 바로가기
개발 환경/AWS

[AWS] Amazon SQS와 Lambda를 활용한 서버리스 데이터 처리 (Node.js)

by 우주다람쥐 2025. 2. 25.
반응형

 

AWS SQS(Simple Queue Service)는 비동기적으로 메시지를 처리할 수 있는 큐 서비스로, 서버리스 환경에서 Lambda와 함께 사용하면 효율적으로 데이터를 처리할 수 있습니다. 이번 글에서는 Node.js와 AWS SDK v3을 사용하여 SQS에 들어온 데이터를 Lambda로 처리하는 방법을 알아보겠습니다.

 

1. 아키텍처 개요

  1. 클라이언트 또는 다른 AWS 서비스가 SQS에 메시지를 보냅니다.
  2. SQS 큐에 메시지가 도착하면, 이를 트리거로 Lambda가 실행됩니다.
  3. Lambda는 메시지를 읽고, 필요한 처리를 수행한 후 성공적으로 완료되었음을 SQS에 알립니다.

이 과정을 통해 서버를 관리할 필요 없이 자동 확장되는 이벤트 기반의 데이터 처리를 구현할 수 있습니다.

 

2. SQS 큐 생성

AWS 콘솔을 사용하여 SQS 생성하기

  1. AWS Management Console에서 SQS 서비스로 이동합니다.
  2. 표준(Standard) 큐를 선택하고 이름을 지정한 후 생성합니다.
  3. "Lambda 트리거"는 이후 설정할 것이므로 기본 설정으로 완료합니다.

 

3. Lambda 함수 생성 및 SQS와 연결

1) Lambda 함수 생성

AWS 콘솔에서 Lambda를 생성하거나, AWS CDK 또는 Serverless Framework를 사용할 수 있습니다. 여기서는 AWS 콘솔을 통해 Lambda를 생성하는 방법을 설명합니다.

  1. AWS Lambda 서비스로 이동합니다.
  2. "함수 생성"을 클릭하고, 런타임으로 Node.js 22.x를 선택합니다.
  3. IAM 역할을 추가하여 SQS 메시지를 읽을 권한을 부여합니다.

Lambda에 필요한 IAM 정책 예시:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "sqs:ReceiveMessage",
      "Resource": "arn:aws:sqs:region:account-id:queue-name"
    }
  ]
}

 

  1. SQS 콘솔에서 생성한 큐로 이동합니다.
  2. "Lambda 트리거 추가" 버튼을 클릭합니다.
  3. 방금 생성한 Lambda 함수를 선택하고 저장합니다.

이제 SQS에 메시지가 들어오면 Lambda가 자동으로 실행됩니다.

 

4. Lambda 코드 작성 (Node.js + AWS SDK v3)

이제 실제로 Lambda 함수가 SQS 메시지를 읽고 처리하는 코드를 작성하겠습니다.

index.mjs (Node.js 18+ 지원)

import { SQSClient, DeleteMessageCommand } from "@aws-sdk/client-sqs";

const sqsClient = new SQSClient({ region: "us-east-1" }); // 리전 변경 필요

export const handler = async (event) => {
    console.log("Received event:", JSON.stringify(event, null, 2));

    for (const record of event.Records) {
        const messageBody = record.body;
        console.log("Processing message:", messageBody);
        
        // 메시지 처리 로직 (예: 데이터 저장, API 호출 등)
        await processMessage(messageBody);

        // 처리 완료 후 메시지 삭제 (기본 설정은 자동 삭제가 아님)
        await sqsClient.send(new DeleteMessageCommand({
            QueueUrl: process.env.SQS_QUEUE_URL,
            ReceiptHandle: record.receiptHandle
        }));
    }

    return { statusCode: 200, body: "Messages processed successfully" };
};

async function processMessage(message) {
    console.log("Handling message:", message);
    // 여기서 메시지를 비즈니스 로직에 맞게 처리
}

 

5. Lambda 테스트 및 배포

1) Lambda 테스트 이벤트 생성

AWS 콘솔에서 Lambda 함수를 열고, 테스트 이벤트를 생성합니다.

{
  "Records": [
    {
      "body": "{\"orderId\": 12345, \"status\": \"pending\"}",
      "receiptHandle": "dummy-receipt-handle"
    }
  ]
}

 

2) 실전 테스트 (SQS에 메시지 보내기)

AWS CLI 또는 SDK를 사용하여 SQS에 메시지를 직접 넣고 동작을 확인할 수 있습니다.

aws sqs send-message --queue-url "https://sqs.us-east-1.amazonaws.com/123456789012/MyQueue" --message-body '{"orderId": 12345, "status": "pending"}'

 

SQS에 메시지가 들어가면, 연결된 Lambda가 자동 실행되어 메시지를 처리하게 됩니다.

 

 

6. 결론

이 글에서는 AWS SQS와 Lambda를 사용하여 Node.js 기반의 서버리스 메시지 처리를 구축하는 방법을 알아보았습니다.

핵심 요약:

  • SQS를 생성하고 메시지를 넣으면 Lambda가 이를 자동으로 처리함
  • Lambda의 IAM 역할을 올바르게 설정해야 함
  • Lambda에서 메시지를 수동으로 삭제해야 중복 처리를 방지할 수 있음

이제 AWS SQS와 Lambda를 활용하여 더욱 효율적인 서버리스 아키텍처를 구축해보세요! 🚀

반응형

댓글