Alexa Skill S3 在 params 中缺少必需的密钥 Bucket

Posted

技术标签:

【中文标题】Alexa Skill S3 在 params 中缺少必需的密钥 Bucket【英文标题】:Alexa Skill S3 missing required key Bucket in params 【发布时间】:2021-07-01 14:35:31 【问题描述】:

我正在尝试基于Cake Time Tutorial 制作一项技能,但每当我尝试调用我的技能时,我都会遇到一个我不知道为什么的错误。

这是我的调用函数。

    const LaunchRequestHandler = 
       canHandle(handlerInput) 
         console.log(`Can Handle Launch Request $(Alexa.getRequestType(handlerInput.requestEnvelope) === "LaunchRequest")`);
         return (
           Alexa.getRequestType(handlerInput.requestEnvelope) === "LaunchRequest"
         );
       ,
       handle(handlerInput) 
         const speakOutput =
           "Bem vindo, que série vai assistir hoje?";
           console.log("handling launch request");
           console.log(speakOutput);
         return handlerInput.responseBuilder
           .speak(speakOutput)
           .reprompt(speakOutput)
           .getResponse();
       ,
     ;

它应该只提示一条葡萄牙语消息“Bem vindo, que série vai assistantir hoje?”但由于某种原因,它尝试访问 amazon S3 存储桶并在控制台上打印此错误。

~~~~ Error handled: AskSdk.S3PersistenceAdapter Error: Could not read item (amzn1.ask.account.NUMBEROFACCOUNT) from bucket (undefined): Missing required key 'Bucket' in params
    at Object.createAskSdkError (path\MarcaEpisodio\lambda\node_modules\ask-sdk-s3-persistence-adapter\dist\utils\AskSdkUtils.js:22:17)
    at S3PersistenceAdapter.<anonymous> (path\MarcaEpisodio\lambda\node_modules\ask-sdk-s3-persistence-adapter\dist\attributes\persistence\S3PersistenceAdapter.js:90:45)
    at step (path\MarcaEpisodio\lambda\node_modules\ask-sdk-s3-persistence-adapter\dist\attributes\persistence\S3PersistenceAdapter.js:44:23)
    at Object.throw (path\MarcaEpisodio\lambda\node_modules\ask-sdk-s3-persistence-adapter\dist\attributes\persistence\S3PersistenceAdapter.js:25:53)
    at rejected (path\MarcaEpisodio\lambda\node_modules\ask-sdk-s3-persistence-adapter\dist\attributes\persistence\S3PersistenceAdapter.js:17:65)
    at processTicksAndRejections (internal/process/task_queues.js:93:5)
Skill response
 
  "type": "SkillResponseSuccessMessage",
  "originalRequestId": "wsds-transport-requestId.v1.IDREQUESTED",
  "version": "1.0",
  "responsePayload": "\"version\":\"1.0\",\"response\":\"outputSpeech\":\"type\":\"SSML\",\"ssml\":\"<speak>Desculpe, não consegui fazer o que pediu.</speak>\",\"reprompt\":\"outputSpeech\":\"type\":\"SSML\",\"ssml\":\"<speak>Desculpe, não consegui fazer o que pediu.</speak>\",\"shouldEndSession\":false,\"userAgent\":\"ask-node/2.10.2 Node/v14.16.0\",\"sessionAttributes\":"

----------------------

我从堆栈错误中删除了一些 ID 信息,但我认为它们与目的无关。

我唯一能想到的就是当我在 alexa 技能生成器中添加 S3 适配器时。

exports.handler = Alexa.SkillBuilders.custom()
  .withApiClient(new Alexa.DefaultApiClient())
  .withPersistenceAdapter(
    new persistenceAdapter.S3PersistenceAdapter(
      bucketName: process.env.S3_PERSISTENCE_BUCKET,
    )
  )
  .addRequestHandlers(
    LaunchRequestHandler,
    MarcaEpisodioIntentHandler,
    HelpIntentHandler,
    CancelAndStopIntentHandler,
    SessionEndedRequestHandler,
    IntentReflectorHandler // make sure IntentReflectorHandler is last so it doesn't override your custom intent handlers
  )
  .addRequestInterceptors(MarcaEpisodioInterceptor)
  .addErrorHandlers(ErrorHandler)
  .lambda();

