使用Lambda的AWS Xray中的SegmentNotFoundException

时间:2018-01-12 08:36:38

标签: python amazon-s3 aws-lambda aws-xray

我正在尝试编写一个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)

2 个答案:

答案 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的不必要的调用。