github.com/mweagle/Sparta@v1.15.0/archetype/dynamodb.go (about)

     1  package archetype
     2  
     3  import (
     4  	"context"
     5  	"reflect"
     6  	"runtime"
     7  
     8  	awsLambdaEvents "github.com/aws/aws-lambda-go/events"
     9  	sparta "github.com/mweagle/Sparta"
    10  	gocf "github.com/mweagle/go-cloudformation"
    11  	"github.com/pkg/errors"
    12  )
    13  
    14  // DynamoDBReactor represents a lambda function that responds to Dynamo  messages
    15  type DynamoDBReactor interface {
    16  	// OnEvent when an SNS event occurs. Check the snsEvent field
    17  	// for the specific event
    18  	OnDynamoEvent(ctx context.Context,
    19  		dynamoEvent awsLambdaEvents.DynamoDBEvent) (interface{}, error)
    20  }
    21  
    22  // DynamoDBReactorFunc is a free function that adapts a DynamoDBReactor
    23  // compliant signature into a function that exposes an OnEvent
    24  // function
    25  type DynamoDBReactorFunc func(ctx context.Context,
    26  	dynamoEvent awsLambdaEvents.DynamoDBEvent) (interface{}, error)
    27  
    28  // OnDynamoEvent satisfies the DynamoDBReactor interface
    29  func (reactorFunc DynamoDBReactorFunc) OnDynamoEvent(ctx context.Context,
    30  	dynamoEvent awsLambdaEvents.DynamoDBEvent) (interface{}, error) {
    31  	return reactorFunc(ctx, dynamoEvent)
    32  }
    33  
    34  // ReactorName provides the name of the reactor func
    35  func (reactorFunc DynamoDBReactorFunc) ReactorName() string {
    36  	return runtime.FuncForPC(reflect.ValueOf(reactorFunc).Pointer()).Name()
    37  }
    38  
    39  // NewDynamoDBReactor returns an Kinesis reactor lambda function
    40  func NewDynamoDBReactor(reactor DynamoDBReactor,
    41  	dynamoDBARN gocf.Stringable,
    42  	startingPosition string,
    43  	batchSize int64,
    44  	additionalLambdaPermissions []sparta.IAMRolePrivilege) (*sparta.LambdaAWSInfo, error) {
    45  
    46  	reactorLambda := func(ctx context.Context, dynamoEvent awsLambdaEvents.DynamoDBEvent) (interface{}, error) {
    47  		return reactor.OnDynamoEvent(ctx, dynamoEvent)
    48  	}
    49  
    50  	lambdaFn, lambdaFnErr := sparta.NewAWSLambda(reactorName(reactor),
    51  		reactorLambda,
    52  		sparta.IAMRoleDefinition{})
    53  	if lambdaFnErr != nil {
    54  		return nil, errors.Wrapf(lambdaFnErr, "attempting to create reactor")
    55  	}
    56  
    57  	lambdaFn.EventSourceMappings = append(lambdaFn.EventSourceMappings,
    58  		&sparta.EventSourceMapping{
    59  			EventSourceArn:   dynamoDBARN,
    60  			StartingPosition: startingPosition,
    61  			BatchSize:        batchSize,
    62  		})
    63  	if len(additionalLambdaPermissions) != 0 {
    64  		lambdaFn.RoleDefinition.Privileges = additionalLambdaPermissions
    65  	}
    66  	return lambdaFn, nil
    67  }