这些是我创建的 Intent Intents

这是应该处理它们的函数。

const Alexa = require("ask-sdk-core");
const persistenceAdapter = require("ask-sdk-s3-persistence-adapter");

const intentName = "MarcaEpisodioIntent";

const MarcaEpisodioIntentHandler = 
  canHandle(handlerInput) 
    console.log("Trying to handle wiht marca episodio intent");
    return (
      Alexa.getRequestType(handlerInput.requestEnvelope) !== "LaunchRequest" &&
      Alexa.getRequestType(handlerInput.requestEnvelope) === "IntentRequest" &&
      Alexa.getIntentName(handlerInput.requestEnvelope) === intentName
    );
  ,
  async chandle(handlerInput) 
    const serie = handlerInput.requestEnvelope.request.intent.slots.serie.value;
    const episodio =
      handlerInput.requestEnvelope.request.intent.slots.episodio.value;
    const temporada =
      handlerInput.requestEnvelope.request.intent.slots.temporada.value;
    const attributesManager = handlerInput.attributesManager;
    const serieMark = 
      serie: serie,
      episodio: episodio,
      temporada: temporada,
    ;
    attributesManager.setPersistentAttributes(serieMark);
    await attributesManager.savePersistentAttributes();

    const speakOutput = `$serie marcada no episódio $episodio da temporada $temporada`;

    return handlerInput.responseBuilder.speak(speakOutput).getResponse();
  ,
;

module.exports = MarcaEpisodioIntentHandler;

任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

而是出于某种原因尝试访问亚马逊 S3 存储桶

首先,在轮询意图处理程序的canHandle 函数之前,每次使用都会加载和配置持久性适配器。然后在轮询RequestInterceptor 之前使用持久性适配器。

如果那里有问题,它会在您到达LaunchRequestHandler 之前中断,这就是正在发生的事情。

其次,您是在 Alexa 开发人员控制台中构建 Alexa 托管技能,还是通过 AWS 托管自己的 Lambda?

Alexa 托管会为您创建许多资源,包括 Amazon S3 存储桶和 Amazon DynamoDb 表,然后确保它为您创建的 AWS Lambda 在其环境变量中具有必要的角色设置和正确的信息。

如果您通过 AWS 托管自己的 Lambda,您的 Lambda 将需要一个对您的 S3 资源具有读/写权限的角色,并且您需要将存储持久值的存储桶设置为您的环境变量Lambda(或将process.env.S3_PERSISTENCE_BUCKET 替换为包含存储桶名称的字符串)。

【讨论】:

感谢您抽出宝贵时间回答。我正在使用 Alexa 托管。问题是我的拦截器进程功能导致一些错误破坏了一切?这是我的拦截器函数Interceptor function 可能不是拦截器。我能够在我的旧 Cake Time 中模拟错误,但我没有在 CloudWatch 或开发人员控制台日志中获得完整的堆栈跟踪。但是,如果我在本地编码并使用 Alexa Toolkit for VS Code 测试/调试代码,我希望它出现在 Visual Studio Code 的调试面板输出中。如果是这种情况,您会收到此错误,因为您是在计算机上而不是在 Lambda 中运行代码,并且没有您需要的任何环境变量。如果是这样,我有一个解决方案。 如果您在 Visual Studio Code 中进行测试,正如我所怀疑的那样,我为该用例编写了一个持久性适配器。代码和说明在 Alexa Cookbook 中。 github.com/alexa/alexa-cookbook/tree/master/tools/… 谢谢,这解决了我在使用 Visual Studio 代码和 S3 进行调试时遇到的问题!尝试使用我的意图时仍然出现错误,但这与此错误无关,我应该为此打开另一个主题...我会自己尝试一些,再次感谢您!

以上是关于Alexa Skill S3 在 params 中缺少必需的密钥 Bucket的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Alexa Skill lambda 函数中正确指定 SSML?

Alexa Skill - 如何在 Lambda 函数中检索槽值

如何在 Alexa Skill 中使用 Java 获取亚马逊用户电子邮件

Alexa Skill - 如何获取要求 Alexa 的完整声明文本

Alexa Skill Kit - 保存用户输入

在 Echo 上测试时无法识别 Alexa Skill