오늘은 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에서:
- Lambda → 왼쪽 메인메뉴 추가 리소스 -> 계층 → 계층 생성
- 이름 지정하고 아까 만든 zip 파일 업로드
- Node.js 22.x 런타임 선택 -> 다른 버전 사용하고 싶으면 선택 가능
- Create!
3. Lambda 함수에 Layer 연결하기
- Lambda 함수 선택
- Configuration → Layers
- Add a layer → Custom layers
- 방금 만든 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
})
};
}
};
핵심 체크리스트
파일 확장자와 모듈 시스템
.mjs
파일에서는 ES Modules 문법 사용 (import/export)- 별도의 package.json 설정은 필요 없음
Layer 구조
- nodejs 폴더 필수
- package.json과 node_modules가 nodejs 폴더 안에 위치
Layer 연결
- Lambda 함수에 Layer가 제대로 연결되어 있는지 확인
추가 팁
타임아웃 설정 확인
- Lambda의 기본 타임아웃은 3초
- API 호출이 있다면 최소 10초 이상 권장
Layer의 장점
- 여러 함수에서 재사용 가능
- 패키지 버전 관리가 쉬움
- 함수 코드와 의존성을 분리해서 관리
에러 처리
- 네트워크 오류가 발생할 수 있으니 try-catch는 필수
- 로그를 자세히 남기면 디버깅이 쉬워요
마무리
처음에는 "axios 설치하는데 이렇게까지...?" 라고 생각했는데, Lambda의 특성상 이런 구조가 필요하더라구요.
귀찮더라도 Layer를 한 번 제대로 설정해두면 다른 Lambda 함수에서도 쉽게 재사용할 수 있어서, 이후에는 정말 편하게 사용할 수 있습니다.
혹시라도 비슷한 문제로 고생하시는 분들에게 도움이 되었으면 좋겠습니다. 궁금한 점이 있으시다면 댓글 남겨주세요! 😊
'개발 > devOps' 카테고리의 다른 글
AWS API Gateway와 Lambda 연동하기: Cognito로 보안까지 챙기자!🚀 (1편 Lambda 세팅) (0) | 2024.12.18 |
---|---|
Redis Key Naming: 성능과 유지보수를 동시에 잡는 방법(실전 개발자의 필수 가이드) 🎯 (1) | 2024.11.23 |
[AWS] RDS 다른 계정으로 이전 (0) | 2023.05.23 |
[AWS] EC2 HTTPS적용 (Load Balancer, Target Group) (0) | 2023.05.18 |
[AWS] CloudFront 배포 완전정복!!! (0) | 2023.05.16 |
댓글