Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Notification of new S3 objects

I have a scenario where we have many clients uploading to s3.

  • What is the best approach to knowing that there is a new file?
  • Is it realistic/good idea, for me to poll the bucket ever few seconds?
like image 517
Quotient Avatar asked Nov 02 '11 18:11

Quotient


4 Answers

UPDATE:

Since November 2014, S3 supports the following event notifications:

  • s3:ObjectCreated:Put – An object was created by an HTTP PUT operation.
  • s3:ObjectCreated:Post – An object was created by HTTP POST operation.
  • s3:ObjectCreated:Copy – An object was created an S3 copy operation.
  • s3:ObjectCreated:CompleteMultipartUpload – An object was created by the completion of a S3 multi-part upload.
  • s3:ObjectCreated:* – An object was created by one of the event types listed above or by a similar object creation event added in the future.
  • s3:ReducedRedundancyObjectLost – An S3 object stored with Reduced Redundancy has been lost.

These notifications can be issued to Amazon SNS, SQS or Lambda. Check out the blog post that's linked in Alan's answer for more information on these new notifications.

Original Answer:

Although Amazon S3 has a bucket notifications system in place it does not support notifications for anything but the s3:ReducedRedundancyLostObject event (see the GET Bucket notification section in their API).

Currently the only way to check for new objects is to poll the bucket at a preset time interval or build your own notification logic in the upload clients (possibly based on Amazon SNS).

like image 57
dcro Avatar answered Oct 21 '22 08:10

dcro


Push notifications are now built into S3:

http://aws.amazon.com/blogs/aws/s3-event-notification/

You can send notifications to SQS or SNS when an object is created via PUT or POST or a multi-part upload is finished.

like image 21
Alan Illing Avatar answered Oct 21 '22 08:10

Alan Illing


Your best option nowadays is using the AWS Lambda service. You can write a Lambda using either node.js javascript, java or Python (probably more options will be added in time). The lambda service allows you to write functions that respond to events from S3 such as file upload. Cost effective, scalable and easy to use.

like image 3
Oren Avatar answered Oct 21 '22 09:10

Oren


You can implement a pub-sub mechanism relatively simply by using SNS, SQS, and AWS Lambda. Please see the below steps. So, whenever a new file is added to the bucket a notification can be raised and acted upon that (everything is automated)

Please see attached diagram explaining the basic pub-sub mechanism

S3-SNS-SQS-AWS Lambda pub-sub

Step 1

Simply configure the S3 bucket event notification to notify an SNS topic. You can do this from the S3 console (Properties tab)

Step 2

Make an SQS Queue subscribed to this topic. So whenever an object is uploaded to the S3 bucket a message will be added to the queue.

Step 3

Create an AWS Lambda function to read messages from the SQS queue. AWS Lambda supports SQS events as a trigger. Therefore, whenever a message appears in the SQS queue, Lambda will trigger and read the message. Once successfully read the message it will be automatically deleted from the queue. For the messages that can't be processed by Lambda (erroneous messages) will not be deleted. So those messages will pile up in the queue. To prevent this behavior using a Dead Letter Queue (DLQ) is a good idea.

In your Lambda function, add your logic to handle what to do when users upload files to the bucket

Note: DLQ is nothing more than a normal queue.

Step 4

Debugging and analyzing the process

Make use of AWS Cloud watch to log details. Each Lambda function creates a log under log groups. This is a good place to check if something went wrong.

like image 1
oshan2csd Avatar answered Oct 21 '22 08:10

oshan2csd