ner
ner

Reputation: 711

Get information about a file uploaded to S3

i have created a lambda function that sends emails whenever a file is uploaded on s3 bucket, but now i want to have all the informations related to that file as the name, size, date and time of upload, and if it's possible where it comes from. I have all this infortmation on aws console, but want to have it in the email body.

i am using serverless framework. v 1.22.0

here is my code

import json
import boto3
import botocore
import logging
import sys
import os
import traceback


from botocore.exceptions import ClientError
from pprint import pprint
from time import strftime, gmtime

email_from = '********@*****.com'
email_to = '********@*****.com'
email_subject = 'new event on s3 '
email_body = 'a new file is uploaded'


#setup simple logging for INFO
logger = logging.getLogger()
logger.setLevel(logging.INFO)

from botocore.exceptions import ClientError

def sthree(event, context):
"""Send email whenever a file is uploaded to S3"""
body = {}
status_code = 200
email_body =  str(context)

try:
    s3 = boto3.client('s3')
    ses = boto3.client('ses')
    ses.send_email(Source = email_from,
                Destination = {'ToAddresses': [email_to,],}, 
                    Message = {'Subject': {'Data': email_subject}, 'Body':{'Text' : {'Data': email_body}}}
         )
except Exception as e:
    print(traceback.format_exc())
    status_code = 500
    body["message"] = json.dumps(e)

response = {
    "statusCode": 200,
    "body": json.dumps(body)
}

return response

Upvotes: 0

Views: 2058

Answers (2)

Santanu Sahoo
Santanu Sahoo

Reputation: 1157

def lambda_handler(event, context):
    s3 = boto3.client('s3')
    email_from = '[email protected]'
    email_to = '[email protected]'
    email_subject = 'new event on s3'
    email_body = "File Name :" + event[u'Records'][0][u's3'][u'object'][u'key'] + "\n" + "File Size :" + str(event[u'Records'][0][u's3'][u'object'][u'size']) + "\n" +  "Upload Time :" + event[u'Records'][0][u'eventTime'] + "\n" + "User Details :" + event[u'Records'][0][u'userIdentity'][u'principalId']
    ses = boto3.client('ses')
    ses.send_email(Source = email_from,
                Destination = {'ToAddresses': [email_to,],}, 
                    Message = {'Subject': {'Data': email_subject}, 'Body':{'Text' : {'Data': email_body}}}
         )
    print("Function execution Completed !!!")

Upvotes: 3

cy3er
cy3er

Reputation: 1699

Here is the event json structure sent by S3 upon object creation: http://docs.aws.amazon.com/AmazonS3/latest/dev/notification-content-structure.html

You can get the file names, sizes and source ip like this:

for record in event['Records']:
    filename = record['s3']['object']['key'];
    filesize = record['s3']['object']['size'];
    source = record['requestParameters']['sourceIPAddress'];
    eventTime = record['eventTime'];

Upvotes: 4

Related Questions