AWS Lambda,ask_sdk_core模块无法导入

5

ask_sdk_core已包含在我的lambda函数的requirements.txt文件中。但是,当我运行实际函数时,ask_sdk_core无法导入。

我正在遵循cake walk示例,它可以在以下位置找到:https://github.com/alexa/skill-sample-python-first-skill/tree/master/module-1,但是我正在尝试将lambda放在我的个人AWS账户上,而不是alexa-hosted lambda上。

当我将Alexa技能指向alexa-hosted技能时,技能按预期运行,但是指向我通过从alexa skill kit复制代码创建的lambda时,lambda函数不返回任何结果。

包括了个人AWS账户上lambda的照片。我尝试更改不同函数名称的多个值,但似乎没有任何作用。

Lambda in Console Lambda in Console 2

lambda执行结果:

Response:
{
  "errorMessage": "Unable to import module 'lambda_function': No module named 'ask_sdk_core'",
  "errorType": "Runtime.ImportModuleError"
}

Request ID:
"7f220b6d-49e4-4fbe-99b5-e5cc1d9c129a"

Function Logs:
START RequestId: 7f220b6d-49e4-4fbe-99b5-e5cc1d9c129a Version: $LATEST
[ERROR] Runtime.ImportModuleError: Unable to import module 'lambda_function': No module named 'ask_sdk_core'END RequestId: 7f220b6d-49e4-4fbe-99b5-e5cc1d9c129a
REPORT RequestId: 7f220b6d-49e4-4fbe-99b5-e5cc1d9c129a  Duration: 11.39 ms  Billed Duration: 100 ms Memory Size: 128 MB Max Memory Used: 57 MB  

requirements.txt:

ask-sdk-core
ask-sdk-s3-persistence-adapter
pytz

lambda_function.py代码:

# -*- coding: utf-8 -*-

# This sample demonstrates handling intents from an Alexa skill using the Alexa Skills Kit SDK for Python.
# Please visit https://alexa.design/cookbook for additional examples on implementing slots, dialog management,
# session persistence, api calls, and more.
# This sample is built using the handler classes approach in skill builder.
import logging
import ask_sdk_core.utils as ask_utils

from ask_sdk_core.skill_builder import SkillBuilder
from ask_sdk_core.dispatch_components import AbstractRequestHandler
from ask_sdk_core.dispatch_components import AbstractExceptionHandler
from ask_sdk_core.handler_input import HandlerInput

from ask_sdk_model import Response

logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)


class LaunchRequestHandler(AbstractRequestHandler):
    """Handler for Skill Launch."""
    def can_handle(self, handler_input):
        # type: (HandlerInput) -> bool

        return ask_utils.is_request_type("LaunchRequest")(handler_input)

    def handle(self, handler_input):
        # type: (HandlerInput) -> Response
        speak_output = "Hello! Welcome to cake walk. That was a piece of cake! Bye!"

        return (
            handler_input.response_builder
                .speak(speak_output)
                #.ask(speak_output)
                .response
        )


class HelloWorldIntentHandler(AbstractRequestHandler):
    """Handler for Hello World Intent."""
    def can_handle(self, handler_input):
        # type: (HandlerInput) -> bool
        return ask_utils.is_intent_name("HelloWorldIntent")(handler_input)

    def handle(self, handler_input):
        # type: (HandlerInput) -> Response
        speak_output = "Hello World!"

        return (
            handler_input.response_builder
                .speak(speak_output)
                # .ask("add a reprompt if you want to keep the session open for the user to respond")
                .response
        )


class HelpIntentHandler(AbstractRequestHandler):
    """Handler for Help Intent."""
    def can_handle(self, handler_input):
        # type: (HandlerInput) -> bool
        return ask_utils.is_intent_name("AMAZON.HelpIntent")(handler_input)

    def handle(self, handler_input):
        # type: (HandlerInput) -> Response
        speak_output = "You can say hello to me! How can I help?"

        return (
            handler_input.response_builder
                .speak(speak_output)
                .ask(speak_output)
                .response
        )


class CancelOrStopIntentHandler(AbstractRequestHandler):
    """Single handler for Cancel and Stop Intent."""
    def can_handle(self, handler_input):
        # type: (HandlerInput) -> bool
        return (ask_utils.is_intent_name("AMAZON.CancelIntent")(handler_input) or
                ask_utils.is_intent_name("AMAZON.StopIntent")(handler_input))

    def handle(self, handler_input):
        # type: (HandlerInput) -> Response
        speak_output = "Goodbye!"

        return (
            handler_input.response_builder
                .speak(speak_output)
                .response
        )


class SessionEndedRequestHandler(AbstractRequestHandler):
    """Handler for Session End."""
    def can_handle(self, handler_input):
        # type: (HandlerInput) -> bool
        return ask_utils.is_request_type("SessionEndedRequest")(handler_input)

    def handle(self, handler_input):
        # type: (HandlerInput) -> Response

        # Any cleanup logic goes here.

        return handler_input.response_builder.response


