Serverless External S3 Event

Overcomes the CloudFormation limitation on attaching an event to an uncontrolled bucket, for Serverless.com 1.11.0+.

Deprecated use https://www.npmjs.com/package/serverless-plugin-existing-s3

Why?

Overcomes the CloudFormation limitation on attaching an event to an uncontrolled bucket, for Serverless.com 1.9+. See this stackoverflow issue for more information.

The serverless deploy command (sls deploy) will trigger a check to ensure the buckets already exist before deployment. Post successfull deployment, the bucket event will be attached.

The serverless remove command (sls remove) will remove the bucket event before removing the cloudformation stack

How?

1. NPM dependency Looking to eliminate this step, as it will place the dependency within your deployed code.

> npm install serverless-external-s3-event

Declare the plugin in your serverless.yml

plugins:
 - serverless-external-s3-event

2. Give your deploy permission to access the bucket. The BUCKET_NAME variable within provider.iamRoleStatements.Resource.Fn::Join needs to be replaced with the name of the bucket you want to attach your event(s) to. If there are multiple buckets you want to attach events to add a new item for each bucket.

provider:
  name: aws
  runtime: nodejs4.3
  iamRoleStatements:
    ...
    -  Effect: "Allow"
       Action:
         - "s3:PutBucketNotification"
       Resource:
         Fn::Join:
           - ""
           - - "arn:aws:s3:::BUCKET_NAME"
           - - "arn:aws:s3:::BUCKET_OTHERNAME"

3. Attach an event to your target function. Add an -existingS3 event definition under 'events' of your function declaration. The 'events' value is optional under your -existingS3 event and if omitted, it will default to a single entry for "s3:ObjectCreated:*".

The rules property is optional and can contain either a prefix, suffix or both of these properties as a rule for when the event will trigger.

Note: The bucketEvents and eventRules attributes introduced in 1.0.1 will still work, but will likely be deprecated in the future.

functions:
  someFunction:
    handler: index.handler
    timeout: 60
    events:
      - existingS3:
          bucket: BUCKET_NAME
          events:
            - s3:ObjectCreated:*
          rules:
            - prefix: images/
            - suffix: .jpg

Manually invoking the deploy command. To manually attach the event, you can run sls s3deploy. To manually remove the event, you can run sls s3remove.

> sls s3deploy
Attaching event(s) to: someFunction
Done.
view on Github

Latest commit b2f54ec on Sep 24, 2017

New to serverless?

To get started, pop open your terminal & run:

npm install serverless -g