Node.js에서 AWS Lambda 코드를 실행할 때 "Cannot find module" 또는 "Cannot find Package" 오류가 발생합니다.
간단한 설명
사용자의 Lambda 환경이 Node.js 코드에서 지정된 라이브러리를 찾을 수 없는 경우, 이러한 오류 중 하나가 발생합니다. 이러한 오류는 Lambda에 모든 Node.js 라이브러리가 미리 패키지되어 있지 않기 때문에 발생합니다.
- CommonJS에 모듈이 없는 경우 다음 오류가 발생합니다. Runtime.ImportModuleError: Error: Cannot find module.
- JavaScript ES6에 모듈이 없는 경우 다음 오류가 발생합니다. Error [ERR_MODULE_NOT_FOUND]: Cannot find package.
이러한 오류를 해결하려면, 사용자의 Node.js 코드에서 사용자가 사용하려는 라이브러리가 포함된 배포 패키지 또는 Lambda 계층을 생성해야 합니다.
Node.js 런타임 16과 이전 버전에서는, Lambda가 계층을 이룬 JavaScript ES 모듈 종속성을 지원하지 않습니다. 배포에는 종속성을 포함해야 합니다.
Lambda는 Node.js 18에 대해 JavaScript ES 모듈 종속성을 지원합니다.
다음 단계를 사용하여 Lambda 계층을 생성하세요. 배포 패키지 대신 Lambda 계층을 생성하면 여러 Lambda 함수에서 계층을 재사용할 수 있습니다. 각 Lambda 런타임은 특정 /opt 디렉터리 폴더를 PATH 변수에 추가합니다. 계층이 같은 폴더 구조를 사용하는 경우, Lambda 함수의 코드는 경로를 지정하지 않고 계층 콘텐츠에 액세스할 수 있습니다.
중요: Node.js용으로 가져오는 라이브러리는 nodejs/node_modules 폴더 구조 내에 있어야 합니다.
해결 방법
사용자 Lambda 런타임의 기반이 되는 같은 운영 체제에 Lambda 계층을 생성하는 것이 가장 좋습니다. 예를 들어, 모든 버전의 Node.js는 Amazon Linux 2 Amazon Machine Images(AMI)를 기반으로 합니다.
Node.js 라이브러리에 Lambda 계층을 생성하세요.
1. Amazon Linux 2 AMI에서 Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스를 생성합니다.
2. [publish-layer-version API를 호출할 권한이 있는 AWS Identity and Access Management(IAM) 역할](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html)을 생성합니다. 그런 다음, IAM 역할을 EC2 인스턴스에 연결합니다.
참고: 이제 사용자의 EC2 인스턴스는 publish-layer-version API 호출을 위한 Lambda 계층을 업로드할 권한을 갖게 되었습니다.
3. 사용자의 EC2 인스턴스에 연결한 다음 Node.js를 설치합니다.
$ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash
$ . ~/.nvm/nvm.sh
$ nvm install node
4. nodejs 폴더를 생성하세요.
$ mkdir nodejs
5. nodejs 폴더에 aws-xray-sdk 라이브러리를 설치합니다.
$ cd nodejs
$ npm init ***answer all queries regarding initialization that create a package.json file***
$ npm install --save aws-xray-sdk
참고: aws-xray-sdk 예제 라이브러리를 사용자가 가져오려는 Node.js 라이브러리로 교체합니다.
6. aws-xray-sdk 라이브러리에 zip 아카이브를 생성하세요.
$ zip -r layer.zip nodejs
참고: aws-xray-sdk 라이브러리는 Node.js 계층에 필요한 폴더 형식인 nodejs/node_modules로 되어 있습니다.
7. Lambda 계층 게시:
$ aws lambda publish-layer-version --layer-name xray --zip-file fileb://layer.zip --compatible-runtimes nodejs12.x --region us-east-1
**참고:**코드 읽기에 ECMAScript 6(ES6) 또는 CommonJS 모듈을 추가하려면 JavaScript ES6/CommonJS 구문을 참조하십시오.
관련 정보
"permission denied" 또는 "unable to import module" 오류를 해결하려면 어떻게 해야 합니까?