Запустите Amazon Alexa Skill локально вместо AWS Lambda (Javascript)

Можно ли запустить alexa Skill локально с помощью ngrok вместо AWS? Я приобрел навыки работы с AWS Lambda, но предпочитаю использовать собственный сервер. Что я могу сделать, чтобы запустить Alexa локально?

Я попробовал https://github.com/alexa-js/alexa-app-server, но это имеет смысл, потому что мне нужно было бы переписать весь мой код :( Лучшее решение - http://docs.bespoken.tools/en/latest/tutorials/tutorial_lambda_nodejs/, но это не лучший вариант. Он работает только с добрыми намерениями и после этого зависает :(

Журналы терминала из команды bespken:

    BST: v0.9.35  Node: v7.8.0

Your URL for Alexa Skill configuration:
https://proxy.bespoken.tools?node-id=33efccba-2246-477f-bbb8-2e1e510cce9d

INFO  2017-04-25T20:27:20.628Z Connected - proxy.bespoken.tools:5000
INFO  2017-04-25T20:27:26.812Z RequestReceived: POST /?node-id=33efccba-2246-477f-bbb8-2e1e510cce9d ID: 1493152039146
INFO  2017-04-25T20:27:26.815Z Forwarding localhost:10000
Current hour: 24
Warning: Application ID is not set
INFO  2017-04-25T20:27:27.939Z ResponseReceived ID: 1493152039146
INFO  2017-04-25T20:28:10.755Z RequestReceived: POST /?node-id=33efccba-2246-477f-bbb8-2e1e510cce9d ID: 1493152078963
INFO  2017-04-25T20:28:10.756Z Forwarding localhost:10000
Warning: Application ID is not set
INFO  2017-04-25T20:28:11.157Z ResponseReceived ID: 1493152078963
INFO  2017-04-25T20:28:51.073Z RequestReceived: POST /?node-id=33efccba-2246-477f-bbb8-2e1e510cce9d ID: 1493152113739
INFO  2017-04-25T20:28:51.073Z Forwarding localhost:10000
Warning: Application ID is not set
INFO  2017-04-25T20:28:51.995Z ResponseReceived ID: 1493152113739

