AWS Lambda 배포 패키지를 업로드하려고 할 때 권한이 거부되거나 모듈 오류를 가져올 수 없습니다. 이러한 오류를 해결하려면 어떻게 해야 합니까?
간략한 설명
Lambda에는 배포 패키지의 코드 파일 및 종속 라이브러리에 대한 글로벌 읽기 권한이 필요합니다. Lambda 배포 패키지가 올바른 보안 권한으로 구성되지 않은 경우 파일을 업로드하려고 할 때 Lambda가 오류를 반환합니다. 이러한 permission denied 및 unable to import module 오류는 배포 패키지가 지속적 통합 애플리케이션에 의해 생성될 때 대부분 발생합니다.
Lambda 배포 패키지 내의 모든 실행 파일에 대한 올바른 권한 설정은 Unix 사용 권한 숫자 표기법에서 644입니다. 배포 패키지 내의 폴더의 경우 올바른 권한 설정은 755입니다.
참고: Lambda는 POSIX 권한을 사용하기 때문에 Lambda 배포 패키지를 빌드할 때 POSIX 호환 운영 체제를 사용하는 것이 좋습니다. 예: Linux, Unix 또는 macOS 빌드 환경의 권한 모델과 Lambda 런타임 환경의 권한 모델이 동등하면 권한 문제가 발생할 가능성이 낮아집니다.
개발용으로 Windows를 사용하는 경우 권한 문제를 수정해야 한다면 다음 중 하나를 수행하여 Linux 환경을 설정할 수 있습니다.
해결 방법
오류의 원인이 되는 파일 또는 폴더 확인
Lambda 함수 코드를 작성할 때 사용한 프로그래밍 언어에 따라 오류 메시지에서 오류 원인이 명확하지 않을 수도 있습니다.
예를 들어, Node.js 함수 오류 메시지에는 오류의 원인이 되는 파일 또는 폴더의 이름이 나열됩니다. 그러나 Python 함수 오류 메시지에는 오류의 원인이 되는 파일 또는 폴더의 이름이 나열되지 않습니다.
Node.js Lambda 함수의 permission denied 오류 예제
{
"errorMessage": "EACCES: permission denied, open '/var/task/index.js'",
"errorType": "Error",
"stackTrace": [
"Object.fs.openSync (fs.js:641:18)",
"Object.fs.readFileSync (fs.js:509:33)",
"Object.Module._extensions..js (module.js:578:20)",
"Module.load (module.js:487:32)",
"tryModuleLoad (module.js:446:12)",
"Function.Module._load (module.js:438:3)",
"Module.require (module.js:497:17)",
"require (internal/module.js:20:19)"
]
}
Python Lambda 함수의 unable to import module 오류 예제
Unable to import module 'index': No module named index
Python Lambda 함수의 unable to import module error for external libraries that are missing required permissions 예제
Unable to import module 'index': No module named requests
배포 패키지 .zip 파일 내의 모든 파일 및 폴더에 대한 권한을 확인하려면 명령줄 인터페이스(CLI) 에서 다음 zipinfo 명령을 실행합니다.
중요: lambda-package.zip을 배포 패키지 .zip 파일 이름으로 바꿉니다.
zipinfo lambda-package.zip
Zipinfo 명령 응답 예제
Archive: lambda-package.zip
Zip file size: 305 bytes, number of entries: 1
-r-------- 3.0 unx 188 tx defN 21-Feb-13 20:48 example.py
1 file, 188 bytes uncompressed, 135 bytes compressed: 28.2%
참고: 이 예제에서 example.py의 권한 설정은 **-r--------**이거나 유닉스 권한 숫자 표기법으로 400이므로 파일의 권한을 644로 업데이트해야 합니다.
배포 패키지에 대한 권한 업데이트
참고: 다음 명령은 Linux, Unix 및 macOS 운영 체제에서만 작동합니다.
1. 배포 패키지 내의 파일 및 폴더를 임시 폴더에 압축 해제하려면 CLI에서 다음 명령을 실행합니다.
중요: lambda-package.zip을 배포 패키지의 파일 이름으로 바꿉니다. temp-folder를 새 임시 폴더에 지정할 이름으로 바꿉니다.
mkdir temp-folder; unzip lambda-package.zip -d temp-folder ;cd temp-folder;ls -l
2. 라이브러리 파일의 권한을 업데이트합니다.
참고: 현재 디렉터리의 모든 파일과 폴더를 모든 사용자가 읽을 수 있도록 하려면 다음 chmod 명령을 실행하세요.
$ chmod 644 $(find /tmp/package_contents -type f)
$ chmod 755 $(find /tmp/package_contents -type d)
3. 권한을 수정한 후 다음 명령을 실행하여 파일 및 폴더를 새 .zip 파일로 다시 패키지합니다.
zip -r new-lambda-package.zip *
4. 새 배포 패키지를 업로드합니다.
관련 정보
Lambda 시작하기