Pycharm 환경에서 Layer를 생성하고
배포하는 과정이다.
아래 과정 이후에 진행하면 도움이 된다.
[ AWS ] SAM을 통한 Lambda 개발환경 셋팅
[ AWS ] SAM을 통한 Lambda Local Debugging
1. Layer 선언
프로젝트에 패키지 하나를 따로 생성해
Layer로 쓸 function들을 정의한다.
이후 template.yaml 파일에
해당 패키지를 mapping해준다.
[ template.yaml ]
TestCommon:
Type: AWS::Serverless::LayerVersion
Properties:
ContentUri: test_common/
CompatibleRuntimes:
- python3.9
LayerName: test_common
RetentionPolicy: Retain
명시한 Layer(TestCommon)를
배포 시 해당 함수에 물리게끔 하는 작업이 필요하다.
2가지 방법이 있는데,
Globals부분 또는 Resoureces 부분에 명시한다.
[ template.yaml ]
Globals:
Function:
Timeout: 600
MemorySize: 128
Tracing: Active
Layers:
# 택1
- !Ref TestCommon
( or )
# 택2 - 미리 Lambda Layer에 Upload 되어있을 시
- arn:aws:lambda:ap-northeast-2:123123:layer:test_common:1
Resources:
HelloWorld:
...
Layers:
- !Ref TestCommon
Globals부분에 선언하면 Resources하위 Function에 다 적용이 되어서
한번만 적으면 되어 편리함이 있지만,
각 Function마다 Layer를 다르게 설정할 경우에는
Resources부분에 각각 적용한다.
Lambda Layer 만들기 참고 Ref :
https://docs.aws.amazon.com/ko_kr/lambda/latest/dg/configuration-layers.html
이후 아래 명령어로 배포하면 Function과 Layer 모두 Lambda에 업데이트 된다.
sam deploy --stack-name testLambda --s3-bucket test-dighty-appinstall
2. Layer 폴더추가
a. 해당 구조로 생성
b. layer는 sam build시에도 build 디렉토리에 나타나지 않음
3. Package 정리 Layer
업로드 된 람다 함수의 코드를 보면
아래 그림과 같이 import하는 패키지들도 같이 업로드 된다.
이 패키지들을 Layer로 만들면
재사용하기도 쉽고 파일도 깔끔해질 것이다.
a. 업로드할 Lamba Function의 Package의 requirements 비운다.
b. layer로 사용할 directory를 만든 후, requirements.txt파일에 필요한 library를
pip freeze 등의 명령어로 input
c. 해당 명령어 실행
pip install -r ./package_layer/requirements.txt -t ./package_layer/
d. 디렉토리에 관련 lib설치 확인
e. template.yaml에서 Metadata설정 추가
TestCommon:
Type: AWS::Serverless::LayerVersion
Properties:
ContentUri: test_common
CompatibleRuntimes:
- python3.9
LayerName: test_common
RetentionPolicy: Retain
Metadata:
BuildMethod: python3.9
f. sam bulid
g. build 디렉토리에서 Layer만 따로 빌드된 폴더가 추가됨
이제 sam deploy로 배포하면
Lambda 프로젝트 폴더 안에 관련 패키지가 없음에도
import하여 사용할 수 있다.
CloudWatch에서 해당 람다함수 로그까지 확인한다.
참조 : https://aws.plainenglish.io/a-practical-guide-surviving-aws-sam-part-3-lambda-layers-8a55eb5d2cbe