aws lambda,ask_sdk_core 模块未导入

kev*_*upt 5 python-module amazon-web-services python-3.x aws-lambda alexa-skills-kit

ask_sdk_core包含在我的 lambda 函数requirements.txt文件中。但是,当我运行实际函数时, ask_sdk_core不会导入。我正在跟踪在 中找到的 cake walk 示例, https://github.com/alexa/skill-sample-python-first-skill/tree/master/module-1 但正在尝试在我的个人 AWS 帐户上创建 lambda,而不是在 Alexa 托管的 lambda 上。

当我将 Alexa 技能指向 Alexa 托管的技能时,技能会按预期运行,但是当指向我通过从 Alexa 技能套件复制代码创建的 lambda 时,lambda 函数不会返回任何结果。

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

控制台中的 Lambda 控制台 2 中的 Lambda

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  

Run Code Online (Sandbox Code Playgroud)

要求.txt:

ask-sdk-core
ask-sdk-s3-persistence-adapter
pytz
Run Code Online (Sandbox Code Playgroud)

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()
Run Code Online (Sandbox Code Playgroud)

Shr*_*kar 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 的情况下查看文件夹结构确实很有帮助。