Moesif AWS Lambda Middleware Ruby

Middleware (Ruby) to automatically log API calls from AWS Lambda functions and sends
and sends to Moesif for API analytics.
This middleware expects the
Lambda proxy integration type.
If you're using AWS Lambda with API Gateway, you are most likely using the proxy integration type.
How to install
bundle install moesif_aws_lambda
How to use
1. Wrap your original lambda handler with Moesif Middleware
def your_original_handler(event:, context:)
end
moesif_options = {
"application_id" => 'Your Moesif Application Id',
"debug" => true,
}
$moesif_middleware = Moesif::MoesifAwsMiddleware.new(method(:your_original_handler), moesif_options)
2. create a wrapped handler and set AWS lambda to use this.
def wrapped_handler(event:, context:)
$moesif_middleware.handle(event: event, context: context);
end
configure AWS Lambda handler to wrapped_handler
instead.
Configuration Options
application_id
Required. String. This is the Moesif application_id under settings
from your Moesif account.
api_version
Optional. String. Tag requests with the version of your API.
identify_user
Optional.
identify_user is a Proc that takes event, context, and lambda result as arguments and returns a user_id string. This helps us attribute requests to unique users. Even though Moesif can automatically retrieve the user_id without this, this is highly recommended to ensure accurate attribution.
event
and context
are original lambda input params, and result
is the return result from your own original lambda handler.
moesif_options['identify_user'] = Proc.new { |event, context, result|
'12345'
}
identify_company
Optional.
identify_company returns a company_id string. This helps us attribute requests to unique company.
moesif_options['identify_company'] = Proc.new { |event, context, result|
'67890'
}
identify_session
Optional. A Proc that takes env, headers, body and returns a string.
moesif_options['identify_session'] = Proc.new { |event, context, result|
'XXXXXXXXX'
}
get_metadata
Optional.
get_metadata is a Proc that takes env, headers, and body as arguments and returns a Hash that is
representation of a JSON object. This allows you to attach any
metadata to this event.
moesif_options['get_metadata'] = Proc.new { |event, context, result|
value = {
'datacenter' => 'westus',
'deployment_version' => 'v1.2.3'
}
value
}
mask_data
Optional. A Proc that takes event_model as an argument and returns event_model.
With mask_data, you can make modifications to headers or body of the event before it is sent to Moesif.
moesif_options['mask_data'] = Proc.new { |event_model|
event_model.response.body.password = nil
event_model
}
For details for the spec of moesif event model, please see the moesifapi-ruby or Moesif Ruby API Documentation
skip
Optional. A Proc that takes env, headers, body and returns a boolean.
moesif_options['skip'] = Proc.new { |event, context, result|
if event.key?("rawPath")
event["rawPath"].include? "/health"
else
false
end
}
debug
Optional. Boolean. Default false. If true, it will print out debug messages. In debug mode, the processing is not done in backend thread.
log_body
Optional. Boolean. Default true. If false, will not log request and response body to Moesif.
Additional Methods for Updating User and Company Profile
If you wish to update User or Company profile when needed using this SDK, you can also use below methods:
$moesif_middleware.update_user(user_profile)
$moesif_middleware.update_user_batch(user_profiles)
$moesif_middleware.update_company(company_profile)
$moesif_middleware.update_company_batch(company_profiles)
For details regarding shape of the profiles, please see the Moesif Ruby API Documentation
Notes Regarding Bundling Your Gem Files
For AWS lambda with ruby, you have to bundle the gem dependencies into the zip file.
https://docs.aws.amazon.com/lambda/latest/dg/ruby-package.html
In your ruby main file, you may have to specify where the dependencies are installed:
load_paths = Dir[
"./vendor/bundle/ruby/2.7.0/gems/**/lib"
]
$LOAD_PATH.unshift(*load_paths)
Example
example_handler.rb
is an example file that implement this.