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:)
# your code
end
moesif_options = {
# application_id is required
"application_id" => 'Your Moesif Application Id',
"debug" => true,
# see list of other options below.
}
# create moesif_middleware object.
$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|
# Add your custom code that returns a string for user id
'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|
# Add your custom code that returns a string for company id
'67890'
}
identify_session
Optional. A Proc that takes env, headers, body and returns a string.
moesif_options['identify_session'] = Proc.new { |event, context, result|
# Add your custom code that returns a string for session/API token
'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|
# Add your custom code that returns a dictionary
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|
# Add your custom code that returns a event_model after modifying any fields
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|
# Add your custom code that returns true to skip logging the API call
if event.key?("rawPath")
# Skip probes to health page
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.