계층 구조된 람다: AWS SAM과 Python

조금의 코드 재사용성은 해를 끼치지 않는다.

Page content

AWS Lambda에 레이어를 추가하는 방법에 대한 단계별 지침입니다. 이 예제는 파이썬을 사용합니다.
기본적으로 표준 HelloWorld 템플릿 예제로 생성된 기본 코드를 사용할 것입니다.

letters-layers

물론, 파이썬(Python)과 AWS SAM 관련 사항이
사전 설치되어 있고 구성되어 있어야 합니다.

샘플 프로젝트 생성 및 실행

이제 sam init을 실행하고 질문에 표준 방식으로 답하십시오. 예를 들어 다음과 같습니다:

sam-init-answers

요약이 표시됩니다.

sam-init-summary

그리고 프로젝트 폴더가 생성되며, 구조와 일부 파일이 포함됩니다. template.yaml은 매우 표준입니다.

vs-code-template-yaml

함수 코드도 마찬가지입니다(추가로 생성된 주석은 제거하겠습니다).

import json

def lambda_handler(event, context):

    return {
        "statusCode": 200,
        "body": json.dumps({
            "message": "hello world",
            # "location": ip.text.replace("\n", "")
        }),
    }

이제 이 함수를 로컬에서 빌드하고 실행해 보겠습니다.

sam validate && sam build --use-container && sam local invoke HelloWorldFunction --event events/event.json

응답의 끝 부분은 아래와 유사해야 합니다.

.....
START RequestId: 6da35464-7c6a-40b2-bcc0-60796994317a Version: $LATEST
END RequestId: 737ae28d-2b99-49e6-baae-40ab9bb99599
REPORT RequestId: 737ae28d-2b99-49e6-baae-40ab9bb99599  Init Duration: 0.04 ms  Duration: 28.40 ms      Billed Duration: 29 ms  Memory Size: 128 MB     Max Memory Used: 128 MB
{"statusCode": 200, "body": "{\"message\": \"hello world\"}"}

레이어 추가

template.yaml에 레이어 설명 추가

두 가지 부분이 있습니다:

  • ApiSharedLayer - 레이어에 대한 설명
  • Layers: … - !Ref ApiSharedLayer - 이를 사용하는 함수에 포함
.....
Resources:
# 추가된 코드 시작
    ApiSharedLayer:
        Type: AWS::Serverless::LayerVersion
        Properties:
            ContentUri: api_shared_layer/
            LayerName: api-shared-layer
            Description: My api-shared-layer
            CompatibleRuntimes:
                - python3.9
            RetentionPolicy: Delete                
        Metadata:
            BuildMethod: python3.9   # AWS SAM이 이 레이어를 빌드하도록 하기 위해 필요합니다
# 추가된 코드 끝

  HelloWorldFunction:
    Type: AWS::Serverless::Function # Function Resource에 대한 더 많은 정보: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction
    Properties:
      CodeUri: hello_world/
      Handler: app.lambda_handler
      Runtime: python3.9
      Architectures:
        - x86_64
# 추가된 코드 시작
      Layers:
        - !Ref ApiSharedLayer
# 추가된 코드 끝
      Events:
.....

레이어 코드 추가

api_shared_layer 폴더에 코드를 추가합니다.

layer code

함수를 업데이트하여 이 코드 사용

import json
from api_version import API_VERSION

def lambda_handler(event, context):

    return {
        "statusCode": 200,
        "body": json.dumps({
            "message": "hello world",
            "version": API_VERSION
        }),
    }

테스트 실행

다시 실행합니다:

sam validate && sam build --use-container && sam local invoke HelloWorldFunction --event events/event.json

응답의 끝 부분은 아래와 유사해야 합니다.

.....
START RequestId: 88eb1887-ae94-479d-a059-f87c4b71a282 Version: $LATEST
END RequestId: 927f7d05-4d13-44ba-9377-03e6d3e8bacf
REPORT RequestId: 927f7d05-4d13-44ba-9377-03e6d3e8bacf  Init Duration: 0.72 ms  Duration: 34.80 ms      Billed Duration: 35 ms  Memory Size: 128 MB     Max Memory Used: 128 MB
{"statusCode": 200, "body": "{\"message\": \"hello world\", \"version\": \"1.1.1\"}"}

좋습니다.

유용한 링크