AWS Lambda <> GYP(Node) 배포

석현·2024년 6월 19일

Issues

목록 보기
4/8
post-thumbnail

이슈

AWS Lambda에 텍스트의 언어를 감지하는 GYP 모듈을 설치해야 했는데, 이게 꽤나 무거워서 150MB정도 되었다. 그래서 처음에는 "일단 올려보자!" 하고 빌드를 그대로 람다에 올려봤다. 하지만 역시나 오류가 났다. 여러 방식을 찾아보면서 고민하다가 모듈 전체를 확인해보니 C++ 언어가 보였다...

"이건 뭔가 잘못됐다!"라는 느낌이 확 왔다. 그래서 공식 문서를 다시 읽어보았다. 레이어를 추가해서 해결하는 방법을 찾았고 레이어를 추가하는 것은 너무 쉽지만 GYP를 Lambda 환경에 빌드 하고 폴더링 구조에 맞게 배포하는게 쉽지만은 않았다.

나는 Language Detecting을 하는 cld-node를 배포가 목표였다. 어떻게 AWS Lambda에 이 라이브러리를 배포했는지 기록해보려 한다.

GYP란?

GYP (Generate Your Projects)는 Google에서 개발한 프로젝트 생성 도구이다. GYP는 빌드 설정을 다양한 플랫폼에 맞게 생성해주는 도구로, 주로 네이티브 모듈을 컴파일할 때 사용된다. Node.js에서는 네이티브 모듈을 빌드하기 위해 GYP를 사용하며, 이는 C++ 코드를 Node.js에서 사용할 수 있도록 해주는 도구이다.

Lambda Layer 추가를 위한 준비!

1. AWS EC2 인스턴스 설정

먼저, 빌드 환경 차이를 극복하기 위해 AWS EC2 인스턴스를 활용했다. (생각보다 여기서 많이 해맸다. 어떻게 보면 당연하지만 당연할수록 더 놓치기 쉽다…!)

2. EC2 생성

만약 본인이 Linux를 사용하고 있다면 따로 필요 없을 수 있으니 참고
EC2에서 빌드를 하는 방법이 가장 정확했다

먼저, AWS Lambda와의 환경 차이를 극복하기 위해 AWS EC2 인스턴스를 활용했다. (Ec2를 띄우는 방법은 생략하겠다)

3. EC2 Instance에 노드 설치

AWS Lambda에 지정한 노드 버전에 맞게 설정한다. (나의 경우에는 Node.js 20 버전을 설치 했다. (설치하는 방법은 아주 많으니 편한대로~)

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash
. ~/.nvm/nvm.sh
nvm install 20

4. Github 프로젝트 다운로드

wget https://github.com/사용자명/프로젝트명/archive/refs/heads/main.zip -O project.zip
unzip project.zip
cd 프로젝트명-main

5. S3에 파일 업로드 & EC2 Download

  • CLI로 올리는 방법이 있지만 내 컴퓨터에는 AWS CLI가 없어서 수동으로 업로드를 했다
    • 오른쪽 상단에 있는 Upload 버튼을 클릭하여 해당 파일을 업로드 한다.
  • EC2에서 해당 파일을 다운로드 받는다
aws s3 cp s3://your-s3-bucket/node-cld.zip node-cld.zip
unzip node-cld.zip
cd node-cld

6. 설치 & S3에 업로드

의존성 설치 & 모듈 설치

npm install  # 의존성 설치
npm rebuild  # 네이티브 모듈 리빌드

프로젝트 파일 패키징

node_modules 디렉토리를 nodejs/node_modules 경로로 복사하고 압축했다. (가장 중요)

mkdir -p nodejs/node_modules
cp -r node_modules/* nodejs/node_modules/
zip -r node-cld-lambda.zip nodejs

S3 업로드

Zip 한 파일을 S3 Bucket에 업로드 한다.

aws s3 cp cld-layer.zip s3://your-s3-bucket/

7. 람다 레이어 생성

Lambda Layer를 생성한다.

만약 50MB 이하라면 굳이 S3로 업로드 할 필요는 없다.

S3 Bucket에 접속하여 해당 파일을 찾으면 URL 경로를 얻을 수 있다.

이렇게 하면 아래와 같이 레이어가 정상적으로 추가된것을 확인 할 수 있다.

Lambda Function에 Layer 추가

아래의 Add a Layer 버튼을 클릭해 레이러를 추가해준다

주의사항

  • 파일 경로: node_modules 디렉토리를 nodejs/node_modules 경로로 ZIP해야 Lambda 레이어에서 올바르게 인식된다.
  • 람다 핸들러 설정: Lambda 콘솔에서 핸들러 설정이 index.handler로 되어 있는지 확인한다.
  • 빌드 환경: C++로 작성된 네이티브 모듈을 빌드할 때는 Linux 환경에서 빌드해야 하는것을 추천한다. Mac OS나 Windows에서 빌드하면 AWS Lambda 환경과 맞지 않아 오류가 발생할 수 있다. AWS Lambda 공식 문서를 참고하여, AWS Lambda와 동일한 환경에서 빌드하는 것이 중요하다.

EC2 인스턴스를 사용하는 이유는 AWS Lambda와 동일한 Amazon Linux 환경에서 네이티브 모듈을 빌드할 수 있기 때문이다. 이렇게 하면 "invalid ELF header" 오류를 피할 수 있다.

결론

이 과정을 통해 node-cld 라이브러리를 AWS Lambda에서 성공적으로 사용하게 되었다. 알고 나면 엄청 간단하다! 빌드 환경을 AWS Lambda와 일치시키는 것이 중요하며, 이를 위해 AWS EC2 인스턴스를 활용했다. 여러 우여곡절이 있었지만 그래도 비교적 빨리 알아내서 다행이다!

profile
Learner

0개의 댓글