【问题标题】:How can I setup sam-cli to launch an Alexa skills lambda for testing?如何设置 sam-cli 来启动 Alexa 技能 lambda 进行测试?
【发布时间】:2019-07-10 01:25:49
【问题描述】:

我似乎无法弄清楚如何让功能正常的 Alexa 技能 lambda 函数在本地运行。使用 ngrok Amazon 正确连接到我正在运行的 sam 容器,但我得到的只是一个导致 404 的 POST /

我从 Alexa 的 AWSLABS sam 存储库中复制了一个示例:

AWSTemplateFormatVersion: '2010-09-09'
Transform: 'AWS::Serverless-2016-10-31'
Description: Demonstrates a basic skill built with the Amazon Alexa Skills Kit.
Parameters: 
  TopicNameParameter: 
    Type: String
Resources:
  alexaskillskitcolorexpert:
    Type: 'AWS::Serverless::Function'
    Properties:
      Handler: index.handler
      Runtime: nodejs8.10
      CodeUri: .
      Description: Demonstrates a basic skill built with the Amazon Alexa Skills Kit.
      MemorySize: 128
      Timeout: 3
      Policies:
        - SNSPublishMessagePolicy:
            TopicName: !Ref TopicNameParameter
      Events:
        AlexaSkillEvent:
          Type: AlexaSkill

【问题讨论】:

    标签: amazon-web-services alexa-skills-kit aws-sam-cli


    【解决方案1】:

    Alexa Skills 可以连接到两种不同类型的后端。它可以是 AWS Lambda 函数或任何 HTTPS exposed web services。您正在尝试将两者混合使用,这就是您的示例代码不起作用的原因。

    当技能作为 HTTPS 端点托管时,it has to provide extra code 在将 AWS Lambda 与 Alexa Skills 结合使用时不是必需的。例如,Alexa 服务将通过您的技能必须回复的 HTTP POST 发送签名请求。另一方面,当作为 AWS Lambda 函数托管时,不需要签名,因为 AWS Lambda 触发机制确保只有 Alexa 服务可以调用您的技能代码。

    您下载的示例将代码公开为 AWS Lambda 函数并创建 Lambda 触发器以授权 Alexa 服务调用您的函数。这是这里的行:

    Events:
            AlexaSkillEvent:
              Type: AlexaSkill
    

    但是,当您通过 ngrok 公开在本地运行的代码时,您正在切换到另一个模型:自定义 HTTPS 端点。因此,Alexa 服务希望您的代码能够回答它发送的 POST 请求,而示例没有这样做。

    我建议不要使用ngrok 来测试您作为 AWS Lambda 函数公开的 Alexa 技能。如果您计划测试要部署为 Alexa Skill 自定义 HTTPS 端点的代码,请仅使用 ngrok

    要在本地测试您的代码,您可以使用单元测试框架,例如用于 NodeJS 的 mocha。这个想法是在 Alexa 开发人员控制台或您的 Lambda 日志中捕获 Alexa 发送的请求,并在您的笔记本电脑上本地重播。

    这是我写的一个例子来测试我使用这种技术的技能:https://github.com/sebsto/maxi80-alexa/tree/master/lambda/test

    您也可以使用第三方测试框架,例如bespoken。这是我写的另一个例子来展示如何使用 bespoken 进行本地单元测试:https://github.com/alexa/skill-sample-nodejs-audio-player/tree/mainline/single-stream/test/unit

    【讨论】:

    • 我想我明白你发布的内容,非常感谢。我也找到了进入项目bespoken 的方法。我想我想学习这个 SAM 的东西。允许我的本地 sam 启动 lambda 与 HTTPS 端点一起运行需要什么?这显然不会用于任何类型的生产——甚至不会用于其他 beta 测试人员。它只会大大简化和加速我的迭代。 (对于我的第一个技能,我发现非常烦人,即使使用 askcli,也需要一次又一次地更改和部署单个 stmt。>>)
    • 我不建议从 awslabs 示例开始,它们很旧并且没有使用最新的 Alexa Skill SDK。有很多样板代码要编写。请查看 Alexa Skill Command Line,这将在几分钟内启动一个新项目。 developer.amazon.com/docs/smapi/… 我知道它不能回答你的 ngrok 问题。今天我会试着找时间来建立一个例子。这个想法是编写代码来处理您在本地运行时将收到的 HTTP 请求
    • 并使用 HTTP 框架(例如 Express)将请求路由到代码。此代码显示了一个示例 github.com/JennJin/alexa-sdk-express-ngrok/blob/master/…(它基于带有 this.emit() 的旧 Alexa SDK,请勿使用),但目的是展示如何使用 express 处理 HTTP 请求并路由到您的代码)
    • 太棒了!明天我会在一些停机时间达到顶峰。感谢您跟踪此问题。
    猜你喜欢
    • 2017-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-30
    相关资源
    最近更新 更多