Сам 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