Lambda 배포 패키지를 업로드할 때 발생하는 "permission denied" 또는 "unable to import module" 오류를 해결하려면 어떻게 해야 하나요?

4분 분량
0

AWS Lambda 배포 패키지를 업로드할 때 "permission denied" 또는 "unable to import module" 오류가 발생합니다.

간략한 설명

Lambda는 배포 패키지의 코드 파일 및 모든 종속 라이브러리에 대한 전역 읽기 권한이 필요합니다. 올바른 보안 권한으로 Lambda 배포 패키지를 구성하지 않으면 파일을 업로드하려고 할 때 Lambda가 오류를 반환합니다. permission deniedunable to import module 오류는 일반적으로 지속적 통합 애플리케이션이 배포 패키지를 만들 때 발생합니다.

Python과 같은 해석된 런타임의 경우 배포 패키지의 파일에 대한 올바른 권한은 644입니다. 배포 패키지의 폴더에 대한 올바른 권한은 755입니다.

Go와 같은 컴파일된 런타임의 경우 배포 패키지의 실행 파일 및 디렉터리에 대한 올바른 권한은 Unix 권한 숫자 표기법으로 755입니다.

참고: Lambda는 POSIX 권한을 사용하기 때문에 Lambda 배포 패키지를 빌드할 때 POSIX 호환 운영 체제(OS)를 사용하는 것이 가장 좋습니다. 호환 OS에는 Linux, Unix 또는 macOS가 포함됩니다. 빌드 환경의 권한 모델과 Lambda의 런타임 환경이 같으면 권한 문제가 발생할 가능성이 줄어듭니다.

Windows 사용자로서 권한 문제를 해결하려면 다음 작업 중 하나를 완료하여 Linux 환경을 설정합니다.

해결 방법

오류의 원인이 되는 파일 또는 폴더를 찾습니다.

Lambda 함수 코드를 작성하는 데 사용한 프로그래밍 언어에 따라 오류 메시지에서 오류의 원인이 명확하지 않을 수 있습니다.

예를 들어 Node.js 함수 오류 메시지에는 오류의 원인인 파일 또는 폴더의 이름이 나열됩니다. 그러나 Python 함수 오류 메시지에는 오류의 원인인 파일 또는 폴더의 이름이 나열되지 않습니다.

Node.js Lambda 함수 권한 거부 오류의 예

{  "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 함수에서 모듈을 가져올 수 없음 오류의 예

“모듈 'index'를 가져올 수 없음: index라는 모듈이 없습니다."

이 오류를 해결하려면 Python에서 Lambda 코드를 실행할 때 나타나는 "Unable to import module" 오류를 해결하려면 어떻게 해야 하나요?를 참조하세요.

모듈 없음 Lambda 배포 패키지가 Amazon Linux 2 또는 Amazon Linux 2023이 아닌 경우 Amazon Linux 버전과의 호환성이 일치해야 합니다. 이렇게 하려면 패키지를 설치할 때 다음 매개 변수를 사용합니다. 다음 예제에서는 Lambda 함수가 있는 동일한 폴더에 있는 Python 3.12 OS 및 NumPy 라이브러리를 사용합니다.

pip3 install --platform manylinux2014_x86_64 --target . --python-version 3.12 --only-binary=:all: numpy

사용 사례에 따라 다음 값을 조정합니다. 

  • platform manylinux2014_x86_64 값은 패키지의 플랫폼을 지정합니다.
  • python-version 3.12 값은 패키지가 지정된 Python 버전과 호환됨을 나타냅니다. Lambda에서 대상으로 하는 Python 런타임 버전에 따라 이 값을 조정합니다.
  • only-binary=:all 매개 변수는 pip에 바이너리만 다운로드하도록 지시합니다. 이렇게 하면 패키지가 Lambda 런타임 환경과 호환됩니다.

필요한 권한이 누락된 외부 라이브러리에 대한 Python Lambda 함수 오류의 예

“모듈 'index'를 가져올 수 없음: requests라는 모듈이 없습니다."

배포 패키지 .zip 파일의 모든 파일 및 폴더에 대한 권한을 확인하려면 명령줄 인터페이스(CLI)에서 zipinfo 명령을 실행합니다.

zipinfo lambda-package.zip

참고: lambda-package.zip를 배포 패키지 .zip 파일 이름으로 바꿉니다.

zipinfo 명령 응답의 예

Archive:  lambda-package.zipZip 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--------, 또는 Unix 권한 숫자 표기법으로 400입니다. 파일에 대한 사용 권한을 644로 업데이트합니다. 자세한 내용은 Wikipedia 웹 사이트에서 기존 Unix 사용 권한 표기법을 참조하세요.

배포 패키지의 권한 업데이트

참고: 다음 명령은 Linux, Unix 및 macOS에서만 작동합니다.

  1. 배포 패키지 내의 파일 및 폴더의 압축을 임시 폴더에 풀려면 CLI에서 다음 명령을 실행합니다.

    mkdir temp-folder; unzip lambda-package.zip -d temp-folder ;cd temp-folder;ls -l

    참고: lambda-package.zip를 배포 패키지의 파일 이름으로 바꾸고 temp-folder를 임시 폴더의 이름으로 바꿉니다.

  2. 라이브러리 파일의 사용 권한을 업데이트합니다.
    참고: 디렉토리를 실행 가능하게 만들고 압축을 푼 배포 패키지의 모든 파일 및 폴더를 모든 사용자가 읽을 수 있도록 하려면 chmod 명령을 실행합니다.

    $ sudo chmod 644 $(find -type f) && chmod 755 $(find -type d)

    압축을 푼 배포 패키지 파일을 컴파일된 런타임에 대해 실행할 수 있도록 하려면 다음 명령을 실행합니다.

    $ chmod 755 -R
  3. 사용 권한을 수정한 후 다음 명령을 실행하여 파일 및 폴더를 새 .zip 파일로 다시 패키지합니다.

    zip -r new-lambda-package.zip *
  4. 새 배포 패키지를 업로드합니다.

AWS 공식
AWS 공식업데이트됨 6달 전