Есть ли способ получить последнюю папку, если папки расположены как yyyy / mm / dd / hh в S3 - PullRequest
0 голосов
/ 11 июля 2020

У меня есть папки в ведре s3, структурированные как YYYY/MM/DD/HH/file.txt

Я использую лямбда-функцию, вход которой будет YYYY/MM/DD/HH, а функция лямбда вернет содержимое из файла.

Допустим, это допустимые папки (то есть в них есть file.txt):

  • 2018/12/30/12
  • 2018/12/30/17
  • 2018/12/30/21

Если бы я ввел 2018/12/30/15, я бы хотел, чтобы моя лямбда-функция распечатала файл из последней папки до того, как пользователь задал время , чтобы я получил файл из 2018/12/30/12.

Я попытался вернуться на 1 час назад и использовать s3.getObject(), чтобы проверить, существует ли этот файл.

Могу ли я узнать, как я могу использовать list_object() для достижения этой цели, поскольку указанный выше метод не является предпочтительным?

Я использую Lambda, boto3, python.

1 Ответ

0 голосов
/ 12 июля 2020

Во-первых, полезно отметить, что на самом деле в корзине нет подпапок. Ключевые имена объектов могут содержать косые черты, и консоль S3 выводит некоторую иерархию.

Модель данных Amazon S3 представляет собой плоскую структуру: вы создаете корзину, а в корзине хранятся объекты. Нет иерархии вложенных корзин или вложенных папок. Однако вы можете вывести логическую иерархию, используя префиксы и разделители ключевых имен, как это делает консоль Amazon S3. Консоль Amazon S3 поддерживает концепцию папок. https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingMetadata.html

Тем не менее, вы можете получить список всех ключей, а затем найти максимальный ключ, который меньше вашего целевого значения.

import json
import boto3

def lambda_handler(event, context):
    bucket_name = "your-bucket-name"
    # The max_key value is a parameter, but it's not clear 
    # how the Lambda will be called so I just hard-coded it.
    max_key = "2018/12/30/15"
    
    s3 = boto3.resource('s3')
    my_bucket = s3.Bucket(bucket_name)
    
    # Get the list of all items.  The default max is 1,000 so you may need
    # to do some paging if your bucket has more items than 1,000.
    all_items = my_bucket.objects.all()
    
    # Extract the actual key names into a list
    all_keys = [item.key for item in all_items]

    # Find the key that is the max() value less than the incoming key (max_key)
    golden_key = max([key for key in all_keys if key < max_key])
    
    result = f'The biggest key less than "{max_key}" is: "{golden_key}"'
    print(result)
    
    return {
        'statusCode': 200,
        'body': json.dumps(result)
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...