본문 바로가기
개발/devOps

AWS Lambda에서 axios 사용하기: 삽질 기록과 해결 방법

by coking 2024. 12. 20.

오늘은 AWS Lambda에서 axios를 사용하면서 겪었던 시행착오와 삽질 기록을 정리해보려고 합니다.

1. Lambda Layer의 node_modules에 직접 올리기

예전부터 사용하던 방식입니다. 단순히 node_modules 폴더를 압축해서 Layer에 올리는 방식입니다:

npm install axios
zip -r axios-layer.zip node_modules

하지만 이 방식은 문제가 있습니다:

  • Lambda가 모듈을 제대로 찾지 못할 수 있음
  • 패키지 구조가 Lambda 환경과 맞지 않을 수 있음
  • 실제로 필자가 예전에는 이 방식으로 했는데 이번에는 안 돼서 고생함

2. nodejs 폴더 구조를 사용하는 방식

현재 AWS에서 권장하는 방식입니다. node_modules를 nodejs 폴더 안에 넣어 구조화하는 방식이죠.

1. Layer 준비하기

# 작업 폴더 생성
mkdir axios-lambda-layer
cd axios-lambda-layer

# nodejs 폴더 생성 (이 이름 꼭 지켜야 함!)
mkdir nodejs
cd nodejs

# package.json 생성 및 axios 설치
npm init -y
npm install axios

# 상위 폴더로 이동
cd ..

# 압축 (nodejs 폴더째로!)
zip -r axios-layer.zip nodejs

여기서 가장 중요한 점:

  • nodejs 폴더 이름은 반드시 "nodejs"여야 함
  • node_modules는 nodejs 폴더 안에 있어야 함

2. Layer 생성하기

AWS Console에서:

  1. Lambda → 왼쪽 메인메뉴 추가 리소스 -> 계층 → 계층 생성
  2. 이름 지정하고 아까 만든 zip 파일 업로드
  3. Node.js 22.x 런타임 선택 -> 다른 버전 사용하고 싶으면 선택 가능
  4. Create!

3. Lambda 함수에 Layer 연결하기

  1. Lambda 함수 선택
  2. Configuration → Layers
  3. Add a layer → Custom layers
  4. 방금 만든 Layer 선택

4. Lambda 함수 코드 작성 (.mjs)

import axios from 'axios';

export const handler = async (event) => {
    try {
        const response = await axios({
            method: 'post',
            url: 'your-api-endpoint',
            headers: {
                'Content-Type': 'application/json'
            },
            data: {}
        });

        return {
            statusCode: response.status,
            body: JSON.stringify({
                message: '성공!',
                data: response.data
            })
        };
    } catch (error) {
        console.error('에러:', error);
        return {
            statusCode: error.response?.status || 500,
            body: JSON.stringify({
                message: '실패...',
                error: error.message
            })
        };
    }
};

핵심 체크리스트

  1. 파일 확장자와 모듈 시스템

    • .mjs 파일에서는 ES Modules 문법 사용 (import/export)
    • 별도의 package.json 설정은 필요 없음
  2. Layer 구조

    • nodejs 폴더 필수
    • package.json과 node_modules가 nodejs 폴더 안에 위치
  3. Layer 연결

    • Lambda 함수에 Layer가 제대로 연결되어 있는지 확인

추가 팁

  1. 타임아웃 설정 확인

    • Lambda의 기본 타임아웃은 3초
    • API 호출이 있다면 최소 10초 이상 권장
  2. Layer의 장점

    • 여러 함수에서 재사용 가능
    • 패키지 버전 관리가 쉬움
    • 함수 코드와 의존성을 분리해서 관리
  3. 에러 처리

    • 네트워크 오류가 발생할 수 있으니 try-catch는 필수
    • 로그를 자세히 남기면 디버깅이 쉬워요

마무리

처음에는 "axios 설치하는데 이렇게까지...?" 라고 생각했는데, Lambda의 특성상 이런 구조가 필요하더라구요.

귀찮더라도 Layer를 한 번 제대로 설정해두면 다른 Lambda 함수에서도 쉽게 재사용할 수 있어서, 이후에는 정말 편하게 사용할 수 있습니다.

혹시라도 비슷한 문제로 고생하시는 분들에게 도움이 되었으면 좋겠습니다. 궁금한 점이 있으시다면 댓글 남겨주세요! 😊

댓글