AWS Lambda에 텍스트의 언어를 감지하는 GYP 모듈을 설치해야 했는데, 이게 꽤나 무거워서 150MB정도 되었다. 그래서 처음에는 "일단 올려보자!" 하고 빌드를 그대로 람다에 올려봤다. 하지만 역시나 오류가 났다. 여러 방식을 찾아보면서 고민하다가 모듈 전체를 확인해보니 C++ 언어가 보였다...
"이건 뭔가 잘못됐다!"라는 느낌이 확 왔다. 그래서 공식 문서를 다시 읽어보았다. 레이어를 추가해서 해결하는 방법을 찾았고 레이어를 추가하는 것은 너무 쉽지만 GYP를 Lambda 환경에 빌드 하고 폴더링 구조에 맞게 배포하는게 쉽지만은 않았다.
나는 Language Detecting을 하는 cld-node를 배포가 목표였다. 어떻게 AWS Lambda에 이 라이브러리를 배포했는지 기록해보려 한다.
GYP (Generate Your Projects)는 Google에서 개발한 프로젝트 생성 도구이다. GYP는 빌드 설정을 다양한 플랫폼에 맞게 생성해주는 도구로, 주로 네이티브 모듈을 컴파일할 때 사용된다. Node.js에서는 네이티브 모듈을 빌드하기 위해 GYP를 사용하며, 이는 C++ 코드를 Node.js에서 사용할 수 있도록 해주는 도구이다.
먼저, 빌드 환경 차이를 극복하기 위해 AWS EC2 인스턴스를 활용했다. (생각보다 여기서 많이 해맸다. 어떻게 보면 당연하지만 당연할수록 더 놓치기 쉽다…!)
만약 본인이 Linux를 사용하고 있다면 따로 필요 없을 수 있으니 참고
EC2에서 빌드를 하는 방법이 가장 정확했다
먼저, AWS Lambda와의 환경 차이를 극복하기 위해 AWS EC2 인스턴스를 활용했다. (Ec2를 띄우는 방법은 생략하겠다)
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
wget https://github.com/사용자명/프로젝트명/archive/refs/heads/main.zip -O project.zip
unzip project.zip
cd 프로젝트명-main
오른쪽 상단에 있는 Upload 버튼을 클릭하여 해당 파일을 업로드 한다.
aws s3 cp s3://your-s3-bucket/node-cld.zip node-cld.zip
unzip node-cld.zip
cd node-cld
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
Zip 한 파일을 S3 Bucket에 업로드 한다.
aws s3 cp cld-layer.zip s3://your-s3-bucket/
만약 50MB 이하라면 굳이 S3로 업로드 할 필요는 없다.
S3 Bucket에 접속하여 해당 파일을 찾으면 URL 경로를 얻을 수 있다.

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

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


node_modules 디렉토리를 nodejs/node_modules 경로로 ZIP해야 Lambda 레이어에서 올바르게 인식된다. 
index.handler로 되어 있는지 확인한다.EC2 인스턴스를 사용하는 이유는 AWS Lambda와 동일한 Amazon Linux 환경에서 네이티브 모듈을 빌드할 수 있기 때문이다. 이렇게 하면 "invalid ELF header" 오류를 피할 수 있다.
이 과정을 통해 node-cld 라이브러리를 AWS Lambda에서 성공적으로 사용하게 되었다. 알고 나면 엄청 간단하다! 빌드 환경을 AWS Lambda와 일치시키는 것이 중요하며, 이를 위해 AWS EC2 인스턴스를 활용했다. 여러 우여곡절이 있었지만 그래도 비교적 빨리 알아내서 다행이다!