【问题标题】:Troubleshooting Amazon's Alexa Skill Kit (ASK) Lambda interactionAmazon 的 Alexa Skill Kit (ASK) Lambda 交互故障排除
【发布时间】:2016-12-17 15:26:59
【问题描述】:

我从 ASK 开发开始。我对某些行为感到有些困惑,我想知道如何从“服务模拟器”控制台调试错误。如何获取有关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 控制台并创建一个虚拟处理程序,它返回与 ARN:A 从控制台给我的完全相同的响应(字面意思是复制和粘贴)。我将技能的端点设置为 ARN:B,使用服务模拟器对其进行测试,我得到了预期的响应(因此,响应的格式很好),尽管是静态的。我再次前往 lambda 控制台,将代码从 ARN:A 复制并粘贴到新的 ARN:C 中。将技能的端点设置为 ARN:C,它工作得非常好。 ARN:C 的问题在于它没有将数据持久保存到 DynamoDB 中的适当权限(我仍然对系统很熟悉,不确定我是否可以在不同的 lambda 之间共享一个 IAM 角色,我相信不会)。 我怎样才能弄清楚 ARN:A 发生了什么?那是在某处记录的吗?我在 cloudwatch/logs 中找不到与此特定 lambda 或技能相关的任何条目。

不确定是否相关,我将 python 用于我的 lambda 运行时,代码(目前)内联在网络编辑器中,我使用 boto3 来持久化到 DynamoDB。

【问题讨论】:

  • 仅供参考,我能够正确设置 ARN:3 的 DynamoDB 权限,并且 ARN:3 一切正常,但 ARN:1 仍然失败,所以我仍然有兴趣了解如何调试/在这种情况下获取更多信息。

标签: python amazon-web-services amazon-dynamodb aws-lambda alexa-skills-kit


【解决方案1】:

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 表比 ARN:3 使用的数据更多,处理时间稍长,ARN:3 使用的表几乎是空的。当我注释掉一些数据加载的东西时,它的运行速度稍微快了一点,Alexa 服务模拟器又开始工作了。我在任何地方都找不到记录的时间预算,我猜是 3 秒?我很可能需要转移到另一个后端,Lambda 上的 DynamoDB+Python 对于非常琐碎的请求来说太慢了。

【讨论】:

  • 我尝试了 Lambda+Java+DynamoDB,但无法使其在时间预算内工作。我以为是 8 秒,但出于实际目的,我真的不希望我的用户等待超过 3 秒。对于 StarLanes,我必须至少阅读两条记录,并至少写一条。这从时间预算中减少了大约 2 秒。因为 Lambda 在调用之间杀死了 JVM,所以我无法缓存或后台线程任何东西。所以我现在只使用 Lambda 作为 Web 服务的代理,我可以在其中进行我想要的所有优化。
【解决方案2】:

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

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

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

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


查看我的 repo,alexa lambda starter kit 以获得一个简单的 hello world ask/lambda 示例。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 谢谢。我已经把它缩小到超时问题,你从哪里得到 8 秒超时?我可以更改 lambda 函数中的截止日期,使其不会超时,但 Alexa 仍会超时。我觉得这个值略小于 8 秒,为了确定,我将超时设置为 3 秒。
    【解决方案4】:

    我的猜测是您错过了设置步骤。您必须在其中设置“事件源”。如果您不这样做,我认为您会收到该信息。

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

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

    【讨论】:

    • 感谢您的回答,我一定会给 EchoSim 看看。一些调试选项和更详细的消息会很棒。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-07
    • 2018-06-09
    • 1970-01-01
    • 2016-08-26
    • 2020-12-01
    相关资源
    最近更新 更多