размер лямбда-функции превышает 4096 символов, поэтому я не могу развернуть лямбда-функцию как встроенный код в шаблоне cloudformation.
Zip-файл
Ваш исходный код может содержать до 4096 символов. Для JSON необходимо экранировать кавычки и специальные символы, такие как перевод строки (\n), с помощью обратной косой черты.
Я должен сначала заархивировать его, загрузить в ведро s3, установить ведро s3 и сведения о файле в cloudformation и развернуть его.
Я не могу найти способ развертывания с помощью одной команды. Если я обновлю лямбда-код, мне придется повторить вышеуказанные шаги.
Но как с AWS SAM, так и с Serverless Framework они могут развертывать лямбда-функции без встроенного кода.
Единственная проблема заключается в том, что AWS SAM или бессерверная среда создают API-шлюз по умолчанию, и мне не нужно его создавать.
Любое решение или рекомендации для меня?
Я могу. Но нет возможности сделать все в одном
aws cli предоставляет команду package, которая может сделать zip и загрузить его.
вы можете сначала заархивировать файл, а затем использовать aws cli для обновления вашей лямбда-функции.
zip function.zip lambda_function.py
aws lambda update-function-code --function-name <your-lambda-function-name> --zip-file fileb://function.zip
Спасибо, я работаю над облачным формированием с помощью лямбда-функции, а не напрямую лямбда.
В CloudFormation (последние 3 строки):
BackupLambda:
Type: "AWS::Lambda::Function"
Properties:
Handler: "backup_lambda.lambda_handler"
Role: !Ref Role
Runtime: "python2.7"
MemorySize: 128
Timeout: 120
Code:
S3Bucket: !Ref BucketWithLambdaFunction
S3Key: !Ref PathToLambdaFile
Да, это проблема, верно? Поэтому каждый раз, когда я обновляю лямбда-коды, я вручную генерирую zip-файлы, загружаю их в корзину s3, а затем запускаю команду развертывания. Я не могу сделать это одной командой как SLS или SAM cli.
Если вы управляете своим развертыванием с помощью простого CloudFormation и интерфейса командной строки aws
, вы можете справиться с этим относительно легко, используя aws cloudformation package
для создания «упакованного» шаблона для развертывания.
aws cloudformation package
принимает шаблон, в котором определенные свойства могут быть записаны с использованием локальных путей, архивирует содержимое из локальной файловой системы, загружает в указанную корзину S3, а затем выводит новый шаблон с этими свойствами, переписанными так, чтобы они ссылались на местоположение на S3, а не на локальная файловая система. В вашем случае он может переписать Code
свойства для AWS::Lambda::Function
, которые указывают на локальные каталоги, но полный список поддерживаемых свойств см. в aws cloudformation package help
. Вам нужно заранее настроить корзину S3 для хранения ваших ресурсов, но вы можете повторно использовать одну и ту же корзину в нескольких проектах CloudFormation.
Итак, допустим, у вас есть input.yaml
с чем-то вроде:
MyLambdaFunction:
Type: AWS::Lambda::Function
Properties:
Code: my-function-directory
Вы можете упаковать это с чем-то вроде:
aws cloudformation package \
--template-file input.yaml \
--s3-bucket my-packaging-bucket \
--s3-prefix my-project/ \
--output-template-file output.yaml
В результате получится output.yaml
с чем-то вроде этого:
MyLambdaFunction:
Properties:
Code:
S3Bucket: my-packaging-bucket
S3Key: my-project/0123456789abcdef0123456789abcdef
Type: AWS::Lambda::Function
Затем вы можете использовать output.yaml
с aws cloudformation deploy
(или любой другой командой aws cloudformation
, принимающей шаблон).
Чтобы действительно «развернуть с помощью одной команды» и гарантировать, что вы всегда выполняете развертывание последовательно, вы можете объединить эти две команды в сценарий, Makefile
или что-то подобное.
Да, но сначала нужно иметь ведро. И вы не можете определить это ведро в файле шаблона, так как вы должны создать его перед командой пакета, а затем развернуть выходной yaml.
Ре. ваш комментарий:
Единственная проблема заключается в том, что aws SAM или бессерверная среда создают API-шлюз по умолчанию, и мне не нужно его создавать.
Для Serverless Framework по умолчанию это неверно. Сгенерированный по умолчанию файл serverless.yml включает конфигурацию для самой функции Lambda, но конфигурация для шлюза API представлена только в качестве примера в следующем закомментированном разделе.
Если вы раскомментируете раздел «события» для http, он также создаст конфигурацию шлюза API для вашего Lambda, но только если вы этого не сделаете.
functions:
hello:
handler: handler.hello
# The following are a few example events you can configure
# NOTE: Please make sure to change your handler code to work with those events
# Check the event documentation for details
# events:
# - http:
# path: users/create
# method: get
Можете ли вы прояснить вопрос? Вы не знаете, как сделать zip и загрузить его на s3?