it-roy-ru.com

Создание лямбда-функции в AWS из Zip-файла

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

Мой код в основном

console.log('Loading function');

exports.handler = function(event, context) {
    console.log('value1 =', event.key1);
    console.log('value2 =', event.key2);
    console.log('value3 =', event.key3);
    context.succeed(event.key1);  // Echo back the first key value
    // context.fail('Something went wrong');
}

в файле helloworld.js. Я заархивировал это и загрузил его как файл Zip в разделе создания лямбда-функции, и я продолжаю получать эту ошибку:

{
  "errorMessage": "Cannot find module 'index'",
  "errorType": "Error",
  "stackTrace": [
    "Function.Module._resolveFilename (module.js:338:15)",
    "Function.Module._load (module.js:280:25)",
    "Module.require (module.js:364:17)",
    "require (module.js:380:17)"
  ]
}

У кого-нибудь есть идеи? 

43
jstnchng

Имя вашего файла должно совпадать с именем модуля в конфигурации Handler . В этом случае ваш обработчик должен быть установлен в helloworld.handler, где helloworld - это файл, который будет требоваться () 'd, а handler - экспортируемая функция. Тогда он должен работать с тем же Zip-файлом.

AWS Lambda configuration screenshot

66
James

Убедитесь, что ваш index.js находится в корне zipfile, а не в подкаталоге.

В моем случае у меня было имя модуля, совпадающее с именем файла и экспортируемым обработчиком, реальная проблема заключалась в macOS и программе Zip, которая в основном создает папку внутри файла Zip, поэтому при распаковке в AWS Lambda engine файл index.js заканчивается в подкаталоге.

Использование Finder

Не нажимайте правой кнопкой мыши и не сжимайте каталог , вместо этого выберите файлы отдельных файлов, таких как index.js, package.json и каталог node_modules, и щелкните правой кнопкой мыши, чтобы сжать , вы можете получить файл Archive.Zip в той же директории. Название Zip-файла не будет причудливым, но, по крайней мере, оно будет работать, когда вы отправляете его в AWS Lambda.

Использование командной строки

Вы можете сделать ту же ошибку, используя командную строку с Zip -r function.Zip function, которая в основном создает Zip-файл с каталогом с именем function, вместо этого выполните:

$ Zip function.Zip index.js package.json node_modules

adding: index.js (deflated 47%)
adding: package.json (deflated 36%)
adding: node_modules/ (stored 0%)

Как узнать проверить свой Zip файл

Используя Finder , если дважды щелкнуть файл Zip и он распаковывается в подкаталоге, тогда Lambda не сможет увидеть файл, так как index.js находится в этом подкаталоге.

Используя командную строку и zipinfo:

$ zipinfo function.Zip | grep index.js | more
-rw-r--rw-  2.1 unx     1428 bX defN 27-Jul-16 12:21 function/index.js

Обратите внимание, как index.js оказался внутри подкаталога function, вы облажались .

$ zipinfo function.Zip | grep index.js | more
-rw-r--rw-  3.0 unx     1428 tx defN 27-Jul-16 12:21 index.js

Обратите внимание, что index.js не находится внутри подпапки, этот Zip-файл будет работать в AWS Lambda .

Использование команд npm для Zip функции

Поэтому я добавил скрипт в свой пакет для архивирования файлов проекта, просто запустив npm run Zip

{
  "name": "function",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "Zip": "Zip function.Zip package.json *.js node_modules"
  },
  "dependencies": {
    "aws-sdk": "^2.4.10"
  }
}

$ npm run Zip

> [email protected] Zip 
> Zip function.Zip package.json *.js node_modules

  adding: package.json (deflated 41%)
  adding: index.js (deflated 47%)
  adding: local.js (deflated 42%)
  adding: node_modules/ (stored 0%)
52
bithavoc

Вот прогрессивный путь с AWS CLI. Это сэкономит ваше время при длительном использовании.

Прежде всего вам необходимо установить и настроить интерфейс командной строки AWS: 

http://docs.aws.Amazon.com/cli/latest/userguide/install.html

1) Создать архив 

$ Zip -r лямбда *

Он создаст для нас файл lambda.Zip со всеми папками и файлами в нашем текущем местоположении.

2) Получить роль ARN 

$ aws iam список ролей | grep "your_role"

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

Пример для списка ролей

3) Создайте нашу лямбду

$ aws lambda create-function --function-name "your_lambda_name" --Zip-файл fileb: //lambda.Zip --handler index.handler --runtime nodejs6.10 --timeout 15 --role COPY_HERE_YOUR_ARN_FROM_THE_STEP_2

Мы сделали! 

4
Jingo Bingo

Автоматизация - использование Grunt

Завершено AWS Lambda Seed проект доступен на Git.

Шаг 1: Инициировать модуль npm

npm init

Шаг 2: Установите Grunt

npm install --save-dev grunt grunt-cli

Шаг 3: Установить grunt-aws-lambda

npm install --save-dev grunt-aws-lambda

Шаг 4: Создать папку для службы Lambda

# Create directory
mkdir lambdaTest

# Jump into folder
cd lambdaTest

# Create service file
touch lambdaTest.js

# Initialize npm
npm init

Сохраните свою логику/код в lambdaTest.js

'use strict'

exports.handler = (event, context, callback) => {
    console.log("Hello it's looks like working");
};

Шаг 5: Создать Gruntfile.js

Вернитесь в корневую папку touch Gruntfile.js

'use strict'
module.exports = function (grunt) {
    grunt.initConfig({
        lambda_invoke: {
            lambdaTest: {
                options: {
                    file_name: "lambdaTest/lambdaTest.js",
                    event: "lambdaTest/test.json",
                }
            }
        },
        lambda_package: {
            lambdaTest: {
                options: {
                    package_folder: 'lambdaTest/'
                }
            }
        },
        lambda_deploy: {
            lambdaTest: {
                arn: 'arn:aws:lambda:eu-central-1:XXXXXXXX:function:lambdaTest',
                options: {
                    credentialsJSON: 'awsCredentials.json',
                    region: "eu-central-1"
                },
            }
        },
    });

    grunt.loadNpmTasks('grunt-aws-lambda');


    grunt.registerTask('ls-deploy', ['lambda_package:lambdaTest', 'lambda_deploy:lambdaTest']);
};

Шаг 6: Создать awsCredentials.js

Создайте пользователя AWS IAM с пользовательской политикой. Пользовательская политика должна иметь доступ к lambda:GetFunction, lambda:UploadFunction, lambda:UpdateFunctionCode, lambda:UpdateFunctionConfiguration и iam:PassRole

{
    "accessKeyId": "XXXXXXXXXXXXXXXXXXXX",
    "secretAccessKey": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
}

Шаг 7: Создайте Zip и разверните на AWS Lambda.

ls-deploy - это пользовательская задача, созданная в Gruntfile выше, которая создает Zip исходного кода и развертывает его в Lambda.

grunt ls-deploy

Завершено AWS Lambda Seed проект доступен на Git.

0
jaym