github.com/mweagle/Sparta@v1.15.0/archetype/kinesis.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 // KinesisReactor represents a lambda function that responds to Kinesis messages 15 type KinesisReactor interface { 16 // OnEvent when an SNS event occurs. Check the snsEvent field 17 // for the specific event 18 OnKinesisMessage(ctx context.Context, 19 kinesisEvent awsLambdaEvents.KinesisEvent) (interface{}, error) 20 } 21 22 // KinesisReactorFunc is a free function that adapts a KinesisReactor 23 // compliant signature into a function that exposes an OnEvent 24 // function 25 type KinesisReactorFunc func(ctx context.Context, 26 kinesisEvent awsLambdaEvents.KinesisEvent) (interface{}, error) 27 28 // OnKinesisMessage satisfies the KinesisReactor interface 29 func (reactorFunc KinesisReactorFunc) OnKinesisMessage(ctx context.Context, 30 kinesisEvent awsLambdaEvents.KinesisEvent) (interface{}, error) { 31 return reactorFunc(ctx, kinesisEvent) 32 } 33 34 // ReactorName provides the name of the reactor func 35 func (reactorFunc KinesisReactorFunc) ReactorName() string { 36 return runtime.FuncForPC(reflect.ValueOf(reactorFunc).Pointer()).Name() 37 } 38 39 // NewKinesisReactor returns an Kinesis reactor lambda function 40 func NewKinesisReactor(reactor KinesisReactor, 41 kinesisStream gocf.Stringable, 42 startingPosition string, 43 batchSize int64, 44 additionalLambdaPermissions []sparta.IAMRolePrivilege) (*sparta.LambdaAWSInfo, error) { 45 46 reactorLambda := func(ctx context.Context, kinesisEvent awsLambdaEvents.KinesisEvent) (interface{}, error) { 47 return reactor.OnKinesisMessage(ctx, kinesisEvent) 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: kinesisStream, 60 StartingPosition: startingPosition, 61 BatchSize: batchSize, 62 }) 63 if len(additionalLambdaPermissions) != 0 { 64 lambdaFn.RoleDefinition.Privileges = additionalLambdaPermissions 65 } 66 return lambdaFn, nil 67 }