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 }