Как динамически создать встроенную лямбду с помощью AWS SDK для JavaScript? - PullRequest
1 голос
/ 18 марта 2019

Мне нужно программно создать простую лямбду из другой лямбды.

Это возможно с CloudFormation:

MyLambda:
  Type: AWS::Lambda::Function
  Properties:
    FunctionName: my-lambda
    Handler: index.handler
    Runtime: nodejs8.10
    Role: !GetAtt MyRole.Arn
    Code:
      ZipFile: >
        exports.handler = event => console.log('EVENT', event)

Я хочу создать лямбду таким же образом программным способом.

Когда я упаковываю лямбда-код в zip-файл и загружаю zip-код с лямбда-кодом, все работает нормально:

const lambda = new Lambda({apiVersion: '2015-03-31'});
...
await lambda.createFunction({
    FunctionName: 'my-lambda',
    Handler: 'index.handler',
    Runtime: 'nodejs8.10',
    Role: role.Role.Arn,
    Code: {
        ZipFile: fs.readFileSync('my-lambda.zip')
    }
}).promise();

Но это много стандартного кода, чтобы записать лямбда-код в файл и затем сжать его.

Если я попытаюсь установить встроенный лямбда-код:

...
Code: {
    ZipFile: "exports.handler = event => console.log('EVENT', event)"
}

Я получаю ожидаемую ошибку:

Ошибка: не удалось распаковать загруженный файл. Пожалуйста, проверьте ваш файл, затем попробуйте загрузить снова.

Есть ли способ , как динамически создать встроенную лямбда-функцию из другой лямбды , аналогично описанному выше «хаку» CloudFormation?

РЕДАКТИРОВАТЬ: Сосредоточение вопроса на динамическом создании кода без необходимости сначала сжать его.

Ответы [ 2 ]

1 голос
/ 19 марта 2019

Я думаю, что aws-cdk - довольно хороший вариант.Он генерирует облачную информацию из javascript или машинописного текста и сводит количество строк кода к минимуму.

В вашем основном лямбда-проекте

npm i @aws-cdk/aws-lambda --save-exact

Затем вам нужно будет создать каталог в / tmp и запустить cdk init из оболочки узла, используя node_cmd

Тогда ваш lambda экспортирует шаблон cdk Lambda примерно так, как показано ниже, в /tmp/output.js (преобразование встроенной части, которую, как я предполагаю, вам нужно)

import lambda = require('@aws-cdk/aws-lambda');    
const fn = new lambda.Function(this, 'MyFunction', {
    runtime: lambda.Runtime.NodeJS810,
    handler: 'index.handler',
    code: lambda.Code.inline('exports.handler = function(event, ctx, cb) { return cb(null, "hello ttulka"); }')
});

Затем вам нужно будет запустить cdk --app 'node /tmp/output.js' synth из оболочки узла, используя node_cmd

0 голосов
/ 18 марта 2019

TLDR Код загружается в Lambda в виде пакета развертывания, который представляет собой zip-файл.Таким образом, вы можете написать новый код функции динамически, но вам все равно необходимо динамически создать пакет развертывания, а затем передать его в lambda.createFunction.

Дополнительная информация: ИзЛямбда API Документы, элемент Code должен быть FunctionCode объектом.Варианты с объектом FunctionCode: либо указать локальный zip-файл пакета развертывания, либо указать местоположение на s3 для zip-файла пакета развертывания.

Ссылка на объект FunctionCode: https://docs.aws.amazon.com/lambda/latest/dg/API_FunctionCode.html

синтаксис:

"Code": { 
      "S3Bucket": "string",
      "S3Key": "string",
      "S3ObjectVersion": "string",
      "ZipFile": blob
   }

Источник: https://docs.aws.amazon.com/lambda/latest/dg/API_CreateFunction.html

Следует учитывать некоторые ограничения пакета развертывания Lambda (значения на момент написания):

  1. Если выДля повторной загрузки zip-файла непосредственно в виде большого двоичного объекта его размер должен быть менее 50 МБ.
  2. Если размер превышает 50 МБ, сначала необходимо загрузить файл на s3 и указать местоположение.
  3. Общий размер разархивированного файла все еще должен быть меньше 250 МБ.

Лямбда-лимиты Ссылка: https://docs.aws.amazon.com/lambda/latest/dg/limits.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...