Удалите все файлы из корзины s3, но не все каталоги - PullRequest
0 голосов
/ 18 июня 2019

Итак, я написал отличный скрипт для удаления всего в корзине s3, о котором я рассказал ниже. Единственная проблема - этот скрипт тоже удаляет каталоги У меня есть корзина для приема данных, которая должна хранить свои каталоги, но файлы должны удаляться каждый день. У кого-нибудь есть идеи, как я могу изменить его, чтобы не удалять каталоги?

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

import json
import boto3

def empty_s3_bucket():
  client = boto3.client(
    's3'
   )
bucketNames = ["bucket1","bucket2"]
for bucketName in bucketNames:
    response = client.list_objects_v2(Bucket=bucketName)
  if 'Contents' in response:
    for item in response['Contents']:
      print('deleting file', item['Key'])
      client.delete_object(Bucket=bucketName, Key=item['Key'])
      while response['KeyCount'] == 1000:
        response = client.list_objects_v2(
         Bucket=S3_BUCKET,
         StartAfter=response['Contents'][0]['Key'],
       )
      for item in response['Contents']:
        print('deleting file', item['Key'])
        client.delete_object(Bucket=S3_BUCKET, Key=item['Key'])

def lambda_handler(event, context):
  empty_s3_bucket()
  return {
    'statusCode': 200,
    'body': json.dumps('Buckets cleared!')
  }

Ответы [ 2 ]

2 голосов
/ 18 июня 2019

В s3 нет таких понятий, как каталоги или файлы. Здесь все является объектом, поэтому не существует хорошего способа дифференциации. Вы можете подумать о реструктуризации вещей, хранящихся в корзине, поэтому одна корзина хранит объекты, которые на самом деле являются папками, а другая - файлы в корне. Или вы можете поместить файлы в определенную «папку» и удалять файлы только внутри нее.

Однако , В большинстве случаев каталог заканчивается на \ (для созданного в консоли или / для других), поэтому перед выполнением удаления необходимо добавить проверку if:

if item['Key'].endswith('\\') or  item['Key'].endswith('/'):
    # Omit deleting directory
    continue
else:
    print('deleting file', item['Key'])
    .....
1 голос
/ 18 июня 2019

Каталоги на самом деле не существуют в S3. Ключ типа "foo / bar / baz" заключается только в том, что "foo" и "bar" не существуют отдельно. Поэтому, если вам нужно сохранить «каталоги», вам нужно сохранить некоторые файлы с этими каталогами как часть их ключей.

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