본문 바로가기
lambda-python3.8

람다 애플리케이션으로 API 개발 pycharm + python3.8

by 2세1의 행복한 개발 2021. 2. 18.
반응형

우선 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이 인식을 못하여

레이어에 포함된 패키지에서 오류가 나게됩니다.

댓글