class IntentReflectorHandler(AbstractRequestHandler):
    """The intent reflector is used for interaction model testing and debugging.
    It will simply repeat the intent the user said. You can create custom handlers
    for your intents by defining them above, then also adding them to the request
    handler chain below.
    """
    def can_handle(self, handler_input):
        # type: (HandlerInput) -> bool
        return ask_utils.is_request_type("IntentRequest")(handler_input)

    def handle(self, handler_input):
        # type: (HandlerInput) -> Response
        intent_name = ask_utils.get_intent_name(handler_input)
        speak_output = "You just triggered " + intent_name + "."

        return (
            handler_input.response_builder
                .speak(speak_output)
                # .ask("add a reprompt if you want to keep the session open for the user to respond")
                .response
        )


class CatchAllExceptionHandler(AbstractExceptionHandler):
    """Generic error handling to capture any syntax or routing errors. If you receive an error
    stating the request handler chain is not found, you have not implemented a handler for
    the intent being invoked or included it in the skill builder below.
    """
    def can_handle(self, handler_input, exception):
        # type: (HandlerInput, Exception) -> bool
        return True

    def handle(self, handler_input, exception):
        # type: (HandlerInput, Exception) -> Response
        logger.error(exception, exc_info=True)

        speak_output = "Sorry, I had trouble doing what you asked. Please try again."

        return (
            handler_input.response_builder
                .speak(speak_output)
                .ask(speak_output)
                .response
        )

# The SkillBuilder object acts as the entry point for your skill, routing all request and response
# payloads to the handlers above. Make sure any new handlers or interceptors you've
# defined are included below. The order matters - they're processed top to bottom.


sb = SkillBuilder()

sb.add_request_handler(LaunchRequestHandler())
sb.add_request_handler(HelloWorldIntentHandler())
sb.add_request_handler(HelpIntentHandler())
sb.add_request_handler(CancelOrStopIntentHandler())
sb.add_request_handler(SessionEndedRequestHandler())
sb.add_request_handler(IntentReflectorHandler()) # make sure IntentReflectorHandler is last so it doesn't override your custom intent handlers

sb.add_exception_handler(CatchAllExceptionHandler())

lambda_handler = sb.lambda_handler()

你是否将 ask_sdk_core 与 Lambda 部署包捆绑在一起?从截图中我没有看到它。 - Marcin
我不确定该怎么做?我对这些并不是很熟悉,只是试着按照我在网上找到的指南进行操作。你知道我可以在哪里查看如何进行捆绑吗? - kevin lowenhaupt
所以我很清楚,我不是使用zip文件来创建lambda函数。我只是从头开始创建它。 - kevin lowenhaupt
@kevinlowenhaupt,你找到解决方案了吗? - Nikhil Wagh
3个回答

0

看起来你缺少 pip install -r requirements.txt 命令来在创建部署包之前安装库?

X-Ray SDK 不是函数底层环境的一部分,需要编译成一个部署包或层。层提供了库的模块化,这些库通常被其他函数共享。无论哪种情况,您都必须使用列在 此处 的 Amazon Linux AMI 安装模块以供使用。

部署包和层之间文件夹结构的快速区别:

  1. 部署包:所需模块必须存在于 .zip 的根目录中
  2. 层:模块必须添加在 /pythonpython/lib/pythonX.X/site-packages

zipinfo filename.zip 非常有用,可以查看文件夹结构而不需要解压缩 .zip。


抱歉,我正在尝试遵循您的评论。我没有使用zip文件来创建Lambda函数,而是从头开始创建它。您的意思是我只需要在代码中加入'''pip install requirements.txt'''吗? - kevin lowenhaupt
没有部署包或 Lambda 层,它将无法正常工作,因为这些库需要打包到 .zip 文件中,然后上传到函数中。请查看以下带有示例模块“pillow”的部署包示例:https://docs.aws.amazon.com/lambda/latest/dg/python-package.html#python-package-dependenciespip install -r requirements.txt需要从您的本地机器(推荐使用 Lambda AMI 的 EC2)编译。 - Shreyas Gaonkar

0

仅使用 Lambda 层,您可以创建自己的 Lambda 层,但使用此层:arn:aws:lambda:us-east-1:173334852312:layer:ask-sdk-for-python-36:1


-1
我正在使用Windows10中的Python 3.8

以管理员身份运行powershell。

选择当前工作目录为:C:\

mkdir pythonimport
chdir pythonimport
py -3 -m venv venv
Set-ExecutionPolicy Unrestricted -Force
C:\pythonimport\venv> .\Scripts\Activate.ps1
(venv) PS C:\pythonimport\venv> pip install ask_sdk_core

完成此操作后,您将找到所有所需的软件包已下载。

现在前往:

C:\pythonimport\venv\Lib\site-packages

在这里你会找到所有新下载的包,如 ask_sdk_core、ask_sdk_modelask_sdk_runtime。 现在从 Lambda 页面中复制代码片段,即从 lambda_function.py
然后在其中创建一个新的 Python 文件。
C:\pythonimport\venv\Lib\site-packages\lambda_function.py 

然后粘贴相同的代码片段。

现在将下面提到的文件压缩为lambda_function.zip

  • ask_sdk_core
  • ask_sdk_model
  • ask_sdk_runtime
  • lambda_function.py
现在,在Lambda服务的网页上,上传zip文件。
哇!
它会像魔法一样运行 :-)

如果您有任何疑问,请留言。

附注:使用虚拟测试用例来检查引发的异常。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接