如何调试aws lambda函数?

jus*_*ode 11 amazon-web-services node.js amazon-dynamodb aws-lambda

在这个周末,我在与dynamodb集成的aws lambda上运行了一些节点函数,我使用x-ray调试它创建我自己的注释,我想知道是否有更好的方法来调试lambda函数类似于逐步执行步?

小智 6

Lambda local可用于在本地计算机中测试lambda代码。


amb*_*ght 6

我认为有一些误解,请原谅从 node.js 上下文切换到 python(标题不是特定于节点的,所以无论如何很多人都会在这里结束)。

CAN调试实际部署AWS lambda表达式行由行。该方法涉及在开发机器上运行调试服务器pydevd和通过长时间运行的 TCP 连接与调试服务器通信的 lambdas。

它是否受各种 IDE 支持,我们使用的是 PyCharm Pro,因此对其进行设置(假设您应该能够类似地设置 VSCode):

  1. 带有路径映射的调试配置:右上角运行/调试配置下拉菜单 -> 编辑配置 -> +(添加新配置)-> Python 远程调试 -> 为您的开发机器指定主机名/端口(需要全局公开:setup)在您的路由器上进行路径转发,或者如果之前的选项不可用,请使用ngrok)。确保设置路径映射,这是您的 IDE 可以将远程脚本映射到本地源的方式。

  2. pip install pydevd. (对于pycharm,您需要安装IDE版本特定的自定义分布,如:pip install pydevd-pycharm~=193.5233.109

  3. 添加RemoteDebugSession上下文管理器抽象(由于调试会话是通过长时间运行的 tcp 连接,它需要在您的 lambda 中明确关闭,否则 lambda 将超时)如:

# from config import config
from logging import getLogger
logger = getLogger(__name__)


class RemoteDebugSession:
    def __init__(self):
        self.active = False
        if not self.is_available():
            logger.warning(f"Remote debugging is not available")
            return

        try:
            # pydevd_pycharm exposes only settrace() from pydevd, import pydevd directly instead
            # import pydevd_pycharm
            import pydevd
            self.pydevd = pydevd
        except Exception as e:
            logger.warning(f"Remote debugging is unavailable")
            logger.warning(e)
            self.pydevd = None

    def __enter__(self):
        if not self.is_available() or self.pydevd is None:
            return

        self.pydevd.settrace(config.REMOTE_DEBUG_HOST, port=config.REMOTE_DEBUG_PORT,
                             suspend=False,
                             stdoutToServer=True,
                             stderrToServer=True)

        logger.warning("Starting remote dubugging session")
        self.active = True

    def __exit__(self, exc_type, exc_val, exc_tb):
        if not self.active:
            return

        if exc_type or exc_val or exc_tb:
            logger.warning(
                f"Remote debugging on {config.REMOTE_DEBUG_HOST}:{config.REMOTE_DEBUG_HOST} failed")
            logger.warning(exc_type)
            logger.warning(exc_val)
            logger.warning(exc_tb)
        else:
            logger.warning(f"Remote debugging on {config.REMOTE_DEBUG_HOST}:{config.REMOTE_DEBUG_HOST} closed")

        self.pydevd.stoptrace()

    @staticmethod
    def is_available():
        return hasattr(config, 'REMOTE_DEBUG_ENABLED') \
            and hasattr(config, 'REMOTE_DEBUG_HOST') \
            and hasattr(config, 'REMOTE_DEBUG_PORT') \
            and config.REMOTE_DEBUG_ENABLED \
            and config.REMOTE_DEBUG_HOST \
            and config.REMOTE_DEBUG_PORT
Run Code Online (Sandbox Code Playgroud)

您需要设置带有 REMOTE_DEBUG_ENABLED、REMOTE_DEBUG_HOST、REMOTE_DEBUG_PORT 的配置对象。( pydevd.settrace 与 一起使用,suspend=False因此除非我们设置断点,否则执行不会停止)

  1. 用它包裹您感兴趣的功能,例如:
 with RemoteDebugSession() as session:
    # your code to examine
    pass
Run Code Online (Sandbox Code Playgroud)

实际上,在构建 Web 服务器时,这可以在单独的 API 处理程序中,这将允许您调试多个同时传入的请求,因为其他 lambda 将在连接时阻塞。

避免在生产中使用它。除了安全风险,远程评估可以让你做各种讨厌的事情。


小智 5

无论SAM本地无服务器架构提供工具在本地执行的AWS lambda函数。如果您需要在AWS环境中调试功能,建议您使用Cloud9 Cloud9 IDE进行AWS Lambda调试

但是,要调试生产中发生的调用失败,可以使用Dashbird之类的东西通过日志,X射线跟踪和其他元数据来检测和调试失败。