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

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

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

Zip-файл

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

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

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

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

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

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

Можете ли вы прояснить вопрос? Вы не знаете, как сделать zip и загрузить его на s3?

Marcin 11.12.2020 06:07

Я могу. Но нет возможности сделать все в одном

Bill 11.12.2020 06:10

aws cli предоставляет команду package, которая может сделать zip и загрузить его.

Marcin 11.12.2020 06:12
Доступ AWS Java Lambda к экземпляру AWS RDS MySQL с помощью CDK
Доступ AWS Java Lambda к экземпляру AWS RDS MySQL с помощью CDK
В этой статье мы рассмотрим, как включить доступ Java Lambda к экземпляру AWS RDS MySQL.
3
3
6 590
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

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

zip function.zip lambda_function.py
aws lambda update-function-code --function-name <your-lambda-function-name> --zip-file fileb://function.zip

Спасибо, я работаю над облачным формированием с помощью лямбда-функции, а не напрямую лямбда.

Bill 11.12.2020 23:18

В 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.

Bill 11.12.2020 23:19
Ответ принят как подходящий

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

marcellsimon 07.05.2021 10:58

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

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

Другие вопросы по теме