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

размер лямбда-функции превышает 4096 символов, поэтому я не могу развернуть лямбда-функцию как встроенный код в шаблоне cloudformation.

(https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-function-code.html)

Zip-файл

Ваш исходный код может содержать до 4096 символов. Для JSON необходимо экранировать кавычки и специальные символы, такие как перевод строки (\n), с помощью обратной косой черты.

Сначала мне нужно заархивировать его, загрузить в ведро s3, установить ведро s3 и сведения о файле в cloudforamtion и развернуть его.

Я не могу найти способ развертывания с помощью одной команды. Если я обновлю лямбда-код, мне придется повторить вышеуказанные шаги.

Но как с AWS SAM, так и с Serverless Framework они могут развертывать лямбда-функции без встроенного кода.

Единственная проблема заключается в том, что aws SAM или бессерверная среда создают API-шлюз по умолчанию, и мне не нужно его создавать.

Любое решение или рекомендации для меня?


person Bill    schedule 11.12.2020    source источник
comment
Можете ли вы прояснить вопрос? Вы не знаете, как сделать zip и загрузить его на s3?   -  person Marcin    schedule 11.12.2020
comment
Я могу. Но нет возможности сделать все в одном   -  person Bill    schedule 11.12.2020
comment
aws cli предоставляет команду package, которая может сделать zip и загрузите его.   -  person Marcin    schedule 11.12.2020


Ответы (4)


Если вы управляете своим развертыванием с помощью простого 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 или что-то подобное.

person Dave Shifflett    schedule 12.12.2020
comment
Да, но сначала нужно иметь ведро. И вы не можете определить это ведро в файле шаблона, так как вы должны создать его перед командой пакета, а затем развернуть выходной yaml. - person marcellsimon; 07.05.2021

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

zip function.zip lambda_function.py
aws lambda update-function-code --function-name <your-lambda-function-name> --zip-file fileb://function.zip
person Wilson.L    schedule 11.12.2020
comment
Спасибо, я работаю над облачным формированием с помощью лямбда-функции, а не напрямую лямбда. - person Bill; 12.12.2020

В 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

person Tomek Klas    schedule 11.12.2020
comment
Да, это проблема, верно? Поэтому каждый раз, когда я обновляю лямбда-коды, я вручную генерирую zip-файлы, загружаю их в корзину s3, а затем запускаю команду развертывания. Я не могу сделать это одной командой как SLS или SAM cli. - person Bill; 12.12.2020

Ре. ваш комментарий:

Единственная проблема заключается в том, что 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
person Kevin Hooke    schedule 10.07.2021