我正在尝试编写一个Lambda函数来将文件从一个s3存储桶复制到另一个与AWS Xray集成的存储桶。下面是Lambda函数的代码。我收到了错误
aws_xray_sdk.core.exceptions.exceptions.SegmentNotFoundException:无法找到当前的细分/子细分,请确保您的细分已打开
我在部署包中包含了Aws xray SDK。此外,代码中还包含开始段和结束段。请解决此错误。
import boto3
from aws_xray_sdk.core import xray_recorder
from aws_xray_sdk.core import patch
patch(['boto3'])
client = boto3.client('s3')
s3 = boto3.resource('s3')
SourceBucket = 'bucket1'
DestBucket = 'bucket2'
list1=[];
def lambda_handler(event, context):
response = client.list_objects(Bucket=SourceBucket)
if 'Contents' in response:
for item in response['Contents']:
list1.append(item['Key']);
put_object_into_s3()
for name in list1:
copy_source = {
'Bucket': SourceBucket,
'Key': name
}
response = s3.meta.client.copy(copy_source, DestBucket, name)
答案 0 :(得分:2)
Lambda环境的上下文管理永远不会抛出SegmentNotFoundException
。如果线程本地存储中没有活动的段/子段,它将根据Lambda容器中设置的环境变量构造段。见https://github.com/aws/aws-xray-sdk-python/blob/master/aws_xray_sdk/core/lambda_launcher.py#L79
设置环境变量LAMBDA_TASK_ROOT
时将使用lambda上下文管理。您是否正在使用某种工具在本地运行Lambda函数或是否已启用Lambda函数active tracing
?
答案 1 :(得分:1)
如果您有任何调用xray_recorder.configure
的顶级代码(几乎总是一个坏主意),那么它将清除Lambda创建的段,但不会创建新的有效段分割。如果您还将环境变量AWS_XRAY_CONTEXT_MISSING
设置为RUNTIME_ERROR
(默认情况下通常是这样),那么您将获得这些异常。
我们的日志中充斥着错误日志消息(带有AWS_XRAY_CONTEXT_MISSING=LOG_ERROR
),直到我们找到并删除了对xray_recorder.configure
的不必要的调用。