Boto3 + Python + AWS S3: как получить последний файл из папки внутри корзины - PullRequest
0 голосов
/ 19 апреля 2019

Я пытаюсь использовать функцию Lambda через шлюз API, чтобы получить файл из папки в S3 Bucket. Я хочу сделать это, чтобы импортировать последнюю версию CSV-файла в PowerBI / Tableau для анализа данных. Я могу сделать это, если я вставлю имя файла. однако, это, очевидно, не решает в последнем файле. Я хочу, чтобы код всегда брал последний файл в этой папке. Я планирую сделать это через атрибут Last Modified, а не через само имя файла.

мое ведро выглядит так ВЕДРО -Input -входной файл.csv -Выход -Output18042019.csv -Output19042019.csv

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

import json
import boto3
from datetime import datetime


def lambda_handler(event, context):
    # TODO implement
    get_last_modified = lambda obj: int(obj['LastModified'].strftime('%s'))

    client = boto3.client('s3')
    objs= client.list_objects_v2(Bucket='BUCKET')['Contents']
    last_added = [obj['Key'] for obj in sorted(objs, key=get_last_modified)][0]

    bucket='BUCKET'
    link = client.generate_presigned_url('get_object', {'Bucket': bucket, 'Key': last_added}, 7200, 'GET')
    return {
        "statusCode": 303,
        "headers": {'Location': link}
    }

Я получаю следующую ошибку:

Response:
{
  "stackTrace": [
    [
      "/var/task/lambda_function.py",
      11,
      "lambda_handler",
      "objs= client.list_objects_v2(Bucket='BUCKET')['Contents']"
    ],
    [
      "/var/runtime/botocore/client.py",
      314,
      "_api_call",
      "return self._make_api_call(operation_name, kwargs)"
    ],
    [
      "/var/runtime/botocore/client.py",
      612,
      "_make_api_call",
      "raise error_class(parsed_response, operation_name)"
    ]
  ],
  "errorType": "ClientError",
  "errorMessage": "An error occurred (AllAccessDisabled) when calling the ListObjectsV2 operation: All access to this object has been disabled"
}

Request ID:
"afd650be-4841-43cf-9cf4-731390bea1ce"

Function Logs:
START RequestId: afd650be-4841-43cf-9cf4-731390bea1ce Version: $LATEST
An error occurred (AllAccessDisabled) when calling the ListObjectsV2 operation: All access to this object has been disabled: ClientError
Traceback (most recent call last):
  File "/var/task/lambda_function.py", line 11, in lambda_handler
    objs= client.list_objects_v2(Bucket='BUCKET')['Contents']
  File "/var/runtime/botocore/client.py", line 314, in _api_call
    return self._make_api_call(operation_name, kwargs)
  File "/var/runtime/botocore/client.py", line 612, in _make_api_call
    raise error_class(parsed_response, operation_name)
ClientError: An error occurred (AllAccessDisabled) when calling the ListObjectsV2 operation: All access to this object has been disabled

END RequestId: afd650be-4841-43cf-9cf4-731390bea1ce
REPORT RequestId: afd650be-4841-43cf-9cf4-731390bea1ce  Duration: 2125.21 ms    Billed Duration: 2200 ms    Memory Size: 128 MB Max Memory Used: 58 MB  
...