AWS SQS запускает лямбда-функцию Python

#python #amazon-web-services #aws-lambda #amazon-sqs

#python #amazon-веб-сервисы #aws-lambda #amazon-sqs

Вопрос:

Лямбда-функция получает следующее сообщение от SQS

 "Records": [
    {
        "messageId": "a91c1641-fb7e-4ce5-88ad-2dd180aaada6",
        "receiptHandle": "AQEBngcKiVX9S0IjX6SfCm5VAtaDbSxznYLDMMoN2J5pq uzVLdyzsaBVwXVjOE94dBnzAqkbI2II8RvfIfEeQCwp/8MxV5OLJXEQiBhpm2QwCXlUy 1ludjUbKRXT6pBux0eqjuVDk4I/vQ59m3D ut2mafo2wgEZtUqT28P5DVgpeCgwFmuHcSRoc/vjcj/5rBDSJ6Mk4T XTnnPMkZXOY0Nl9 XWzXJe3eX DJC7vn6Vi6wEMk84nhbjn CdL/TpHFtA6qCFE03XEJnRQeZCf69sqbpGq ecIKI bxb5DMDOTIin ugb1oqpvfhySkB9nWodYOv P6ANeLJSm4kBRvsSriDcP9uO/whyQGUMZC1v0Kx0CFVqtVmg2fIoj5R8k3f7QU9zpTKrJO5Bn/K6BwA==",
        "body": "[n    {n        "year": 2013,n        "title": "Rush",n        "info": {n            "directors": ["Ron Howard"],n            "release_date": "2013-09-02T00:00:00Z",n            "rating": 8.3,n            "genres": [n                "Action",n                "Biography",n                "Drama",n                "Sport"n            ],n            "image_url": "http://ia.media-imdb.com/images/M/MV5BMTQyMDE0MTY0OV5BMl5BanBnXkFtZTcwMjI2OTI0OQ@@._V1_SX400_.jpg",n            "plot": "A re-creation of the merciless 1970s rivalry between Formula One rivals James Hunt and Niki Lauda.",n            "rank": 2,n            "running_time_secs": 7380,n            "actors": [n                "Daniel Bruhl",n                "Chris Hemsworth",n                "Olivia Wilde"n            ]n        }n    }n]",
        "attributes": {
            "ApproximateReceiveCount": "1",
            "SentTimestamp": "1604156768953",
            "SenderId": "983336180496",
            "ApproximateFirstReceiveTimestamp": "1604156768958"
        },
        "messageAttributes": {},
        "md5OfBody": "3d249c6c5e1b6cffc0f7af7101f3ea40",
        "eventSource": "aws:sqs",
        "eventSourceARN": "arn:aws:sqs:us-east-1:983336180496:Parse-SQS-Msg",
        "awsRegion": "us-east-1"
    }
]
  

Теперь в разделе тела я хочу извлечь такие сведения, как «Год», «Название» и «Рейтинг». Как я могу извлечь эти данные в разных переменных, чтобы я мог соответствующим образом написать логику для них? Детали, которые я хочу извлечь, — это год, название, жанры и рейтинг:

 "body": "[
    {
        "year": 2013,
        "title": "Rush",
        "info": {
            "directors": ["Ron Howard"],
            "release_date": "2013-09-02T00:00:00Z",
            "rating": 8.3,
            "genres": [
                "Action",
                "Biography",
                "Drama",
                "Sport"
            ],
            "image_url": "http://ia.media-imdb.com/images/M/MV5BMTQyMDE0MTY0OV5BMl5BanBnXkFtZTcwMjI2OTI0OQ@@._V1_SX400_.jpg",
            "plot": "A re-creation of the merciless 1970s rivalry between Formula One rivals James Hunt and Niki Lauda.",
            "rank": 2,
            "running_time_secs": 7380,
            "actors": [
                "Daniel Bruhl",
                "Chris Hemsworth",
                "Olivia Wilde"
            ]
        }
    }
]
  

Фрагмент кода приведен ниже:

     from __future__ import print_function
    from pprint import pprint
    from botocore.vendored import requests
    import boto3
    import json
    
    dynamodb = boto3.resource('dynamodb')
    
    def lambda_handler(event, context):
        print("Received event: "   json.dumps(event, indent=2))
        for record in event['Records']:
           print ("test")
           year_e = record['body'][0]
           print(year_e)
           payload=record["body"]
           print(str(payload))
  

Я попробовал несколько перестановок и комбинаций из Интернета, но ничего не помогло. Я очень новичок в Python, поэтому приветствуется быстрая помощь.

Комментарии:

1. пожалуйста, добавьте event (в виде текста) к вопросу. Пожалуйста, опишите проблему — она неясна.

2. Это недопустимый ввод JSON. json.dumps() сериализует объект в виде потока в формате JSON. А лямбда-функции — это небольшие анонимные функции.

3. Предоставьте рабочий образец.

4. Я получаю «тело» в полезной нагрузке. Мне нужна помощь в извлечении year —> 2013 в одной переменной и title в другой, чтобы я мог соответствующим образом запрашивать базу данных.

Ответ №1:

Проблема в том, что body поле содержит JSON, но оно в текстовом формате. Вам нужно будет преобразовать ее в объект Python с помощью:

 body = json.loads(record['body'])
  

Затем вы можете ссылаться на содержимое как на словарь:

 for film in body:
  print(film['title'], film['year'], film['info']['rating'])