AWS XRay: невозможно записать в /tmp/.aws-xray/initialized.Не удалось сообщить об инициализации SDK - PullRequest
0 голосов
/ 01 декабря 2018

Я пытаюсь написать лямбда-функцию для хранения данных в dyanamodb и пытаюсь интегрировать с AWS Xray.Ниже приведен код для лямбда-функции.Я получаю сообщение об ошибке

Невозможно записать в /tmp/.aws-xray/initialized.Не удалось сообщить об инициализации SDK.Подсегмент put_item отброшен из-за того, что Lambda работник все еще инициализирует

Я устанавливаю пакет Aws xray SDK.Кроме того, начальный сегмент и конечный сегмент включены в код.а также установите переменную окружения LAMBDA_TASK_ROOT .Пожалуйста, дайте решение этой ошибки.

import json
import os
import configparser
import boto3
from aws_xray_sdk.core import xray_recorder
from aws_xray_sdk.core import patch

patch(['boto3'])
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table(os.environ['dynamodb_table'])

def lambda_handler(event, context):
    for i in event:
        item = {
            'key': i['key'],
            'search': i['search'],
        }
        put_item_into_dynamodb(item)

    response = {
         "statusCode": 200,
         "body": json.dumps(item)
    }
    return response

def put_item_into_dynamodb(item):
    try:
        xray_recorder.begin_subsegment('put_item')
        response = table.put_item(Item=item)
        status_code = response['ResponseMetadata']['HTTPStatusCode']
        xray_recorder.current_subsegment().put_annotation('put_response', status_code)
    finally:
        xray_recorder.end_subsegment()

Обновление 2 (вторая проблема): в этом коде AttributeError: у объекта 'NoneType' нет атрибута 'put_annotation' эта ошибка появляется.. Я понятия не имею, почему это происходит ..

def lambda_handler(event, context):

    val = (str(event['userId']),str(event['teamId']), str(event['searchScope']))
    key_table = "|".join(val)
    key = {
        'key': key_table
    }
    response = get_item_into_dynamodb(key)

    try:
        data = response['Item']
        for i in data['search']:
            keyword_list.append(i['searchText'])
            dict_of_keyword[i['searchText']] = i['dateTime']

        recent_sort = sorted(dict_of_keyword.items(), key=lambda x: x[1], reverse=True)
def get_item_into_dynamodb(key):
    try:
        xray_recorder.begin_segment('get_item')
        response = table.get_item(Key = key)
        status_code = response['ResponseMetadata']['HTTPStatusCode']
        xray_recorder.current_subsegment().put_annotation('get_response', status_code) #error is on this line
    finally:
        xray_recorder.end_subsegment()

    return response

1 Ответ

0 голосов
/ 04 декабря 2018

Вы не можете создавать сегменты в лямбда-функции.Lambda создаст сегменты во внешней оболочке, к которым вы не можете получить доступ внутри функции.Не могли бы вы попытаться изменить значение с xray_recorder.begin_segment('get_item') на xray_recorder.begin_subsegment('get_item')?

Также данные трассировки, сгенерированные вне лямбда-обработчика, не будут перехвачены, поскольку в течение этого времени лямбда-функция все еще инициализируется и контекст трассировки недоступен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...