Estoy tratando de escribir una función lambda que se activa cada vez que se carga un archivo json en un depósito s3. Se supone que la función analiza el archivo y lo almacena inmediatamente en DynamoDB. Creé una tabla llamada 'datos' con la clave principal establecida como 'fecha'. Esto es lo que tengo para la función hasta ahora:
import boto3 import json s3_client = boto3.client('s3') dynamodb = boto3.resource('dynamodb') def lambda_handler(event, context): bucket = event['Records'][0]['s3']['bucket']['name'] json_file_name = event['Records'][0]['s3']['object']['key'] json_object = s3.Bucket(bucket).Object(json_file_name) jsonFileReader = json_object['Body'].read() jsonDict = json.loads(jsonFileReader) table = dynamodb.Table('data') table.put_item(Item = jsonDict)Aquí hay un ejemplo de un archivo json que estoy tratando de usar:
{ "date": "2020-06-07 21:00:34.284421", "ConfirmedCases": 7062067, "ActiveCases": 3206573, "RecoveredCases": 3450965, "Deaths": 404529 }Desafortunadamente, cada vez que pruebo el código, arroja este error:
[[ERROR] TypeError: string indices must be integers Traceback (most recent call last): File "/var/task/lambda_function.py", line 7, in lambda_handler bucket = event'Records'][0]['s3']['bucket']['name']]Alguien sabe cómo resolver este problema? He perdido tanto tiempo tratando de resolver esto y todavía no puedo :/
Su error es de cualquiera de estas líneas.
bucket = event['Records'][0]['s3']['bucket']['name'] json_file_name = event['Records'][0]['s3']['object']['key']Sin embargo, son correctos . Esta es la forma válida de acceder al nombre del depósito y la clave del objeto desde el evento generado por las notificaciones de S3.
Me parece que otra cosa es activar tu función . O usa la opción Test en la consola y proporciona un objeto de event incorrecto, o hay algún otro evento que activa la lambda con un evento que no es S3.
Como solución rápida, puede hacer lo siguiente. El siguiente código terminará si el objeto del event no contiene Records :
def lambda_handler(event, context): if 'Records' not in event: print(event) # good to check what event you get return # and the rest of code