web-dev-qa-db-ja.com

イベントトリガーラムダを使用してS3バケットから最新のファイル名またはファイルを取得する方法

私はAWSサービスに非常に慣れておらず、サーバーレスアーキテクチャの経験はわずか1週間です。私の要件は、新しいファイルが特定のバケットにアップロードされたときにイベントをトリガーすることです。イベントトリガーが設定されると、Lambdaは次の詳細を取得する必要があります。名前、サイズ、作成日などの最新のファイル。

ソースはこのファイルを毎回新しいフォルダーにアップロードし、フォルダーに現在の日付の名前を付けます。

これまでのところ、Lambda関数を作成し、イベントトリガーをリッスンする方法を解読することができます。

これが私のコードです。

import boto3
import botocore
import datetime
import logging

def lambda_handler(event, context):
    logging.info('Start function')
    s3 = boto3.resource('s3')
    DATE = datetime.datetime.today().strftime('%Y-%m-%d')
    BUCKET_NAME = 'monkey-banana-dev'
    KEY = '/banana/incoming/daily/{}'.format(DATE)
    logging.info('Getting file from {}'.format(KEY))
    try:
        s3.Bucket(BUCKET_NAME).download_file(KEY, 'name_of_my_file')
    except botocore.exceptions.ClientError as e:
        if e.response['Error']['Code'] == "404":
            print("The object does not exist.")
        else:
            raise

ここでは、今日の日付になることがわかっているので、datetimeを使用して正確なKEYを取得していますが、ファイル名は常に異なります。 .txtサフィックスが付いたテキストファイルになることはわかっていますが、最新のアップロードファイルの名前やその他の詳細をトリガーから取得する方法を回避できません。

4
Shek

「キー」にはファイルパス全体が含まれます。例-

import boto3
import os
s3 = boto3.resource('s3')
bucket=s3.Bucket('hcss-heavyjob-raw-tables')
for key in bucket.objects.all():
    if key.key.startswith('heavyjob/EMPMAST'):
           print(key.key)'

出力-

ヘビージョブ/EMPMAST/20190524-165352044.csv

ヘビージョブ/EMPMAST/20190529-153011532.csv

ヘビージョブ/EMPMAST/LOAD00000001.csv

key.keyまたはでbasenameを使用して、ファイル名を取得できます。

head,tail = os.path.split(key.key)
print(tail)
1