Lambda 계층은 추가 코드 또는 데이터를 포함하는 .zip 파일 아카이브입니다. 계층에는 일반적으로 라이브러리 종속 항목, 사용자 지정 런타임 또는 구성 파일이 포함됩니다. 계층을 생성하려면 세 가지 일반적인 단계를 거칩니다.
-
계층 콘텐츠를 패키징합니다. 즉, 함수에 사용하려는 종속성이 포함된 .zip 파일 아카이브를 생성합니다.
-
Lambda에서 계층을 생성합니다.
-
계층을 함수에 추가합니다.
이 주제에는 외부 라이브러리 종속성이 있는 Python Lambda 계층을 올바르게 패키징하고 생성하는 방법에 대한 단계와 지침이 포함되어 있습니다.
주제
사전 조건
이 섹션의 단계를 수행하려면 다음이 필요합니다.
-
Python 3.11
및 pip 패키지 설치 관리자
이 주제에서는 awsdocs GitHub 리포지토리에 있는 layer-python
layer-python
샘플 애플리케이션에는 두 가지 예제가 있습니다.
-
첫 번째 예제는
requests
라이브러리를 Lambda 계층으로 패키징하는 것입니다. layer/
디렉터리는 계층을 생성하는 스크립트를 포함합니다.function/
디렉터리는 계층이 작동하는지 테스트하는 데 도움이 되는 샘플 함수를 포함합니다. 이 자습서의 대부분은 이 계층을 생성하고 패키징하는 방법을 안내합니다. -
두 번째 예제는
numpy
라이브러리를 Lambda 계층으로 패키징하는 것입니다. layer-numpy/
디렉터리는 계층을 생성하는 스크립트를 포함합니다.function-numpy/
디렉터리는 계층이 작동하는지 테스트하는 데 도움이 되는 샘플 함수를 포함합니다. 이 계층을 생성하고 패키징하는 방법에 대한 예제는 manylinux 휠 배포를 사용하여 작업 섹션을 참조하세요.
Amazon Linux와의 Python 계층 호환성
계층을 생성하는 첫 번째 단계는 모든 계층 콘텐츠를.zip 파일 아카이브로 번들링하는 것입니다. Lambda 함수는 Amazon Linux에서 실행되기 때문에 계층 콘텐츠는 Linux 환경에서 컴파일하고 빌드할 수 있어야 합니다.
Python에서는 대부분의 패키지를 소스 배포 외에 휠.whl
파일)로도 사용할 수 있습니다. 각 휠은 Python 버전, 운영 체제, 머신 명령어 세트의 특정 조합을 지원하는 구축된 배포판의 일종입니다.
휠은 계층이 Amazon Linux와 호환되는지 확인하는 데 유용합니다. 종속 항목을 다운로드할 때 가능하면 유니버설 휠을 다운로드하세요. (기본적으로 pip
은 유니버설 휠이 있는 경우 이를 설치합니다.) 유니버설 휠에는 플랫폼 태그로 any
가 포함되어 있으며 이는 Amazon Linux를 포함한 모든 플랫폼과 호환됨을 나타냅니다.
다음 예제에서는 requests
라이브러리를 Lambda 계층으로 패키징합니다. requests
라이브러리는 유니버설 휠로 사용할 수 있는 패키지의 예입니다.
모든 Python 패키지가 유니버설 휠로 배포되는 것은 아닙니다. 예를 들어 numpy
manylinux
배포판을 다운로드하여 Amazon Linux와의 호환성을 확인하세요. 이러한 계층을 패키징하는 방법에 대한 자세한 지침은 manylinux 휠 배포를 사용하여 작업 섹션을 참조하세요.
드물지만 Python 패키지를 휠로 사용할 수 없는 경우도 있습니다. 소스 배포
Python 런타임의 계층 경로
함수에 계층을 추가하면 Lambda는 계층 콘텐츠를 해당 실행 환경의 /opt
디렉터리로 추출합니다. 각 Lambda 런타임에 대해 PATH
변수에는 /opt
디렉터리 내의 특정 폴더 경로가 이미 포함되어 있습니다. Lambda가 계층 콘텐츠를 가져오도록 하려면 계층 .zip 파일의 종속성이 다음 폴더 경로에 있어야 합니다.
-
python
-
python/lib/python3.
x
/site-packages
예를 들어 이 자습서에서 생성하는 결과 레이어 .zip 파일의 디렉터리 구조는 다음과 같습니다.
layer_content.zip
└ python
└ lib
└ python3.11
└ site-packages
└ requests
└ <other_dependencies> (i.e. dependencies of the requests package)
└ ...
requests
python/lib/python3.11/site-packages
디렉터리에 올바르게 위치합니다. 이렇게 하면 함수 호출 중에 Lambda가 라이브러리를 찾을 수 있습니다.
계층 콘텐츠의 패키징
이 예에서는 Python requests
라이브러리를 계층 .zip 파일로 패키징합니다. 다음 단계를 완료하여 계층 콘텐츠를 설치하고 패키징합니다.
계층 콘텐츠를 설치하고 패키징하려면 다음을 수행합니다.
-
sample-apps/layer-python
디렉터리에 필요한 샘플 코드가 포함된aws-lambda-developer-guide
GitHub 리포지토리를 복제합니다. git clone https://github.com/awsdocs/aws-lambda-developer-guide.git
-
layer-python
샘플 앱의layer
디렉터리로 이동합니다. 이 디렉터리에는 계층을 올바르게 생성하고 패키징하는 데 사용하는 스크립트가 포함되어 있습니다.cd aws-lambda-developer-guide/sample-apps/layer-python/layer
-
requirements.txt
파일을 검사합니다. 이 파일은 계층, 즉 requests
라이브러리에 포함하려는 종속성을 정의합니다. 이 파일을 업데이트하여 자체 계층에 포함하려는 종속성을 포함할 수 있습니다.예 requirements.txt
requests==2.31.0
-
두 스크립트를 모두 실행할 수 있는 권한이 있는지 확인하세요.
chmod 744 1-install.sh && chmod 744 2-package.sh
-
다음 명령을 사용하여
1-install.sh
스크립트를 실행하세요. ./1-install.sh
이 스크립트는
venv
를 사용하여create_layer
라는 이름의 Python 가상 환경을 생성합니다. 그런 다음create_layer/lib/python3.11/site-packages
디렉터리에 필요한 모든 종속성을 설치합니다.예 1-install.sh
python3.11 -m venv create_layer source create_layer/bin/activate pip install -r requirements.txt
-
다음 명령을 사용하여
2-package.sh
스크립트를 실행하세요. ./2-package.sh
이 스크립트는
create_layer/lib
디렉터리의 내용을python
이라는 새 디렉터리에 복사합니다. 그런 다음python
디렉터리의 내용을layer_content.zip
라는 파일로 압축합니다. 이는 계층의 .zip 파일입니다. Python 런타임의 계층 경로 섹션에 표시된 것처럼 파일의 압축을 풀고 올바른 파일 구조가 포함되어 있는지 확인할 수 있습니다.예 2-package.sh
mkdir python cp -r create_layer/lib python/ zip -r layer_content.zip python
계층의 생성
이 섹션에서는 이전 섹션에서 생성한 layer_content.zip
파일을 가져와 Lambda 계층으로 업로드합니다. AWS Command Line Interface(AWS CLI)를 통해 AWS Management Console 또는 Lambda API를 사용하여 계층을 업로드할 수 있습니다. 계층 .zip 파일을 업로드할 때 다음 PublishLayerVersion AWS CLI 명령에서 python3.11
을 호환 런타임으로, arm64
를 호환 아키텍처로 지정합니다.
aws lambda publish-layer-version --layer-name python-requests-layer \ --zip-file fileb://layer_content.zip \ --compatible-runtimes python3.11 \ --compatible-architectures "arm64"
응답에서 arn:aws:lambda:us-east-1:
처럼 보이는 123456789012
:layer:python-requests-layer:1LayerVersionArn
에 유의하세요. 이 자습서의 다음 단계인 함수에 계층을 추가할 때 이 Amazon 리소스 이름(ARN)이 필요합니다.
함수에 계층 추가
이 섹션에서는 함수 코드에 requests
라이브러리를 사용하는 샘플 Lambda 함수를 배포한 다음 계층을 연결합니다. 함수를 배포하려면 실행 역할이 필요합니다. 기존 실행 역할이 없으면 접을 수 있는 섹션의 단계를 따르세요.
실행 역할을 만들려면
-
IAM 콘솔에서 역할 페이지
를 엽니다. -
역할 생성을 선택합니다.
-
다음 속성을 사용하여 역할을 만듭니다.
-
신뢰할 수 있는 엔터티 – Lambda.
-
권한 – AWSLambdaBasicExecutionRole.
-
역할 이름 –
lambda-role
.
AWSLambdaBasicExecutionRole 정책은 함수가 CloudWatch Logs에 로그를 쓰는 데 필요한 권한을 가집니다.
-
Lambda 함수 코드requests
라이브러리를 가져오고 간단한 HTTP 요청을 한 다음 상태 코드와 본문을 반환합니다.
import requests
def lambda_handler(event, context):
print(f"Version of requests library: {requests.__version__}")
request = requests.get('https://api.github.com/')
return {
'statusCode': request.status_code,
'body': request.text
}
Lambda 함수를 배포하려면 다음을 수행합니다.
-
function/
디렉터리로 이동합니다. 현재layer/
디렉터리에 있는 경우 다음 명령을 실행하세요.cd ../function
-
다음 명령을 사용하여 .zip 파일 배포 패키지를 생성합니다.
zip my_deployment_package.zip lambda_function.py
-
함수를 배포합니다. 다음 AWS CLI 명령에서
--role
파라미터를 실행 역할 ARN으로 바꿉니다.aws lambda create-function --function-name python_function_with_layer \ --runtime python3.11 \ --architectures "arm64" \ --handler lambda_function.lambda_handler \ --role
arn:aws:iam::123456789012:role/lambda-role
\ --zip-file fileb://my_deployment_package.zip -
그런 다음 계층을 함수에 연결합니다. 다음 AWS CLI 명령에서
--layers
파라미터를 이전에 기록해 둔 계층 버전 ARN으로 바꿉니다.aws lambda update-function-configuration --function-name python_function_with_layer \ --cli-binary-format raw-in-base64-out \ --layers "
arn:aws:lambda:us-east-1:123456789012:layer:python-requests-layer:1
" -
마지막으로 다음 AWS CLI 명령을 사용하여 함수를 간접 호출합니다.
aws lambda invoke --function-name python_function_with_layer \ --cli-binary-format raw-in-base64-out \ --payload '{ "key": "value" }' response.json
다음과 유사한 출력 화면이 표시되어야 합니다.
{ "StatusCode": 200, "ExecutedVersion": "$LATEST" }
출력
response.json
파일은 응답에 대한 세부 정보를 포함합니다.
이 자습서 용도로 생성한 리소스를 보관하고 싶지 않다면 지금 삭제할 수 있습니다. 더 이상 사용하지 않는 AWS 리소스를 삭제하면 AWS 계정에 불필요한 요금이 발생하는 것을 방지할 수 있습니다.
Lambda 계층을 삭제하려면 다음을 수행합니다.
-
Lambda 콘솔의 계층 페이지
를 엽니다. -
생성한 계층을 선택합니다.
-
삭제를 선택한 다음 삭제를 다시 선택합니다.
Lambda 함수를 삭제하려면
-
Lambda 콘솔의 함수 페이지
를 엽니다. -
생성한 함수를 선택합니다.
-
작업, 삭제를 선택합니다.
-
텍스트 입력 필드에
confirm
를 입력하고 Delete(삭제)를 선택합니다.
manylinux
휠 배포를 사용하여 작업
종속성으로 포함하려는 패키지에 유니버설 휠이 없는 경우가 있습니다(특히 플랫폼 태그에 any
가 없는 경우). 이러한 경우에는 대신 manylinux
를 지원하는 휠을 다운로드하세요. 이렇게 하면 계층 라이브러리가 Amazon Linux와 호환됩니다.
numpy
numpy
패키지를 포함하려면 다음 예제 단계를 완료하여 계층을 올바르게 설치하고 패키징할 수 있습니다.
계층 콘텐츠를 설치하고 패키징하려면 다음을 수행합니다.
-
sample-apps/layer-python
디렉터리에 필요한 샘플 코드가 포함된aws-lambda-developer-guide
GitHub 리포지토리를 복제합니다. git clone https://github.com/awsdocs/aws-lambda-developer-guide.git
-
layer-python
샘플 앱의layer-numpy
디렉터리로 이동합니다. 이 디렉터리에는 계층을 올바르게 생성하고 패키징하는 데 사용하는 스크립트가 포함되어 있습니다.cd aws-lambda-developer-guide/sample-apps/layer-python/layer-numpy
-
requirements.txt
파일을 검사합니다. 이 파일은 계층, 즉 numpy
라이브러리에 포함하려는 종속성을 정의합니다. 여기에서는 Python 3.11, Amazon Linux,x86_64
명령어 세트와 호환되는manylinux
휠 배포의 URL을 지정합니다.예 requirements.txt
https://files.pythonhosted.org/packages/3a/d0/edc009c27b406c4f9cbc79274d6e46d634d139075492ad055e3d68445925/numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
-
두 스크립트를 모두 실행할 수 있는 권한이 있는지 확인하세요.
chmod 744 1-install.sh && chmod 744 2-package.sh
-
다음 명령을 사용하여
1-install.sh
스크립트를 실행하세요. ./1-install.sh
이 스크립트는
venv
를 사용하여create_layer
라는 이름의 Python 가상 환경을 생성합니다. 그런 다음create_layer/lib/python3.11/site-packages
디렉터리에 필요한 모든 종속성을 설치합니다. 이 경우에는--platform
태그를manylinux2014_x86_64
로 지정해야 하므로pip
명령이 다릅니다. 이렇게 하면 로컬 컴퓨터가 macOS 또는 Windows를 사용하는 경우에도pip
에 올바른manylinux
휠을 설치하도록 지시합니다.예 1-install.sh
python3.11 -m venv create_layer source create_layer/bin/activate pip install -r requirements.txt --platform=manylinux2014_x86_64 --only-binary=:all: --target ./create_layer/lib/python3.11/site-packages
-
다음 명령을 사용하여
2-package.sh
스크립트를 실행하세요. ./2-package.sh
이 스크립트는
create_layer/lib
디렉터리의 내용을python
이라는 새 디렉터리에 복사합니다. 그런 다음python
디렉터리의 내용을layer_content.zip
라는 파일로 압축합니다. 이는 계층의 .zip 파일입니다. Python 런타임의 계층 경로 섹션에 표시된 것처럼 파일의 압축을 풀고 올바른 파일 구조가 포함되어 있는지 확인할 수 있습니다.예 2-package.sh
mkdir python cp -r create_layer/lib python/ zip -r layer_content.zip python
이 계층을 Lambda에 업로드하려면 다음 PublishLayerVersion AWS CLI 명령을 사용합니다.
aws lambda publish-layer-version --layer-name python-numpy-layer \ --zip-file fileb://layer_content.zip \ --compatible-runtimes python3.11 \ --compatible-architectures "x86_64"
응답에서 arn:aws:lambda:us-east-1:
처럼 보이는 123456789012
:layer:python-numpy-layer:1LayerVersionArn
에 유의하세요. 계층이 예상대로 작동하는지 확인하려면 function-numpy
디렉터리에 Lambda 함수를 배포합니다.
Lambda 함수를 배포하려면 다음을 수행합니다.
-
function-numpy/
디렉터리로 이동합니다. 현재layer-numpy/
디렉터리에 있는 경우 다음 명령을 실행하세요.cd ../function-numpy
-
함수 코드
를 검토합니다. 이 함수는 numpy
라이브러리를 가져와서 간단한numpy
배열을 생성한 다음 더미 상태 코드와 본문을 반환합니다.import json import numpy as np def lambda_handler(event, context): x = np.arange(15, dtype=np.int64).reshape(3, 5) print(x) return { 'statusCode': 200, 'body': json.dumps('Hello from Lambda!') }
-
다음 명령을 사용하여 .zip 파일 배포 패키지를 생성합니다.
zip my_deployment_package.zip lambda_function.py
-
함수를 배포합니다. 다음 AWS CLI 명령에서
--role
파라미터를 실행 역할 ARN으로 바꿉니다.aws lambda create-function --function-name python_function_with_numpy \ --runtime python3.11 \ --handler lambda_function.lambda_handler \
--role arn:aws:iam::123456789012:role/lambda-role
\ --zip-file fileb://my_deployment_package.zip -
그런 다음 계층을 함수에 연결합니다. 다음 AWS CLI 명령에서
--layers
파라미터를 계층 버전 ARN으로 바꿉니다.aws lambda update-function-configuration --function-name python_function_with_numpy \ --cli-binary-format raw-in-base64-out \ --layers "
arn:aws:lambda:us-east-1:123456789012:layer:python-requests-layer:1
" -
마지막으로 다음 AWS CLI 명령을 사용하여 함수를 간접 호출합니다.
aws lambda invoke --function-name python_function_with_numpy \ --cli-binary-format raw-in-base64-out \ --payload '{ "key": "value" }' response.json
다음과 유사한 출력 화면이 표시되어야 합니다.
{ "StatusCode": 200, "ExecutedVersion": "$LATEST" }
함수 로그를 검사하여 코드가
numpy
배열을 표준 출력으로 출력하는지 확인할 수 있습니다.