우선 Pycharm으로 Aws Serverless Application를생성하시면 template.yaml이 생성됩니다
해당 template.yaml이 전체적인 컨트롤을 하는데 사용됩니다
우선 구조는 yaml를 빌드하여 lambda 애플리케이션이 생성되고 그 안에 lambda와 layer가 같이 생성 되어 들어 있습니다
그리고 yaml에 적용된 path기준으로 api Gateway가 생성됩니다
알고보면 쉬우나 아무것도 모르고 시작하여 5일정도 소요하여 정리합니다
기본적으로 application이 아닌 hello_world 폴더가 있을겁니다
hello_world > application으로 명칭만 변경하였습니다
application 폴더를 보면
공통적인 데이터를 관리하기 위하여 layer를 구성하였습니다
람다 파일을 빌드하게 되면 해당 파일위치 하위파일만 가져가기 때문에
상위에서 코어를 공유하기 위해선 layer구성이 필수였습니다
layer를 구성하기 위해선 python이라는 중간 폴더가 필수적이며 그 하단에 패키지가 들어가야합니다
저는 animal를 링크걸어 위쪽으로 빼뒀습니다
람다 내부에서 import를 할때 빨간줄이 나오지 않도록 처리한것입니다.
P006은 계층 폴더를 구성한것이고 그안에 1_0_test2는 제가 람다명칭으로 사용할 예정입니다
init는 python에서 패키지를 구성할때 폴더에 있어야하며 비어놨습니다
app.py는 실질적인 람다 내부코드입니다
requirements는 해당 람다에 포함되야할 라이브러리 명칭입니다
해당 폴더처럼 구성이 끝나면 이제 template.yaml를 설정하면 끝입니다
# More info about Globals: https://github.com/awslabs/serverless-application-model/blob/master/docs/globals.rst
Globals:
Function:
Timeout: 3
Runtime: python3.8
MemorySize : 3008 #max
Layers :
- !Ref ModelLayer
Resources:
HelloWorld2Function: #람다 function 구분값인데, 숫자와 영문자만 가능. functionName이 없으면 해당 resource과 application이름 조합으로 람다 생성
Type: AWS::Serverless::Function # More info about Function Resource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction
Properties:
CodeUri: application/P006/1_0_test2 #람다소스 폴더 이름 requirements.txt 경로 , 폴더 이름 . 경로 없으면 에러,
Handler: app.lambda_handler #람다소스 파일 이름과 핸들러이름. 해당 폴더 내의 handler로 소스 업로드 됌. build success, runtime error (조심해야 함!)
FunctionName: P006_1_0_test2 #업로드 할 람다이름 : 이름 변경되면 기존 건 사라지고 새로운 람다 생성. 바로 사라지지않고 새로움 람다 생성 후 1분후 정도.사라짐.
Role: "arn:aws:iam::709:role/serole/borat2"
Events:
HelloWorld:
Type: Api # More info about API Event Source: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api
Properties:
Path: /hello
Method: get
ModelLayer:
Type: AWS::Serverless::LayerVersion
Properties:
Description: Layer description
ContentUri: application/layer
CompatibleRuntimes:
- python3.8
LicenseInfo: 'Available under the MIT-0 license.'
RetentionPolicy: Delete
LayerName: model
Helloworld2Function으로 내부에서 명칭을 공유하며
실제로 람다에 올라가는 명칭은 FunctionName으로 올라갑니다
아래 ModelLayer를 통하여 레이어를 자동으로 배포하며
Layers를 통하여 전체 람다에 레이어를 추가합니다
이렇게 yaml설정이 끝나게 된다면 내부 pycharm에서 테스트가 가능합니다
aws Lambda local 테스트를 만든 후
From template를 선택하고
yaml경로를 잡아준 후에 명시해준 Function을 선택해주세요
그럼 이렇게 결과가 yaml기준으로 노출되게 됩니다
만약 tmplate으로 안한다면
{"errorMessage": "Unable to import module 'app': No module named 'animal'", "errorType": "Runtime.ImportModuleError", "stackTrace": []}
레이어를 aws-sam이 인식을 못하여
레이어에 포함된 패키지에서 오류가 나게됩니다.
'lambda-python3.8' 카테고리의 다른 글
python request time out error 무시하기 (0) | 2021.03.14 |
---|---|
python 람다 애플리케이션 cors 처리하기 (0) | 2021.03.14 |
람다 애플리케이션 메소드별 local, api gateway 데이터 받기 (0) | 2021.03.06 |
람다 Python Signed Url 만들기 S3 + Cloud Front (0) | 2021.03.03 |
댓글