Documentation ¶
Overview ¶
Package genericapi provides a generic Router for API style Lambda functions.
Index ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func Invoke ¶
func Invoke( client lambdaiface.LambdaAPI, function string, input, output interface{}) error
Invoke a Lambda function, taking care of error checking and json marshaling.
Arguments:
- client: initialized Lambda client
- function: function name (optionally qualified), e.g. "panther-rules-api"
- input: (pointer to struct) payload for Lambda function, processed via jsoniter.Marshal()
- output: (optional - pointer to struct) Lambda response is jsoniter.Unmarshal()ed here
- If nil, the Lambda response is ignored
Use a type assertion on the returned error to distinguish different error conditions:
- AWSError: lambda invocation failed (e.g. permission error)
- InternalError: json marshal/unmarshal failed
- LambdaError: lambda function returned an error, directly or indirectly (timeout, panic, etc)
Example:
client := lambda.New(session.Must(session.NewSession())) input := models.LambdaInput{AddRule: ...} var output models.AddRuleOutput err := Invoke(client, "panther-rules-api", &input, &output)
func ReplaceMapSliceNils ¶ added in v1.14.0
func ReplaceMapSliceNils(val interface{})
ReplaceMapSliceNils replaces nil slices and maps with initialized versions.
For example, struct{Tags []string} would serialize as "tags: []" instead of "tags: null" The input must be a pointer to a struct.
Types ¶
type AWSError ¶
type AWSError struct { Route string Method string // name of the function that triggered the exception (e.g. "dynamodb.PutItem") Err error // error returned by the AWS SDK }
AWSError is raised if an AWS API call (e.g. to Dynamo/S3) failed.
type AlreadyExistsError ¶
AlreadyExistsError is raised if the item being created already exists.
func (*AlreadyExistsError) Error ¶
func (e *AlreadyExistsError) Error() string
type DoesNotExistError ¶
DoesNotExistError is raised if the item being retrieved or modified does not exist.
func (*DoesNotExistError) Error ¶
func (e *DoesNotExistError) Error() string
type InUseError ¶
InUseError is raised if the item cannot be modified or deleted because it's in use.
func (*InUseError) Error ¶
func (e *InUseError) Error() string
type InternalError ¶
InternalError is raised if there is an internal inconsistency in the code.
For example, a failure marshaling a struct to JSON.
func (*InternalError) Error ¶
func (e *InternalError) Error() string
type InvalidInputError ¶
InvalidInputError is raised if the request is invalid.
For example, the request is missing an action or has invalid or missing fields. This is typically raised by the Validator, and indicates an error on the client side.
func (*InvalidInputError) Error ¶
func (e *InvalidInputError) Error() string
type LambdaError ¶
type LambdaError struct { // Route is the name of the API route if this error is ultimately returned by an API function. Route string // FunctionName is the qualified name of the function invoked (set by Invoke()). FunctionName string // ErrorMessage is always defined and contains the error string. ErrorMessage *string `json:"errorMessage"` // ErrorType is the name of the error class if applicable. // Some unhandled errors (e.g. task timed out) will not have an error type. // When panicking, the ErrorType is either "string" or the error type that caused the panic. ErrorType *string `json:"errorType"` // StackTrace is included only when the function panicked. StackTrace []*messages.InvokeResponse_Error_StackFrame `json:"stackTrace"` }
LambdaError wraps the error structure returned by a Golang Lambda function.
This applies to all errors - returned errors, panics, time outs, etc. This format is set by the AWS SDK: see messages.InvokeResponse_Error. (For some reason, the open-source Lambda SDK doesn't define a struct with the json tags that can be used to unmarshal the returned error.)
func (*LambdaError) Error ¶
func (e *LambdaError) Error() string
type Router ¶
type Router struct {
// contains filtered or unexported fields
}
Router is a generic API router for golang Lambda functions.
func NewRouter ¶
func NewRouter(namespace, component string, validate *validator.Validate, routes interface{}) *Router
NewRouter initializes a Router with the handler functions and validator.
validate is an optional custom validator routes is a struct pointer, whose receiver methods are handler functions (e.g. AddRule)
func (*Router) Handle ¶
Handle validates the Lambda input and invokes the appropriate handler.
For the sake of efficiency, no attempt is made to validate the routes or function signatures. As a result, this function will panic if a handler does not exist or is invalid. Be sure to VerifyHandlers as part of the unit tests for your function!
func (*Router) HandleWithContext ¶ added in v1.15.0
func (r *Router) HandleWithContext(ctx context.Context, input interface{}) (output interface{}, err error)
Handle validates the Lambda input and invokes the appropriate handler with a context.
For the sake of efficiency, no attempt is made to validate the routes or function signatures. As a result, this function will panic if a handler does not exist or is invalid. Be sure to VerifyHandlers as part of the unit tests for your function!
func (*Router) VerifyHandlers ¶
VerifyHandlers returns an error if the route handlers don't match the Lambda input struct.
This should be part of the unit tests for your Lambda function.