Amazon 的 Alexa Skill Kit (ASK) Lambda 交互故障排除

Troubleshooting Amazon's Alexa Skill Kit (ASK) Lambda interaction

我开始进行 ASK 开发。我对某些行为有点困惑,我想知道如何从 "service simulator" 控制台调试错误。如何获得有关 The remote endpoint could not be called, or the response it returned was invalid. 错误的更多信息?

这是我的情况:

我有一项技能和三个 Lambda 函数(ARN:A、ARN:B、ARN:C)。如果我将技能的端点设置为 ARN:A 并尝试从技能的服务模拟器对其进行测试,我会收到错误响应:The remote endpoint could not be called, or the response it returned was invalid. 我复制了 lambda 请求,然后前往 ARN:A 的 lambda 控制台,我甚至设置了测试,粘贴了来自服务模拟器的请求,我对其进行了测试,并得到了完美的 ASK 响应。然后我前往 ARN:B 的 lambda 控制台,并创建一个虚拟处理程序,returns 与 ARN:A 从控制台给我的响应完全相同(字面意思是复制和粘贴)。我将技能的端点设置为 ARN:B,使用服务模拟器对其进行测试,我得到了预期的响应(因此,响应格式正确),尽管是静态的。我再次前往 lambda 控制台,将 ARN:A 中的代码复制并粘贴到新的 ARN:C 中。将技能的端点设置为 ARN:C,它工作得很好。 ARN:C 的问题是它没有适当的权限将数据保存到 DynamoDB(我还在熟悉这个系统,不确定我是否可以在不同的 lambda 之间共享一个 IAM 角色,我相信不能) . 我怎样才能弄清楚 ARN:A 发生了什么?那是记录在某处吗?我在 cloudwatch/logs 中找不到与此特定 lambda 或技能相关的任何条目。

不确定是否相关,我正在为我的 lambda 运行时使用 python,代码(目前)在 Web 编辑器上内联,我正在使用 boto3 持久保存到 DynamoDB。

我的猜测是您错过了设置步骤。有一个地方你必须设置 "event source"。如果您不这样做,我想您会收到该消息。

但调试选项有限。我在编写服务模拟器之前编写了 EchoSim(GitHub 上的原始版本),虽然它有点过时,但它在提供诊断方面做得更好。

缺乏调试选项,最好的办法就是做你已经做过的事情。分区并重新测试。做静态回复,直到你能找出问题所在。

tl;dr: The remote endpoint could not be called, or the response it returned was invalid. 也意味着等待端点可能超时。

我能够将它缩小到超时。 似乎 Alexa 服务模拟器(以及 Alexa 本身)对长响应的容忍度低于 lambda 测试控制台。在开发过程中,我将 ARN:1 的超时时间增加到 30 秒(而我相信默认值为 3 秒)。 ARN:1 使用的 DynamoDB table 有更多数据,处理时间比 ARN:3 稍长,table 几乎是空的 table。一旦我注释掉一些数据加载内容,它就会 运行 稍微快一些,Alexa 服务模拟器又可以工作了。我在任何地方都找不到记录的时间预算,我猜是 3 秒?我很可能需要转移到另一个后端,lambda 上的 DynamoDB+Python 对于非常琐碎的请求来说太慢了。

我认为您 ARN:1 的问题是您可能没有在您的 lambda 函数中设置 alexa 技能的触发器。

或者默认设置为 8 秒的 alexa 会话超时。

与 python 无关,但我发现如果我没有针对指定意图的处理程序,我也会遇到同样的问题:

  # lets pretend intentName is actually 'FooBarIntent'
  if (intentName == 'TestIntent') {
    handleTestRequest(intent, session, callback);
  } else {
    throw "Invalid intent"; 
  }

从这里开始,亚马逊咆哮着说我的 lambda 无效。对于其他人,它可能表示错误在堆栈中较早抛出。

您还可以使用 aws cloudwatch注销您的 lambda 错误,这将显示任何警告或错误。


查看我的存储库,alexa lambda starter kit 一个简单的 hello world ask/lambda 示例。