0

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

2 回答 2

2

如果您有任何调用的顶级代码(几乎总是一个坏主意),xray_recorder.configure那么它将清除 Lambda 创建的段,不会创建新的有效段。如果您还AWS_XRAY_CONTEXT_MISSING设置了环境变量RUNTIME_ERROR(通常是默认设置),那么您将获得这些异常。

我们的日志中充斥着 ERROR 日志消息(带有AWS_XRAY_CONTEXT_MISSING=LOG_ERROR),直到我们找到并删除了对xray_recorder.configure.

于 2019-08-23T13:50:22.803 回答
2

Lambda 环境的上下文管理永远不会抛出SegmentNotFoundException. 如果线程本地存储中没有活动的segment/subsegment,它会根据Lambda容器中设置的环境变量构造一个segment。请参阅https://github.com/aws/aws-xray-sdk-python/blob/master/aws_xray_sdk/core/lambda_launcher.py#L79

设置环境变量时将使用 lambda 上下文管理LAMBDA_TASK_ROOT。您是在使用某种工具在本地运行 Lambda 函数还是启用了 Lambda 函数active tracing

于 2018-01-15T20:13:31.977 回答