.zip 파일 아카이브를 사용하여 Python Lambda 함수 배포 - AWS Lambda

.zip 파일 아카이브를 사용하여 Python Lambda 함수 배포

참고

Python 3.6 런타임은 2022년 7월 18일에 지원이 종료되었습니다. 자세한 정보는 런타임 사용 중단 정책을 참조하십시오.

AWS Lambda 함수의 코드는 스크립트 또는 컴파일된 프로그램과 해당 종속 항목으로 구성됩니다. 함수 코드는 배포 패키지를 사용하여 Lambda에 배포합니다. Lambda는 컨테이너 이미지 및 .zip 파일 아카이브의 두 가지 배포 패키지를 지원합니다.

.zip 파일 아카이브에 대한 배포 패키지를 만들려면 명령줄 도구에 기본 제공 .zip 파일 아카이브 유틸리티 또는 다른 .zip 파일 유틸리티(예: 7zip)를 사용할 수 있습니다. .zip 파일을 배포 패키지로 사용하려면 다음 요구 사항에 유의하세요.

  • .zip 파일은 Lambda에서 함수의 코드와 함수 코드를 실행하는 데 사용되는 종속성(해당되는 경우)을 포함해야 합니다. 함수가 표준 라이브러리 또는 AWS SDK 라이브러리에만 의존하는 경우 이러한 라이브러리를 .zip 파일에 포함하지 않아도 됩니다. 이러한 라이브러리는 지원되는 Lambda 런타임 환경에 포함되어 있습니다.

  • .zip 파일이 50MB보다 큰 경우 Amazon Simple Storage Service(Amazon S3) 버킷에서 함수에 업로드하는 것이 좋습니다.

  • 배포 패키지에 네이티브 라이브러리가 포함된 경우 AWS Serverless Application Model(AWS SAM)를 사용하여 배포 패키지를 빌드할 수 있습니다. AWS SAM CLI sam build 명령을 --use-container와 함께 사용하여 배포 패키지를 만들 수 있습니다. 이 옵션은 Lambda 실행 환경과 호환되는 도커 이미지 내부에 배포 패키지를 빌드합니다.

    자세한 내용은 AWS Serverless Application Model 개발자 안내서sam 빌드를 참조하세요.

  • 함수의 이 명령 세트 아키텍처와 호환되도록 배포 패키지를 빌드해야 합니다.

  • Lambda는 POSIX 파일 권한을 사용하므로 .zip 파일 아카이브를 만들기 전에 배포 패키지 폴더에 대한 사용 권한을 설정해야 할 수 있습니다.

참고

Python 패키지는 __init__.py 파일에 초기화 코드를 포함할 수 있습니다. Python 3.9 이전에는 Lambda가 함수 핸들러 디렉터리 또는 상위 디렉터리에 있는 패키지에 __init__.py 코드를 실행하지 않았습니다. Python 3.9 이상 릴리스에서는 Lambda가 초기화 중에 이러한 디렉터리의 패키지에 init 코드를 실행합니다.

Lambda는 초기화된 환경에서 각 함수 호출이 아닌 실행 환경이 처음 초기화되었을 때만 init 코드를 실행합니다.

사전 조건

서비스 API 작업을 호출하려면 AWS Command Line Interface(AWS CLI)가 필요합니다. AWS CLI를 설치하려면 AWS Command Line Interface 사용 설명서의 AWS CLI 설치를 참조하세요.

런타임 종속성이란 무엇인가요?

런타임 종속 항목이 있거나 없는 Lambda 함수를 생성하거나 업데이트하려면 배포 패키지가 필요합니다. 배포 패키지는 Lambda에서 함수의 코드 및 종속 항목(해당되는 경우)을 실행하는 소스 번들 역할을 합니다.

종속 항목은 함수의 코드에 대한 Lambda 런타임 환경에 포함되지 않은 패키지, 모듈 또는 기타 어셈블리 종속 항목이 될 수 있습니다.

다음은 런타임 종속 항목이 없는 Lambda 함수를 설명합니다.

  • 함수의 코드가 Python 3.8 이상이면, 표준 Python 수학 및 로깅 라이브러리에만 의존하는 경우 .zip 파일에 라이브러리를 포함하지 않아도 됩니다. 이러한 라이브러리는 Python 런타임에 포함되어 있습니다.

  • 함수의 코드가 AWS SDK for Python (Boto3)에 의존하는 경우 .zip 파일에 boto3 라이브러리를 포함하지 않아도 됩니다. 이러한 라이브러리는 Python3.8 이상의 런타임에 포함되어 있습니다.

참고: 최신 기능 세트 및 보안 업데이트를 활성화하려면 Lambda가 주기적으로 Boto3 라이브러리를 업데이트해야 합니다. 함수가 사용하는 종속성을 완전히 제어하려면 모든 종속성을 배포 패키지로 패키징하세요.

종속성이 없는 배포 패키지

배포 패키지에 대한 .zip 파일을 만듭니다.

