Как получить размер файла из AWS S3 ObjectRemoved: Удалить событие

Фон

Я храню некоторые файлы (объекты) в ведре S3. Всякий раз, когда какой-либо файл удаляется из корзины S3, срабатывает моя функция Lambda. Лямбда-функции необходимо вычесть размер объекта из DynamoDB.

Проблема: событие S3 deleteObject не отправляет объект Размер

Пример события S3 deleteObject

{
  "Records": [
    {
      "eventVersion": "2.0",
      "eventTime": "1970-01-01T00:00:00.000Z",
      "requestParameters": {
        "sourceIPAddress": "127.0.0.1"
      },
      "s3": {
        "configurationId": "testConfigRule",
        "object": {
          "sequencer": "0A1B2C3D4E5F678901",
          "key": "HappyFace.jpg"
        },
        "bucket": {
          "arn": "arn:aws:s3:::mybucket",
          "name": "sourcebucket",
          "ownerIdentity": {
            "principalId": "EXAMPLE"
          }
        },
        "s3SchemaVersion": "1.0"
      },
      "responseElements": {
        "x-amz-id-2": "EXAMPLE123/5678abcdefghijklambdaisawesome/mnopqrstuvwxyzABCDEFGH",
        "x-amz-request-id": "EXAMPLE123456789"
      },
      "awsRegion": "us-east-1",
      "eventName": "ObjectRemoved:Delete",
      "userIdentity": {
        "principalId": "EXAMPLE"
      },
      "eventSource": "aws:s3"
    }
  ]
}

Пожалуйста, помогите мне найти решение для моего варианта использования.


person Darshan Ambhaikar    schedule 31.01.2018    source источник
comment
Вы можете сохранить размер объекта в DynamoDB при загрузке объекта, а затем получить эти данные при получении уведомления об удалении объекта. Не уверен, в чем заключается ваша основная потребность, но если это просто для поддержания точного размера корзины или количества объектов, вы можете использовать для этого метрики S3 через CloudWatch.   -  person jarmod    schedule 31.01.2018
comment
Спасибо, Jarmod, для этого мне нужно установить FileName как ID (Hash) таблицы DynamoDB? Потому что я получу только имя файла из события deleteObject, которое можно использовать для получения сведений о файле.   -  person Darshan Ambhaikar    schedule 31.01.2018
comment
Вы можете использовать ключ объекта (не совсем то же самое, что имя файла), и это будет просто. Если у вас нет многих миллионов объектов и очень высокой частоты удаления, в этом случае вам следует рассмотреть хэш ключа объекта.   -  person jarmod    schedule 31.01.2018
comment
Спасибо jarmod, на данный момент я решил проблему, создав таблицу записей файла DynamoDB.   -  person Darshan Ambhaikar    schedule 02.02.2018


Ответы (1)


Один из способов сделать это - включить управление версиями и проверить метаданные последнего версия.

Чтобы удалить версию навсегда, вы можете настроить политику истечения срока действия или явно удалить версию. Я бы, вероятно, использовал оба, чтобы поймать случаи, когда обработчик событий (лямбда-функция) дает сбой и не может удалить файл.

person Javier    schedule 31.01.2018
comment
Спасибо, Хавьер, подумал о таком подходе, но не думаете ли вы, что он существенно увеличит стоимость S3? - person Darshan Ambhaikar; 31.01.2018
comment
Мне сложно сказать. Какой% объектов удаляется ежедневно? Если обработчик событий может удалить версию, это займет очень мало времени. - person Javier; 31.01.2018
comment
Привет, Хавьер, в конечном итоге я использую предложенный вами подход, спасибо - person Darshan Ambhaikar; 02.04.2018