Загрузка нескольких файлов в S3 с помощью Lambda / Python

#python #amazon-web-services #amazon-s3 #aws-lambda #amazon-dynamodb

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

Вопрос:

итак, я пишу лямбда-функцию, которая запускается событиями из потоков DynamoDB, и я хочу записать эти события в S3 (для создания озера данных). но этот код загружает только один и тот же файл json. Как я могу загрузить несколько файлов в s3, не перезаписывая этот?

    import boto3
   import json
   
   s3 = boto3.client('s3')
   
   def lambda_handler(event, context):
       
     bucket ='bto-history'
     dynamodb = boto3.resource('dynamodb')
     tableUsers = dynamodb.Table('Users')
       
     jsonToUpload = event['Records']
   
     uploadFile = bytes(json.dumps(jsonToUpload).encode('UTF-8'))
     
     jsonToUpload = "userUpdate"   ".json"
   
     s3.put_object(Bucket=bucket, Key=jsonToUpload, Body=uploadFile)
   
     
     return {
       'statusCode': 200,
       'body': event
       }
  

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

1. К вашему сведению, в DynamoDB нет файлов. В нем есть таблицы, элементы и атрибуты.

2. Не могли бы вы отредактировать свой вопрос, чтобы объяснить, чего вы хотите достичь? Например, что запускает функцию Lambda? Какую информацию вы хотите сохранить в S3? Каким вы хотите, чтобы ключ (имя файла) был при записи в S3?

3. Изменен вопрос. Я хочу, чтобы ключ был файлом json при записи в S3.

Ответ №1:

Вы не сказали, но я предполагаю, что вы пишете лямбда-функцию, которая запускается событиями из потоков DynamoDB, и вы хотите записать эти события в S3.

Если вы хотите сохранить несколько файлов / объектов в S3, вам нужно предоставить им уникальные ключи. Запись в userUpdate.json просто перезапишет любой существующий объект этим ключом (если у вас не включено управление версиями, чего, я полагаю, у вас нет).

Итак, каждый раз создавайте уникальный ключ объекта. Вы можете вставить временную метку в миллисекундах (или другую), которая, вероятно, уникальна. Или вы можете вставить UUID.

Стоит спросить: почему вы хотите сохранить события DynamoDB Streams в S3?

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

1. Спасибо за ответ! Я работаю над озером данных, в котором хранятся данные сотрудников, эти данные поступают из формы. Кстати, у меня в корзине включено управление версиями.

2. Хорошо, вы не можете обновлять объекты в S3, поэтому лучше всего регистрировать эти события DynamoDB в уникальных объектах в S3 (это может быть уникальное имя файла уникальной комбинации папки имя файла, оба из которых, конечно, на самом деле являются ключами) или регистрировать их в другом месте (например, журналы CloudWatch или СУБД).

Ответ №2:

event['Records'] это список, который вам нужно перебрать. См. https://docs.aws.amazon.com/lambda/latest/dg/with-ddb.html

Каждая запись содержит информацию о событии dynamodb.