【问题标题】:Instrumenting Python 3.6 Lambda Function with X-Ray Causes Error使用 X 射线检测 Python 3.6 Lambda 函数会导致错误
【发布时间】:2019-07-03 14:49:55
【问题描述】:

我有一个非常简单的 Lambda 函数,我使用一个运行 ECS 任务的 IOT 按钮调用它,非常轻量级的东西。我一直对添加 Tracing 很感兴趣,但发现您从 Lambda 获得的“一键式”跟踪并不能立即为您提供很多东西。

我一直在阅读一些关于DecoratorsSDK Github 的帖子以及Python tracing for Lambda 上的AWS 文档,并认为这应该很容易。

我的函数的开头现在如下

import boto3
from aws_xray_sdk.core import xray_recorder

@xray_recorder.capture("handler")

def handler(event,context):
  client = boto3.client('ecs')
  response = client.run_task(
---python code---
  return str(response)

现在测试给我这样的错误:

Response:
{
  "errorMessage": "Unable to import module 'lambda_function'"
}

Request ID:
"REQID...e3f379f4702a"

Function Logs:
START RequestId: REQID...e3f379f4702a Version: $LATEST
Unable to import module 'lambda_function': No module named 'aws_xray_sdk'

我在控制台中的处理程序只是lambda_function.handler,并且在添加该检测之前工作。我已经做了一些其他尝试,尝试在代码中使用 Subsegments 并遇到同样的问题。在 Python 方面我是个新手,所以我不确定下一步该检查哪里,或者我是否正确地执行了此操作。

如果适用,我已经在控制台中编写了代码,也没有使用图层或 ZIP 包装

【问题讨论】:

  • python 文件名是什么?如果你的 python 文件名是lambda_function.py,那么你将它命名为lambda_function.handler,但如果它是lambda.py,那么在这种情况下你的处理程序将命名为lambda.handler。所以简而言之,处理程序名称应该是python-filename.function-name
  • @d_kennetz 我的 Python 文件名是 lambda_function.py - 所以我认为我的处理程序设置正确。如果代码中没有from aws_xray_sdk.core import xray_recorder @xray_recorder.capture("handler"),我可以正常工作

标签: python amazon-web-services aws-lambda python-3.6 aws-xray


【解决方案1】:

弄清楚我做错了什么(一些事情),但幸运的是我的自我,命名约定不是错误的事情。

aws-xray-sdk 是一个外部依赖项,需要内置而不是在控制台中执行,我还进行了几次打包,看到 Queuemodule missing 错误,它包含在来自 Python 3.x 的 multiprocessing 库。

在 Cloud9 IDE 中,我执行了以下步骤

mkdir package && cd package
pip install multiprocessing --system -t ./
pip3 install boto3 --system -t ./
pip install aws-xray-sdk --system -t ./
chmod -R 755 .
zip -r ../myDeploymentPackage.zip .
cd -
aws s3 cp myDeploymentPackage.zip s3://<my-bucket>/<my-path>/

在 Lambda 控制台中,我为上传的 Zip 文件的当前版本指定了 URL,在控制台中启用了 X 射线跟踪,我让它工作得很好。我还必须修改我编写 Python 代码的方式,以利用修补 boto3 以及自动检测的优势,因为该功能非常简单,并且使用 Boto 对不同服务进行一到两次调用,现在看起来像这样:

import boto3
from aws_xray_sdk.core import xray_recorder
from aws_xray_sdk.core import patch

patch(['boto3'])

@xray_recorder.capture("handler")

def handler(event,context):
  client = boto3.client('<service here>')

【讨论】:

  • 您好,您是在什么阶段添加功能码的? package 已创建,因此它是空的并且代码不在其中,另一方面,您仅压缩 package 的内容。那么你是怎么做到的呢?谢谢!
  • pip3 install multiprocessing --system -t ./ :没有这样的选项:--system。当然,我在 Cloud9。
  • 一些事情@putnik - 我在 Ubuntu 上,还确保安装了 Pip 和 Pip3 以及相关的 Python/Python3。 lambda 函数文件也在那个目录中。在压缩之前确保它在那里。
  • @burningjenkinscontainer 我的 lambda 函数无法找到 aws_sdk 模块。我的 lamda 函数在主文件夹中,而 aws_sdk 在 libs 文件夹中(在主文件夹之外)。我需要更新系统路径吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多