배포 패키지를 만드는 방법

  1. 명령 프롬프트를 열고 my-math-function 프로젝트 디렉터리를 만듭니다. 예를 들어, macOS에서는 다음을 수행합니다.

    mkdir my-math-function
  2. my-math-function 프로젝트 디렉터리로 이동합니다.

    cd my-math-function
  3. GitHub에서 샘플 Python 코드의 콘텐츠를 복사하고 이름이 lambda_function.py인 새 파일에 저장합니다. 디렉터리 구조는 다음과 같아야 합니다.

    my-math-function$ | lambda_function.py
  4. .zip 파일의 루트에 lambda_function.py 파일을 추가합니다.

    zip my-deployment-package.zip lambda_function.py

    그러면 프로젝트 디렉터리에 my-deployment-package.zip 파일이 생성됩니다. 이 명령으로 다음 출력이 생성됩니다.

    adding: lambda_function.py (deflated 50%)

종속성이 있는 배포 패키지

배포 패키지에 대한 .zip 파일을 만듭니다.

배포 패키지를 만드는 방법

  1. 명령 프롬프트를 열고 my-sourcecode-function 프로젝트 디렉터리를 만듭니다. 예를 들어, macOS에서는 다음을 수행합니다.

    mkdir my-sourcecode-function
  2. my-sourcecode-function 프로젝트 디렉터리로 이동합니다.

    cd my-sourcecode-function
  3. 다음과 같은 샘플 Python 코드의 콘텐츠를 복사하고 이름이 lambda_function.py인 새 파일에 저장합니다.

    import requests def lambda_handler(event, context): response = requests.get("https://www.example.com/") print(response.text) return response.text

    디렉터리 구조는 다음과 같아야 합니다.

    my-sourcecode-function$ | lambda_function.py
  4. 요청 라이브러리를 새 package 디렉터리에 설치합니다.

    pip install --target ./package requests
  5. 루트에서 설치된 라이브러리를 포함하는 배포 패키지를 만듭니다.

    cd package zip -r ../my-deployment-package.zip .

    그러면 프로젝트 디렉터리에 my-deployment-package.zip 파일이 생성됩니다. 이 명령으로 다음 출력이 생성됩니다.

    adding: chardet/ (stored 0%) adding: chardet/enums.py (deflated 58%) ...
  6. zip 파일의 루트에 lambda_function.py 파일을 추가합니다.

    cd .. zip -g my-deployment-package.zip lambda_function.py

가상 환경 사용

가상 환경을 사용하여 Python 함수를 업데이트하려면

  1. 가상 환경을 활성화합니다. 예:

    ~/my-function$ source myvenv/bin/activate
  2. pip를 사용하여 라이브러리를 설치합니다.

    (myvenv) ~/my-function$ pip install requests
  3. 가상 환경을 비활성화합니다.

    (myvenv) ~/my-function$ deactivate
  4. 설치된 라이브러리를 사용하는 배포 패키지를 루트에 생성합니다.

    ~/my-function$cd myvenv/lib/python3.8/site-packages zip -r ../../../../my-deployment-package.zip .

    마지막 명령은 배포 패키지를 my-function 디렉터리의 루트에 저장합니다.

    작은 정보

    site-packages 또는 dist-packages 및 첫 번째 폴더 lib 또는 lib64에 라이브러리가 나타날 수 있습니다. pip show 명령을 사용하여 특정 패키지를 찾을 수 있습니다.

  5. 배포 패키지 루트에 함수 코드 파일을 추가합니다.

    ~/my-function/myvenv/lib/python3.8/site-packages$ cd ../../../../ ~/my-function$ zip -g my-deployment-package.zip lambda_function.py

    이 단계를 완료한 후에는 다음과 같은 디렉터리 구조가 있어야 합니다.

    my-deployment-package.zip$ │ lambda_function.py │ __pycache__ │ certifi/ │ certifi-2020.6.20.dist-info/ │ chardet/ │ chardet-3.0.4.dist-info/ ...

.zip 파일을 함수에 배포합니다.

함수에 새 코드를 배포하려면 새.zip 파일 배포 패키지를 업로드합니다. Lambda 콘솔을 사용하여 .zip 파일을 함수에 업로드하거나 UpdateFunctionCode CLI 명령을 사용할 수 있습니다.

다음 예제를 my-deployment-package.zip이라는 파일에 업로드합니다. fileb:// 파일 접두사를 사용하여 이진 .zip 파일을 Lambda에 업로드합니다.

~/my-function$ aws lambda update-function-code --function-name MyLambdaFunction --zip-file fileb://my-deployment-package.zip { "FunctionName": "mylambdafunction", "FunctionArn": "arn:aws:lambda:us-west-2:123456789012:function:mylambdafunction", "Runtime": "python3.9", "Role": "arn:aws:iam::123456789012:role/lambda-role", "Handler": "lambda_function.lambda_handler", "CodeSize": 5912988, "CodeSha256": "A2P0NUWq1J+LtSbkuP8tm9uNYqs1TAa3M76ptmZCw5g=", "Version": "$LATEST", "RevisionId": "5afdc7dc-2fcb-4ca8-8f24-947939ca707f", ... }