I am very new to AWS services and has just a week worth of experience with serverless architecture, My requirement is to trigger an event when a new file is uploaded to a specific bucket, once the event trigger is set my Lambda should get the details of the latest file such as Name, Size, and Date of creation.
The source is uploading this file in a new folder every time and names the folder with the current date.
So far I am able to crack how to create my Lambda function and listen to the event trigger.
Here is my code.
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
here since I know that it's going to be today's date hence I am using datetime
to get the exact KEY but file-name will always be different. although I know that it's going to be a text file with .txt suffix, I am not able to get around on how to get the name of the latest uploaded file and other details from the trigger.
You have an event object, it contains a key "Records" that is a list.
You can filter the records for eventName 'ObjectCreated:Put' and then sort the list by key "eventTime" to get the latest event data.
def lambda_handler(event, context):
records = [x for x in event.get('Records', []) if x.get('eventName') == 'ObjectCreated:Put']
sorted_events = sorted(records, key=lambda e: e.get('eventTime'))
latest_event = sorted_events[-1] if sorted_events else {}
info = latest_event.get('s3', {})
file_key = info.get('object', {}).get('key')
bucket_name = info.get('bucket', {}).get('name')
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With