lib/addy_lambda/aws.rb in addy_lambda-0.1.0 vs lib/addy_lambda/aws.rb in addy_lambda-0.1.1

- old
+ new

@@ -1,16 +1,89 @@ # frozen_string_literal: true +require 'aws-sdk-lambda' + module AddyLambda + class JwtIssuers + ADDY = 0 + end + + class JwtAudiences + GENERIC = 0 + PDF_ANNOTATE = 1 + SUBSCRIPTION = 2 + end + + JWT_AUDIENCES = %w[generic pdf_annotate subscription].freeze + JWT_ISSUERS = ['addy'].freeze # Common functionality for AWS related activities class AWS # ssm_client = Aws::SSM::Client.new def self.get_ssm_value(ssm_client, path) request = { name: path, with_decryption: true } response = ssm_client.get_parameter(request) response.parameter.value + end + + def self.invoke_lambda(lambda_client, function_name, payload, syncronous: true) + resp = lambda_client.invoke({ + function_name: function_name, + invocation_type: syncronous ? 'RequestResponse' : 'Event', + payload: payload.to_json + }) + AddyLambda::Common.valid_json?(resp.payload.string) ? JSON.parse(resp.payload.string) : resp.payload.string + end + + # Lambda client can be obtained by running: lambda_client = Aws::Lambda::Client.new + def self.post_slack_message(lambda_client, channel, message, emoji = ':tada', unfurl_links: false) + input_params = { + 'user' => 'Signature Request', + 'channel' => channel, + 'message' => message, + 'emoji' => emoji, + 'unfurl_links' => unfurl_links + } + response_body = AddyLambda::AWS.invoke_lambda(lambda_client, 'slack-client', input_params) + return response_body unless response_body.key?('error') + + logger.error(response_body['error']) + end + + def self.send_email(lambda_client, recipient_emails, from_name, from_email, subject, content_html) + input_params = { + 'recipient_list' => recipient_emails, + 'from_name' => from_name, + 'from_email' => from_email, + 'subject' => subject, + 'content_html' => content_html + } + + response_body = AddyLambda::AWS.invoke_lambda(lambda_client, 'mailgun-client', input_params) + return response_body unless response_body.key?('error') + + logger.error(response_body['error']) + end + + # NOTE: issuer AddyLambda::JwtIssuers::..., Audience AddyLambda::JwtAudiences::... + def self.generate_jwt(lambda_client, issuer, audience, expire, payload) + lambda_payload = { + 'issuer' => JWT_ISSUERS[issuer], + 'audience' => JWT_AUDIENCES[audience], + 'expire' => expire, + 'payload' => payload + } + jwt_response = AddyLambda::AWS.invoke_lambda(lambda_client, 'jwt-generate', lambda_payload) + jwt_response.key?('jwt') ? jwt_response['jwt'] : jwt_response + end + + def self.validate_jwt(lambda_client, jwt) + lambda_payload = { + 'jwt' => jwt + } + response = AddyLambda::AWS.invoke_lambda(lambda_client, 'jwt-validate', lambda_payload) + response['statusCode'] == 200 ? JSON.parse(response['body']) : response end end end