Error: Cannot find module 'index'

Ryan Lee·2024년 6월 20일
0
post-thumbnail

lamdba 함수를 업로드하고 실행시 Error: Cannot find module 'index'\nRequire stack:\n- /var/runtime/index.mjs 에러의 발생 원인과 해결 방법

문제 상황

lamdba를 구성하고 함수 코드를 업로드후 테스트 실행시 에러가 발생
상황

  • Node.js 20.x 기반의 함수
  • index.js로만 작성된 간단한 db 콜 기능
{
"errorType": "Runtime.ImportModuleError",
"errorMessage": "Error: Cannot find module 'index'\nRequire stack:\n- /var/runtime/index.mjs",
"trace": [
"Runtime.ImportModuleError: Error: Cannot find module 'index'",
"Require stack:",
"- /var/runtime/index.mjs",
" at _loadUserApp (file:///var/runtime/index.mjs:1087:17)",
" at async UserFunction.js.module.exports.load (file:///var/runtime/index.mjs:1119:21)",
" at async start (file:///var/runtime/index.mjs:1282:23)",
" at async file:///var/runtime/index.mjs:1288:1"
]
}

원인으로 의심된다고 하는 것들

  1. handler 파일과 함수 이름 확인

    • lambda 함수의 핸들러는 {파일명}.{핸들러 함수명} 형식으로 지정해야 한다.
    • 예를 들어, 파일명이 index.js이고 함수 이름이 handler라면 핸들러는 index.handler로 설정
  2. 파일 경로 및 모듈 확인

    • Lambda에 배포하는 ZIP 파일에 필요한 모든 파일과 모듈이 포함되어 있는지 확인
    • npm 혹은 yarn 설치 패키지인 'node_modules'디렉토리가 포함되어 있어야 함
    • 다음과 같은 구조
    lambda-funtion-name/
    ├── index.js
    └── node_modules/
    		├── mysql2/
    		├── dayjs/
    		└── ...
  3. package.json 확인 및 종속성 설치

    • package.json 파일이 올바르게 구성되어 있는지 확인하고 npm install (yarn) 명령어를 통해 종속성을 설치했는지 확인
    {
    	"name": "function name",
    	"version": "1.0.0",
    	"main": "index.js",
    	"type": "module",
    
    	"dependencies": {
    		"aws-sdk": "^2.1644.0",
    		"dayjs": "^1.11.11",
    		"fs": "^0.0.1-security",
    		"mysql2": "^3.10.1",
    		"mysql2-promise": "^0.1.4"
    	}
    }

해결 시도

  • 종속성이 미설치 된 것도 아니었고 파일과 핸들러 함수명도 이상없었음(index.handler)
    export async function handler(event) {
		// db값을 확인하고 정보를 가공
		return {
    		statusCode: 200,
        	body: 'ok'
    	};
	}
  • require를 사용하지 말고 import를 사용하라는 추천이 있어 require를 모두 import로 변경 -> 실패
    - import를 사용하기 위해 package.json에 "type": "module" 추가
  • zip파일을 직접 업로드가 아닌 s3버킷을 통한 배포 -> 실패
  • console.log만 찍는 수준의 함수를 만들어 테스트 해보니 동일한 에러가 발생
    - 에러 내용에 index.mjs가 있으니 index.js가 아니라 index.mjs로 바꾸면 혹시나하는 테스트도 해봤지만 실패
  • zip파일의 크기가 작아지니 코드 소스의 구조를 확인 할수 있었고 이상한 점을 발견
    - 디렉토리 구조가 zip파일명 - 소스파일 구조가 아닌 lambda 함수 - zip파일명 - 소스파일 구조로 업로드가 되어 있음
    lambda-funtion-name/
     	└── zipfile-name
    			├── index.js
    			└── node_modules/
    					├── mysql2/
    					├── dayjs/
    					└── ...
    • 런타임 설정 화면
  • 핸들러 함수가 선언된 index.js가 기본 생성과 다르게 경로를 한번 더 거치고 있으니 핸들러의 경로도 바꿔야 되지 않을까? -> 성공

해결

  • 런타임 설정 -> 편집
  • 핸들러를 index.handler -> zipfile-name/index.handler으로 수정
  • 오류 없이 테스트 성공
  • AWS Lambda .zip 파일은 업로드한 함수 코드가 lambda 함수에 적용되는게 아니라 업로드한 파일을 그대로 해제하는 방식인듯.. 그러니 index.js의 경로를 찾지 못할 수 밖에
profile
왜 또 아픈 상처에 소금을 뿌리십니까

0개의 댓글