S3 Invoke Lambda Function to DynamoDB

Expanding on the SAM template examples starting with SQS I've added a very simple S3 trigger example that updates a DynamoDB table with the object name when a new object is added to the bucket.

S3/Lambda -> DynamoDB

The SAM template is as follows:

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Resources:
  MyS3TriggerFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: src/
      Handler: index.handler
      Runtime: nodejs14.x
      Timeout: 30
      Environment:
        Variables:
          DB_NAME: !Ref MyS3TriggerFunctionDynamoDB
      Policies: 
        - AWSLambdaExecute
        - AmazonDynamoDBFullAccess
      Events:
        MyS3TriggerFunctionEvent:
          Type: S3
          Properties:
            Bucket: !Ref MyS3TriggerFunctionBucket
            Events: s3:ObjectCreated:*
  MyS3TriggerFunctionBucket:
    Type: AWS::S3::Bucket
  MyS3TriggerFunctionDynamoDB:
    Type: AWS::Serverless::SimpleTable
    Properties:
      TableName: MyS3TriggerFunctionDynamoDB
      PrimaryKey:
        Name: id
        Type: String
      ProvisionedThroughput:
        ReadCapacityUnits: 1
        WriteCapacityUnits: 1

This template creates an S3 event type as defined here:

      Events:
        MyS3TriggerFunctionEvent:
          Type: S3
          Properties:
            Bucket: !Ref MyS3TriggerFunctionBucket
            Events: s3:ObjectCreated:*

The Lambda function code is below:

const aws = require('aws-sdk')
const uuid = require('uuid')

const DynamoDB = new aws.DynamoDB.DocumentClient({ region: "us-east-1" })

exports.handler = async (event) => {
    const key = event.Records[0].s3.object.key

    let params = {
        TableName: process.env.DB_NAME,
        Item: {
            id: uuid.v4(),
            image: key,
        }
    }    

    try {
        await DynamoDB.put(params).promise()
        console.log({"success": true, "msg": params})
    } catch (err) {
        console.log({"success": false, "msg": err.message})
    }
}

To create the AWS resources using the template run sam build. Once that completes run sam deploy --guided.

© Entuit Enterprise Solutions Inc., 2021