Как запустить несколько лямбда-функций при развертывании в виде образа Docker?

Как выглядит dockerfile для лямбды aws с образом докера через aws-sam при объявлении нескольких функций/приложений в templates.yaml?

Вот пример dockerfile для запуска одного приложения

FROM public.ecr.aws/lambda/python:3.8

COPY app.py requirements.txt ./

RUN python3.8 -m pip install -r requirements.txt -t .

# Command can be overwritten by providing a different command in the template directly.
CMD ["app.lambda_handler"]


person xtremeHitori    schedule 14.01.2021    source источник


Ответы (1)


Сам Dockerfile выглядит так же. Никаких изменений там не нужно.

Наличие строки CMD в файле Docker выглядит так, как будто его нужно изменить, но это вводит в заблуждение. Значение CMD может быть указано для каждой функции в файле template.yaml.

Файл template.yaml должен быть обновлен информацией о новой функции. Вам нужно будет добавить свойство ImageConfig к каждой функции. Свойство ImageConfig должно указывать имя функции точно так же, как это делало бы значение CMD.

Вам также потребуется обновить значение DockerTag каждой функции, чтобы оно было уникальным, хотя это может быть ошибка.

Вот пример NodeJs Hello World, раздел ресурсов template.yaml, обновленный для поддержки нескольких функций с одним образом Docker:

Resources:
  HelloWorldFunction:
    Type: AWS::Serverless::Function
    Properties:
      PackageType: Image
      ImageConfig:
        Command: [ "app.lambdaHandler" ]
      Events:
        HelloWorld:
          Type: Api
          Properties:
            Path: /hello
            Method: get
    Metadata:
      DockerTag: nodejs14.x-v1-1
      DockerContext: ./hello-world
      Dockerfile: Dockerfile
  HelloWorldFunction2:
    Type: AWS::Serverless::Function
    Properties:
      PackageType: Image
      ImageConfig:
        Command: [ "app.lambdaHandler2" ]
      Events:
        HelloWorld:
          Type: Api
          Properties:
            Path: /hello2
            Method: get
    Metadata:
      DockerTag: nodejs14.x-v1-2
      DockerContext: ./hello-world
      Dockerfile: Dockerfile

Это предполагает, что файл app.js был изменен, чтобы предоставить как exports.lambdaHandler, так и exports.lambdaHandler2. Я предполагаю, что соответствующий файл Python должен быть изменен аналогичным образом.

После обновления template.yaml таким образом sam local start-api работает как положено, маршрутизируя /hello в lambdaHandler и /hello2 в lambdaHandler2.

Технически это создает два отдельных образа Docker (по одному для каждого отдельного значения DockerTag). Однако два изображения будут идентичны, за исключением тега, и основаны на одном и том же Dockerfile, поэтому второе изображение будет использовать кеш Docker первого изображения.

person Chris Nielsen    schedule 23.02.2021
comment
По сути, это создает два тега образа докера, которыми в долгосрочной перспективе будет трудно управлять. Надеемся, что команда aws sam скоро их исправит. - person xtremeHitori; 26.02.2021