Слоистые Лямбда-функции: AWS SAM и Python

Немного переиспользования кода никогда не вредит.

Содержимое страницы

Это пошаговое руководство о том, как добавить слои в AWS Lambdas на языке Python. Будем использовать базовый код, сгенерированный стандартным шаблоном примера 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:
# added code start
    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   # Required to have AWS SAM build this layer
# added code end

  HelloWorldFunction:
    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: hello_world/
      Handler: app.lambda_handler
      Runtime: python3.9
      Architectures:
        - x86_64
# added code start
      Layers:
        - !Ref ApiSharedLayer
# added code end
      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\"}"}

Хорошо.

Полезные ссылки