person Anna K    schedule 25.04.2017    source источник
comment
Привет, Анна! Я один из создателей Bespoken Tools - спасибо, что упомянули нас. Что вы пытаетесь сделать, чего мы не можем поддержать? Мы рекомендуем вам разработать ваши лямбда-выражения локально с помощью нашего прокси-сервера bst, а затем развернуть лямбда-выражения в AWS с помощью нашей команды развертывания bst. Но я хотел бы убедиться, что понимаю ваш вариант использования, поэтому, пожалуйста, расскажите мне больше. Спасибо, Джон   -  person John Kelvie    schedule 26.04.2017
comment
И вы имеете в виду, что хотите запустить ламбу локально для тестирования или для производства? Есть решения для обоих.   -  person Tom    schedule 26.04.2017
comment
Привет, Джон, спасибо за помощь. Я отредактировал свой вопрос. Прокси-сервер bst кажется отличным решением, но в моем случае он не работает; (Не могли бы вы мне помочь? Он просто зависает после первого намерения, а Алекса не реагирует. Есть ли файл журнала? из журналов в терминале Я не я знаю, что происходит не так   -  person Anna K    schedule 26.04.2017
comment
@Tom Я хотел бы познакомиться с обоими лучшими решениями для разработки и производства, но мне не нужно переписывать свой код. Я использовал Alexa SDK для написания своего приложения npmjs.com/package/alexa-sdk   -  person Anna K    schedule 26.04.2017
comment
@AnnaK Что касается журналов, вы можете использовать Logless или свои собственные регистратор (bunyan или winston). Если у вас по-прежнему возникают проблемы с bst, я предлагаю вам задать новый вопрос.   -  person spicypumpkin    schedule 21.05.2017


Ответы (3)


Вот пример кода, который вы можете использовать для легкого запуска Lambda локально, назовите этот файл AlexaLambda.js:

const log = require('console');
var AWS = require('aws-sdk');

AWS.config.region = "us-east-1";
AWS.config.update({
    accessKeyId: "----",
    secretAccessKey: "----",
});

/**
 * Wraps the actual underlying Alexa lambda initialization in a 
 * Promise. Injects test mocks where appropriate.
 */
var initializerPromise = new Promise(function(fulfill, reject) {
    // Mock out certain imports here if you want but not necessary
    /*
  var Module = require('module');
  var originalRequire = Module.prototype.require;
  Module.prototype.require = function() {
    if ((arguments[0] == 'S3FeedService') ||
        (arguments[0] == './lib/S3FeedService')) {
      return MockS3Service;
    } else if ((arguments[0] == 'WebsocketService') ||
               (arguments[0] == './lib/WebsocketService')) {
      return WSMockService;
    } else if ((arguments[0] == 'SQSService') ||
               (arguments[0] == './lib/SQSService')) {
      return SQSMockService;
    } else {
      return originalRequire.apply(this, arguments);
    }
  };*/
  // Import your actual lambda here.
  var lambda = require('../src/index.js');
  fulfill(lambda);

});

/**
 * The Alexa Lambda context object which is called upon completion
 * of lambda execution.  Also wraps the callback which contains the 
 * test assertion code of the caller.
 * @param callback - must be of the form function(error, result) {};
 * @returns
 */
function Context(callback) {
    this.clientContext = {"env": {}}; 
    this.callback = callback;
}

Context.prototype.done = function(error, result) {
    if (typeof error != "undefined" && error) {
        this.callback(error, null);
    } else {
        this.callback(null, result);
    }
}

Context.prototype.succeed = function(result) {
    this.callback(null, result);
}

Context.prototype.fail = function(error) {
    this.callback(error, null);
}

/**
 * The AlexaLambda object that's exposed for test cases.
 * @returns
 */
function AlexaLambda() {
}

/**
 * Executes the lambda function, provided an inputEvent and a 
 * callback.
 * @param inputEvent - the input event that includes the intent.
 * @param callback - called upon completion of lambda execution.
 */
AlexaLambda.prototype.execute = function(inputEvent, callback) {
    initializerPromise.then(function(lambda) {
        var context = new Context(callback);
        lambda.handler(inputEvent, context);
    });
}

/**
 * Export the lambda class, importers instantiate via new AlexaLambda();
 */
module.exports = AlexaLambda;

Затем вы можете использовать эту «AlexaLambda» в своих тестах следующим образом (в моем случае я использую Mocha):

var AlexaLambda = require('./AlexaLambda');
var Event = require('./Event');  // My 'fake' Event class

describe("Guest User Test", function() {
  var alexaLambda = new AlexaLambda();      

  it("Alexa, open/launch 60db", function(done) {
    var event = Event.createLaunchEvent();
    alexaLambda.execute(event, function(error, result) {
      validateYourResultHere();
      done();
    })
  });

Тогда остается лишь запустить ваш тест через любую используемую вами структуру.

person Baq Haidri    schedule 11.05.2017

Да, есть несколько решений для локального запуска лямбда-выражения вашего узла. Например, я использовал node-lambda. Как и большинство решений, оно ориентировано на пользователей, которые хотят протестировать локально, а затем легко развернуть на AWS Lambda.

Если вы хотите запустить их самостоятельно, я бы отметил, что MS и IBM сделали свои реализации лямбда-выражения с открытым исходным кодом (здесь MS и IBM). Я сам на самом деле не пробовал, и я хотел бы отметить, что с AWS, GCP и Azure все, предоставляющие услуги Lambda для узла, рынок для них здоров, а блокировка минимальна, поэтому мне меньше нужно иметь возможность запускать это себе, чем что-то вроде Динамо.

Но я также рекомендую вам продолжать заниматься BST. Я использую некоторые из моих собственных изделий для проверки своих навыков, потому что я начал работать до того, как услышал об их материалах, но то, что я пробовал из их (BSTAlexa), очень полезно, и я вижу, что они предоставляют некоторые другие части, которые вам нужны для легкой и эффективной проверки вашего мастерства.

person Tom    schedule 26.04.2017
comment
Том, но не могли бы вы мне помочь настроить node-lambda для работы с alexa? Я получаю эту ошибку: Неперехваченное исключение: TypeError: не удается прочитать свойство 'locale' неопределенного типа. Ошибка типа: невозможно прочитать свойство 'locale' undefined при запуске $ node-lambda run - person Anna K; 26.04.2017
comment
Навскидку, я не знаю, что там не так, но на самом деле вы должны создать для этого новый, отдельный вопрос. Или вы можете отправить проблему (с более подробной информацией) как проблему на github node-lambda. - person Tom; 27.04.2017

Вы можете проверить свой навык alexa локально, следуя следующему руководству:

Как протестировать Alexa локально

person muneebahmad    schedule 11.03.2018