jus*_*ode 11 amazon-web-services node.js amazon-dynamodb aws-lambda
在这个周末,我在与dynamodb集成的aws lambda上运行了一些节点函数,我使用x-ray调试它创建我自己的注释,我想知道是否有更好的方法来调试lambda函数类似于逐步执行步?
我认为有一些误解,请原谅从 node.js 上下文切换到 python(标题不是特定于节点的,所以无论如何很多人都会在这里结束)。
您CAN调试实际部署AWS lambda表达式行由行。该方法涉及在开发机器上运行调试服务器pydevd和通过长时间运行的 TCP 连接与调试服务器通信的 lambdas。
它是否受各种 IDE 支持,我们使用的是 PyCharm Pro,因此对其进行设置(假设您应该能够类似地设置 VSCode):
带有路径映射的调试配置:右上角运行/调试配置下拉菜单 -> 编辑配置 -> +(添加新配置)-> Python 远程调试 -> 为您的开发机器指定主机名/端口(需要全局公开:setup)在您的路由器上进行路径转发,或者如果之前的选项不可用,请使用ngrok)。确保设置路径映射,这是您的 IDE 可以将远程脚本映射到本地源的方式。
pip install pydevd
. (对于pycharm,您需要安装IDE版本特定的自定义分布,如:pip install pydevd-pycharm~=193.5233.109
)
添加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
因此除非我们设置断点,否则执行不会停止)
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射线跟踪和其他元数据来检测和调试失败。