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  }