-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | Deploying Haskell code onto AWS Lambda using Serverless -- -- Utilities to help process the events from AWS Lambda when deployed -- with the serverless-haskell plugin. @package serverless-haskell @version 0.12.4 module AWSLambda.Events.MessageAttribute data MessageAttribute MessageAttribute :: !Text -> !Text -> MessageAttribute [_maType] :: MessageAttribute -> !Text [_maValue] :: MessageAttribute -> !Text maValue :: Lens' MessageAttribute Text maType :: Lens' MessageAttribute Text instance Data.Aeson.Types.FromJSON.FromJSON AWSLambda.Events.MessageAttribute.MessageAttribute instance GHC.Show.Show AWSLambda.Events.MessageAttribute.MessageAttribute instance GHC.Classes.Eq AWSLambda.Events.MessageAttribute.MessageAttribute -- | Entry point for AWS Lambda handlers deployed with -- serverless-haskell plugin. module AWSLambda.Handler -- | Process incoming events from serverless-haskell using a -- provided function. -- -- The handler receives the input event given to the AWS Lambda function, -- and its return value is returned from the function. -- -- This is intended to be used as main, for example: -- --
-- import qualified Data.Aeson as Aeson -- -- import AWSLambda -- -- main = lambdaMain handler -- -- handler :: Aeson.Value -> IO [Int] -- handler evt = do -- putStrLn "This should go to logs" -- print evt -- pure [1, 2, 3] ---- -- The handler function can receive arbitrary JSON values from custom -- invocations, or one of the events from the AWSLambda.Events -- module, such as S3Event: -- --
-- import AWSLambda.Events.S3Event -- -- handler :: S3Event -> IO () -- handler evt = do -- print $ records evt ---- -- If the Lambda function needs to process several types of events, use -- Alternative to combine several handlers: -- --
-- import AWSLambda -- import AWSLambda.Events.S3Event -- import Data.Aeson -- import Data.Aeson.Alternative -- -- main = lambdaMain $ handlerS3 `alternative` handlerCustom -- -- handlerS3 :: S3Event -> IO () -- handlerS3 = _ -- -- handlerCustom :: Value -> IO () -- handlerCustom = _ ---- -- When run outside the AWS Lambda environment, the input is read as JSON -- from the command line, and the result of the execution is printed, -- also as JSON, to the standard output. lambdaMain :: (FromJSON event, ToJSON res, MonadCatch m, MonadIO m) => (event -> m res) -> m () -- | Process the incoming requests (using the AWS Lambda runtime interface -- or from the standard input). Also set line buffering on standard -- output for AWS Lambda so the logs are output in a timely manner. This -- function provides a lower level interface than lambdaMain for -- users who don't want to use Aeson for encoding and decoding JSON. lambdaMainRaw :: (MonadCatch m, MonadIO m) => (ByteString -> m ByteString) -> m () module AWSLambda.Events.Records newtype RecordsEvent a RecordsEvent :: [a] -> RecordsEvent a [_reRecords] :: RecordsEvent a -> [a] reRecords :: forall a_auBF a_avxL. Iso (RecordsEvent a_auBF) (RecordsEvent a_avxL) [a_auBF] [a_avxL] -- | Traverse all the records in a Lambda event traverseRecords :: Applicative m => (a -> m ()) -> RecordsEvent a -> m () -- | A specialised version of the lambdaMain entry-point for -- handling individual records in a Lambda event recordsMain :: (FromJSON a, MonadCatch m, MonadIO m) => (a -> m ()) -> m () instance Data.Foldable.Foldable AWSLambda.Events.Records.RecordsEvent instance GHC.Base.Functor AWSLambda.Events.Records.RecordsEvent instance GHC.Show.Show a => GHC.Show.Show (AWSLambda.Events.Records.RecordsEvent a) instance GHC.Classes.Eq a => GHC.Classes.Eq (AWSLambda.Events.Records.RecordsEvent a) instance Data.Aeson.Types.FromJSON.FromJSON a => Data.Aeson.Types.FromJSON.FromJSON (AWSLambda.Events.Records.RecordsEvent a) -- | Based on -- https://github.com/aws/aws-lambda-dotnet/tree/master/Libraries/src/Amazon.Lambda.KinesisEvents module AWSLambda.Events.KinesisEvent data KinesisRecord KinesisRecord :: !Record -> !Text -> KinesisRecord [_krRecord] :: KinesisRecord -> !Record [_krKinesisSchemaVersion] :: KinesisRecord -> !Text krRecord :: Lens' KinesisRecord Record krKinesisSchemaVersion :: Lens' KinesisRecord Text data KinesisEventRecord KinesisEventRecord :: !KinesisRecord -> !Text -> !Text -> !Text -> !Text -> !Text -> !Text -> !Region -> KinesisEventRecord [_kerKinesis] :: KinesisEventRecord -> !KinesisRecord [_kerEventSource] :: KinesisEventRecord -> !Text [_kerEventID] :: KinesisEventRecord -> !Text [_kerInvokeIdentityArn] :: KinesisEventRecord -> !Text [_kerEventVersion] :: KinesisEventRecord -> !Text [_kerEventName] :: KinesisEventRecord -> !Text [_kerEventSourceARN] :: KinesisEventRecord -> !Text [_kerAwsRegion] :: KinesisEventRecord -> !Region kerKinesis :: Lens' KinesisEventRecord KinesisRecord kerInvokeIdentityArn :: Lens' KinesisEventRecord Text kerEventVersion :: Lens' KinesisEventRecord Text kerEventSourceARN :: Lens' KinesisEventRecord Text kerEventSource :: Lens' KinesisEventRecord Text kerEventName :: Lens' KinesisEventRecord Text kerEventID :: Lens' KinesisEventRecord Text kerAwsRegion :: Lens' KinesisEventRecord Region type KinesisEvent = RecordsEvent KinesisEventRecord instance Data.Aeson.Types.FromJSON.FromJSON AWSLambda.Events.KinesisEvent.KinesisEventRecord instance GHC.Show.Show AWSLambda.Events.KinesisEvent.KinesisEventRecord instance GHC.Classes.Eq AWSLambda.Events.KinesisEvent.KinesisEventRecord instance GHC.Show.Show AWSLambda.Events.KinesisEvent.KinesisRecord instance GHC.Classes.Eq AWSLambda.Events.KinesisEvent.KinesisRecord instance Data.Aeson.Types.FromJSON.FromJSON AWSLambda.Events.KinesisEvent.KinesisRecord module AWSLambda.Orphans instance Data.Aeson.Types.FromJSON.FromJSON Network.AWS.S3.Internal.ObjectKey instance Data.Aeson.Types.FromJSON.FromJSON Network.AWS.S3.Internal.ObjectVersionId instance Data.Aeson.Types.FromJSON.FromJSON Network.AWS.S3.Internal.ETag instance Data.Aeson.Types.FromJSON.FromJSON Network.AWS.S3.Types.Sum.Event -- | Based on -- https://github.com/aws/aws-lambda-dotnet/tree/master/Libraries/src/Amazon.Lambda.S3Events module AWSLambda.Events.S3Event newtype UserIdentityEntity UserIdentityEntity :: Text -> UserIdentityEntity [_uiePrincipalId] :: UserIdentityEntity -> Text uiePrincipalId :: Iso' UserIdentityEntity Text data S3BucketEntity S3BucketEntity :: !Text -> !BucketName -> !UserIdentityEntity -> S3BucketEntity [_sbeArn] :: S3BucketEntity -> !Text [_sbeName] :: S3BucketEntity -> !BucketName [_sbeOwnerIdentity] :: S3BucketEntity -> !UserIdentityEntity sbeOwnerIdentity :: Lens' S3BucketEntity UserIdentityEntity sbeName :: Lens' S3BucketEntity BucketName sbeArn :: Lens' S3BucketEntity Text data S3ObjectEntity S3ObjectEntity :: !Maybe ETag -> !ObjectKey -> !Maybe Integer -> !Text -> !Maybe ObjectVersionId -> S3ObjectEntity [_soeETag] :: S3ObjectEntity -> !Maybe ETag [_soeKey] :: S3ObjectEntity -> !ObjectKey [_soeSize] :: S3ObjectEntity -> !Maybe Integer [_soeSequencer] :: S3ObjectEntity -> !Text [_soeVersionId] :: S3ObjectEntity -> !Maybe ObjectVersionId soeVersionId :: Lens' S3ObjectEntity (Maybe ObjectVersionId) soeSize :: Lens' S3ObjectEntity (Maybe Integer) soeSequencer :: Lens' S3ObjectEntity Text soeKey :: Lens' S3ObjectEntity ObjectKey soeETag :: Lens' S3ObjectEntity (Maybe ETag) newtype RequestParametersEntity RequestParametersEntity :: Text -> RequestParametersEntity [_rpeSourceIPAddress] :: RequestParametersEntity -> Text rpeSourceIPAddress :: Iso' RequestParametersEntity Text data ResponseElementsEntity ResponseElementsEntity :: !Text -> !Text -> ResponseElementsEntity [_reeXAmzId2] :: ResponseElementsEntity -> !Text [_reeXAmzRequestId] :: ResponseElementsEntity -> !Text reeXAmzRequestId :: Lens' ResponseElementsEntity Text reeXAmzId2 :: Lens' ResponseElementsEntity Text data S3Entity S3Entity :: !S3BucketEntity -> !Text -> !S3ObjectEntity -> !Text -> S3Entity [_seBucket] :: S3Entity -> !S3BucketEntity [_seConfigurationId] :: S3Entity -> !Text [_seObject] :: S3Entity -> !S3ObjectEntity [_seS3SchemaVersion] :: S3Entity -> !Text seS3SchemaVersion :: Lens' S3Entity Text seObject :: Lens' S3Entity S3ObjectEntity seConfigurationId :: Lens' S3Entity Text seBucket :: Lens' S3Entity S3BucketEntity data S3EventNotification S3EventNotification :: !Region -> !Event -> !Text -> !UTCTime -> !Text -> !RequestParametersEntity -> !ResponseElementsEntity -> !S3Entity -> !UserIdentityEntity -> S3EventNotification [_senAwsRegion] :: S3EventNotification -> !Region [_senEventName] :: S3EventNotification -> !Event [_senEventSource] :: S3EventNotification -> !Text [_senEventTime] :: S3EventNotification -> !UTCTime [_senEventVersion] :: S3EventNotification -> !Text [_senRequestParameters] :: S3EventNotification -> !RequestParametersEntity [_senResponseElements] :: S3EventNotification -> !ResponseElementsEntity [_senS3] :: S3EventNotification -> !S3Entity [_senUserIdentity] :: S3EventNotification -> !UserIdentityEntity senUserIdentity :: Lens' S3EventNotification UserIdentityEntity senS3 :: Lens' S3EventNotification S3Entity senResponseElements :: Lens' S3EventNotification ResponseElementsEntity senRequestParameters :: Lens' S3EventNotification RequestParametersEntity senEventVersion :: Lens' S3EventNotification Text senEventTime :: Lens' S3EventNotification UTCTime senEventSource :: Lens' S3EventNotification Text senEventName :: Lens' S3EventNotification Event senAwsRegion :: Lens' S3EventNotification Region type S3Event = RecordsEvent S3EventNotification -- | Is the event an object creation event isCreateEvent :: S3EventNotification -> Bool -- | Is the event an object removal event isRemoveEvent :: S3EventNotification -> Bool instance GHC.Show.Show AWSLambda.Events.S3Event.S3EventNotification instance GHC.Classes.Eq AWSLambda.Events.S3Event.S3EventNotification instance Data.Aeson.Types.FromJSON.FromJSON AWSLambda.Events.S3Event.S3EventNotification instance Data.Aeson.Types.FromJSON.FromJSON AWSLambda.Events.S3Event.S3Entity instance GHC.Show.Show AWSLambda.Events.S3Event.S3Entity instance GHC.Classes.Eq AWSLambda.Events.S3Event.S3Entity instance GHC.Show.Show AWSLambda.Events.S3Event.ResponseElementsEntity instance GHC.Classes.Eq AWSLambda.Events.S3Event.ResponseElementsEntity instance Data.Aeson.Types.FromJSON.FromJSON AWSLambda.Events.S3Event.ResponseElementsEntity instance Data.Aeson.Types.FromJSON.FromJSON AWSLambda.Events.S3Event.RequestParametersEntity instance GHC.Show.Show AWSLambda.Events.S3Event.RequestParametersEntity instance GHC.Classes.Eq AWSLambda.Events.S3Event.RequestParametersEntity instance Data.Aeson.Types.FromJSON.FromJSON AWSLambda.Events.S3Event.S3ObjectEntity instance GHC.Show.Show AWSLambda.Events.S3Event.S3ObjectEntity instance GHC.Classes.Eq AWSLambda.Events.S3Event.S3ObjectEntity instance Data.Aeson.Types.FromJSON.FromJSON AWSLambda.Events.S3Event.S3BucketEntity instance GHC.Show.Show AWSLambda.Events.S3Event.S3BucketEntity instance GHC.Classes.Eq AWSLambda.Events.S3Event.S3BucketEntity instance Data.Aeson.Types.FromJSON.FromJSON AWSLambda.Events.S3Event.UserIdentityEntity instance GHC.Show.Show AWSLambda.Events.S3Event.UserIdentityEntity instance GHC.Classes.Eq AWSLambda.Events.S3Event.UserIdentityEntity -- | Utilities for decoding JSON into one of the possible types and -- handling the resulting sum type. module Data.Aeson.Alternative -- | One of the two values that has been parsed from JSON data AlternativeJSON a b -- | Handle either of the two types that have been parsed from JSON alternative :: (a -> r) -> (b -> r) -> AlternativeJSON a b -> r instance (GHC.Show.Show a, GHC.Show.Show b) => GHC.Show.Show (Data.Aeson.Alternative.AlternativeJSON a b) instance (GHC.Classes.Ord a, GHC.Classes.Ord b) => GHC.Classes.Ord (Data.Aeson.Alternative.AlternativeJSON a b) instance (GHC.Classes.Eq a, GHC.Classes.Eq b) => GHC.Classes.Eq (Data.Aeson.Alternative.AlternativeJSON a b) instance (Data.Aeson.Types.FromJSON.FromJSON a, Data.Aeson.Types.FromJSON.FromJSON b) => Data.Aeson.Types.FromJSON.FromJSON (Data.Aeson.Alternative.AlternativeJSON a b) module Data.Aeson.Embedded -- | Type for a JSON value embedded within a JSON string value newtype Embedded a Embedded :: a -> Embedded a [_unEmbed] :: Embedded a -> a unEmbed :: forall a_aHiU a_aHqk. Iso (Embedded a_aHiU) (Embedded a_aHqk) a_aHiU a_aHqk instance GHC.Show.Show a => GHC.Show.Show (Data.Aeson.Embedded.Embedded a) instance GHC.Classes.Eq a => GHC.Classes.Eq (Data.Aeson.Embedded.Embedded a) instance Data.Aeson.Types.FromJSON.FromJSON a => Network.AWS.Data.Text.FromText (Data.Aeson.Embedded.Embedded a) instance Data.Aeson.Types.FromJSON.FromJSON a => Data.Aeson.Types.FromJSON.FromJSON (Data.Aeson.Embedded.Embedded a) instance Data.Aeson.Types.ToJSON.ToJSON a => Network.AWS.Data.Text.ToText (Data.Aeson.Embedded.Embedded a) instance Data.Aeson.Types.ToJSON.ToJSON a => Data.Aeson.Types.ToJSON.ToJSON (Data.Aeson.Embedded.Embedded a) -- | Provides FromJSON and ToJSON instances for anything -- that has FromText and ToText instances, e.g. -- TextValue Text, (FromJSON a, ToJSON a) => TextValue -- (Embedded a), TextValue Base64 module Data.Aeson.TextValue newtype TextValue a TextValue :: a -> TextValue a [_unTextValue] :: TextValue a -> a unTextValue :: forall a_aHXW a_aI3y. Iso (TextValue a_aHXW) (TextValue a_aI3y) a_aHXW a_aI3y instance Data.String.IsString a => Data.String.IsString (Data.Aeson.TextValue.TextValue a) instance GHC.Show.Show a => GHC.Show.Show (Data.Aeson.TextValue.TextValue a) instance GHC.Classes.Eq a => GHC.Classes.Eq (Data.Aeson.TextValue.TextValue a) instance Network.AWS.Data.Text.FromText a => Data.Aeson.Types.FromJSON.FromJSON (Data.Aeson.TextValue.TextValue a) instance Network.AWS.Data.Text.ToText a => Data.Aeson.Types.ToJSON.ToJSON (Data.Aeson.TextValue.TextValue a) module AWSLambda.Events.SQSEvent data SQSMessage body SQSMessage :: !Text -> !Text -> !TextValue body -> !HashMap Text Text -> !HashMap Text MessageAttribute -> !Text -> !Text -> !Text -> !Region -> SQSMessage body [_sqsmMessageId] :: SQSMessage body -> !Text [_sqsmReceiptHandle] :: SQSMessage body -> !Text [_sqsmBody] :: SQSMessage body -> !TextValue body [_sqsmAttributes] :: SQSMessage body -> !HashMap Text Text [_sqsmMessageAttributes] :: SQSMessage body -> !HashMap Text MessageAttribute [_sqsmMd5OfBody] :: SQSMessage body -> !Text [_sqsmEventSource] :: SQSMessage body -> !Text [_sqsmEventSourceARN] :: SQSMessage body -> !Text [_sqsmAwsRegion] :: SQSMessage body -> !Region sqsmReceiptHandle :: forall body_aIvW. Lens' (SQSMessage body_aIvW) Text sqsmMessageId :: forall body_aIvW. Lens' (SQSMessage body_aIvW) Text sqsmMessageAttributes :: forall body_aIvW. Lens' (SQSMessage body_aIvW) (HashMap Text MessageAttribute) sqsmMd5OfBody :: forall body_aIvW. Lens' (SQSMessage body_aIvW) Text sqsmEventSourceARN :: forall body_aIvW. Lens' (SQSMessage body_aIvW) Text sqsmEventSource :: forall body_aIvW. Lens' (SQSMessage body_aIvW) Text sqsmBody :: forall body_aIvW body_aJJp. Lens (SQSMessage body_aIvW) (SQSMessage body_aJJp) (TextValue body_aIvW) (TextValue body_aJJp) sqsmAwsRegion :: forall body_aIvW. Lens' (SQSMessage body_aIvW) Region sqsmAttributes :: forall body_aIvW. Lens' (SQSMessage body_aIvW) (HashMap Text Text) type SQSEvent body = RecordsEvent (SQSMessage body) -- | A Traversal to get messages from an SQSEvent sqsMessages :: Traversal (SQSEvent message) (SQSEvent message') message message' -- | A Traversal to get embedded JSON values from an SQSEvent sqsEmbedded :: Traversal (SQSEvent (Embedded v)) (SQSEvent (Embedded v')) v v' sqsBinary :: Traversal' (SQSEvent Base64) ByteString -- | Traverse all the messages in an SQS event traverseSqs :: (FromJSON a, Applicative m) => (a -> m ()) -> SQSEvent (Embedded a) -> m () -- | A specialised version of the lambdaMain entry-point for -- handling individual SQS messages sqsMain :: (FromJSON a, MonadCatch m, MonadIO m) => (a -> m ()) -> m () instance GHC.Generics.Generic (AWSLambda.Events.SQSEvent.SQSMessage body) instance GHC.Classes.Eq body => GHC.Classes.Eq (AWSLambda.Events.SQSEvent.SQSMessage body) instance GHC.Show.Show body => GHC.Show.Show (AWSLambda.Events.SQSEvent.SQSMessage body) instance Network.AWS.Data.Text.FromText message => Data.Aeson.Types.FromJSON.FromJSON (AWSLambda.Events.SQSEvent.SQSMessage message) -- | Based on -- https://github.com/aws/aws-lambda-dotnet/tree/master/Libraries/src/Amazon.Lambda.SNSEvents module AWSLambda.Events.SNSEvent data SNSMessage message SNSMessage :: !TextValue message -> !HashMap Text MessageAttribute -> !Text -> !Text -> !Text -> !Text -> !Text -> !UTCTime -> !Text -> !Text -> !Text -> SNSMessage message [_smMessage] :: SNSMessage message -> !TextValue message [_smMessageAttributes] :: SNSMessage message -> !HashMap Text MessageAttribute [_smMessageId] :: SNSMessage message -> !Text [_smSignature] :: SNSMessage message -> !Text [_smSignatureVersion] :: SNSMessage message -> !Text [_smSigningCertUrl] :: SNSMessage message -> !Text [_smSubject] :: SNSMessage message -> !Text [_smTimestamp] :: SNSMessage message -> !UTCTime [_smTopicArn] :: SNSMessage message -> !Text [_smType] :: SNSMessage message -> !Text [_smUnsubscribeUrl] :: SNSMessage message -> !Text smUnsubscribeUrl :: forall message_aML3. Lens' (SNSMessage message_aML3) Text smType :: forall message_aML3. Lens' (SNSMessage message_aML3) Text smTopicArn :: forall message_aML3. Lens' (SNSMessage message_aML3) Text smTimestamp :: forall message_aML3. Lens' (SNSMessage message_aML3) UTCTime smSubject :: forall message_aML3. Lens' (SNSMessage message_aML3) Text smSigningCertUrl :: forall message_aML3. Lens' (SNSMessage message_aML3) Text smSignatureVersion :: forall message_aML3. Lens' (SNSMessage message_aML3) Text smSignature :: forall message_aML3. Lens' (SNSMessage message_aML3) Text smMessageId :: forall message_aML3. Lens' (SNSMessage message_aML3) Text smMessageAttributes :: forall message_aML3. Lens' (SNSMessage message_aML3) (HashMap Text MessageAttribute) smMessage :: forall message_aML3 message_aMZu. Lens (SNSMessage message_aML3) (SNSMessage message_aMZu) (TextValue message_aML3) (TextValue message_aMZu) data SNSRecord message SNSRecord :: !Text -> !Text -> !Text -> !SNSMessage message -> SNSRecord message [_srEventVersion] :: SNSRecord message -> !Text [_srEventSubscriptionArn] :: SNSRecord message -> !Text [_srEventSource] :: SNSRecord message -> !Text [_srSns] :: SNSRecord message -> !SNSMessage message srSns :: forall message_aN25 message_aNdz. Lens (SNSRecord message_aN25) (SNSRecord message_aNdz) (SNSMessage message_aN25) (SNSMessage message_aNdz) srEventVersion :: forall message_aN25. Lens' (SNSRecord message_aN25) Text srEventSubscriptionArn :: forall message_aN25. Lens' (SNSRecord message_aN25) Text srEventSource :: forall message_aN25. Lens' (SNSRecord message_aN25) Text -- | SNSEvent. The message type is parameterised. To treat it as a -- text value use SNSEvent Text. To extract an embedded event -- object use the Embedded type. E.g. SNSEvent (Embedded -- S3Event) will treat the message as an embedded S3Event. To -- extract embedded Base64 encoded binary use SNSEvent Base64 type SNSEvent message = RecordsEvent (SNSRecord message) -- | A Traversal to get messages from an SNSEvent messages :: Traversal (SNSEvent message) (SNSEvent message') message message' -- | A Traversal to get embedded JSON values from an SNSEvent embedded :: Traversal (SNSEvent (Embedded v)) (SNSEvent (Embedded v')) v v' binary :: Traversal' (SNSEvent Base64) ByteString -- | Traverse an SNS message traverseSnsMessage :: (FromJSON a, Applicative m) => (a -> m ()) -> SNSMessage (Embedded a) -> m () -- | Traverse all the messages in an SNS event traverseSns :: (FromJSON a, Applicative m) => (a -> m ()) -> SNSEvent (Embedded a) -> m () -- | A specialed version of the lambdaMain entry-point for handling -- individual SNS messages snsMain :: (FromJSON a, MonadCatch m, MonadIO m) => (a -> m ()) -> m () instance GHC.Generics.Generic (AWSLambda.Events.SNSEvent.SNSRecord message) instance GHC.Show.Show message => GHC.Show.Show (AWSLambda.Events.SNSEvent.SNSRecord message) instance GHC.Classes.Eq message => GHC.Classes.Eq (AWSLambda.Events.SNSEvent.SNSRecord message) instance Network.AWS.Data.Text.FromText message => Data.Aeson.Types.FromJSON.FromJSON (AWSLambda.Events.SNSEvent.SNSRecord message) instance GHC.Generics.Generic (AWSLambda.Events.SNSEvent.SNSMessage message) instance GHC.Show.Show message => GHC.Show.Show (AWSLambda.Events.SNSEvent.SNSMessage message) instance GHC.Classes.Eq message => GHC.Classes.Eq (AWSLambda.Events.SNSEvent.SNSMessage message) instance Network.AWS.Data.Text.FromText message => Data.Aeson.Types.FromJSON.FromJSON (AWSLambda.Events.SNSEvent.SNSMessage message) -- | Based on -- https://github.com/aws/aws-lambda-dotnet/tree/master/Libraries/src/Amazon.Lambda.APIGatewayEvents -- -- To enable processing of API Gateway events, use the events -- key in serverless.yml as usual: -- --
-- functions:
-- myapifunc:
-- handler: mypackage.mypackage-exe
-- events:
-- - http:
-- path: hello/{name}
-- method: get
--
--
-- Then use apiGatewayMain in the handler to process the requests.
module AWSLambda.Events.APIGateway
type Method = Text
type HeaderName = Text
type HeaderValue = Text
type QueryParamName = Text
type QueryParamValue = Text
type PathParamName = Text
type PathParamValue = Text
type StageVarName = Text
type StageVarValue = Text
data RequestIdentity
RequestIdentity :: !Maybe Text -> !Maybe Text -> !Maybe Text -> !Maybe Text -> !Maybe Text -> !Maybe IP -> !Maybe Text -> !Maybe Text -> !Maybe Text -> !Maybe Text -> !Maybe Text -> RequestIdentity
[_riCognitoIdentityPoolId] :: RequestIdentity -> !Maybe Text
[_riAccountId] :: RequestIdentity -> !Maybe Text
[_riCognitoIdentityId] :: RequestIdentity -> !Maybe Text
[_riCaller] :: RequestIdentity -> !Maybe Text
[_riApiKey] :: RequestIdentity -> !Maybe Text
[_riSourceIp] :: RequestIdentity -> !Maybe IP
[_riCognitoAuthenticationType] :: RequestIdentity -> !Maybe Text
[_riCognitoAuthenticationProvider] :: RequestIdentity -> !Maybe Text
[_riUserArn] :: RequestIdentity -> !Maybe Text
[_riUserAgent] :: RequestIdentity -> !Maybe Text
[_riUser] :: RequestIdentity -> !Maybe Text
readParse :: Read a => String -> Text -> Parser a
riUserArn :: Lens' RequestIdentity (Maybe Text)
riUserAgent :: Lens' RequestIdentity (Maybe Text)
riUser :: Lens' RequestIdentity (Maybe Text)
riSourceIp :: Lens' RequestIdentity (Maybe IP)
riCognitoIdentityPoolId :: Lens' RequestIdentity (Maybe Text)
riCognitoIdentityId :: Lens' RequestIdentity (Maybe Text)
riCognitoAuthenticationType :: Lens' RequestIdentity (Maybe Text)
riCognitoAuthenticationProvider :: Lens' RequestIdentity (Maybe Text)
riCaller :: Lens' RequestIdentity (Maybe Text)
riApiKey :: Lens' RequestIdentity (Maybe Text)
riAccountId :: Lens' RequestIdentity (Maybe Text)
data Authorizer
Authorizer :: !Maybe Text -> !Object -> !Object -> Authorizer
[_aPrincipalId] :: Authorizer -> !Maybe Text
[_aClaims] :: Authorizer -> !Object
[_aContext] :: Authorizer -> !Object
aPrincipalId :: Lens' Authorizer (Maybe Text)
aContext :: Lens' Authorizer Object
aClaims :: Lens' Authorizer Object
data ProxyRequestContext
ProxyRequestContext :: !Maybe Text -> !Text -> !Text -> !Text -> !Text -> !RequestIdentity -> !Text -> !Text -> !Text -> !Text -> !Maybe Authorizer -> ProxyRequestContext
[_prcPath] :: ProxyRequestContext -> !Maybe Text
[_prcAccountId] :: ProxyRequestContext -> !Text
[_prcResourceId] :: ProxyRequestContext -> !Text
[_prcStage] :: ProxyRequestContext -> !Text
[_prcRequestId] :: ProxyRequestContext -> !Text
[_prcIdentity] :: ProxyRequestContext -> !RequestIdentity
[_prcResourcePath] :: ProxyRequestContext -> !Text
[_prcHttpMethod] :: ProxyRequestContext -> !Text
[_prcApiId] :: ProxyRequestContext -> !Text
[_prcProtocol] :: ProxyRequestContext -> !Text
[_prcAuthorizer] :: ProxyRequestContext -> !Maybe Authorizer
prcStage :: Lens' ProxyRequestContext Text
prcResourcePath :: Lens' ProxyRequestContext Text
prcResourceId :: Lens' ProxyRequestContext Text
prcRequestId :: Lens' ProxyRequestContext Text
prcProtocol :: Lens' ProxyRequestContext Text
prcPath :: Lens' ProxyRequestContext (Maybe Text)
prcIdentity :: Lens' ProxyRequestContext RequestIdentity
prcHttpMethod :: Lens' ProxyRequestContext Text
prcAuthorizer :: Lens' ProxyRequestContext (Maybe Authorizer)
prcApiId :: Lens' ProxyRequestContext Text
prcAccountId :: Lens' ProxyRequestContext Text
data APIGatewayProxyRequest body
APIGatewayProxyRequest :: !Text -> !ByteString -> !Method -> !RequestHeaders -> !Query -> !HashMap PathParamName PathParamValue -> !HashMap StageVarName StageVarValue -> !ProxyRequestContext -> !Maybe (TextValue body) -> APIGatewayProxyRequest body
[_agprqResource] :: APIGatewayProxyRequest body -> !Text
[_agprqPath] :: APIGatewayProxyRequest body -> !ByteString
[_agprqHttpMethod] :: APIGatewayProxyRequest body -> !Method
[_agprqHeaders] :: APIGatewayProxyRequest body -> !RequestHeaders
[_agprqQueryStringParameters] :: APIGatewayProxyRequest body -> !Query
[_agprqPathParameters] :: APIGatewayProxyRequest body -> !HashMap PathParamName PathParamValue
[_agprqStageVariables] :: APIGatewayProxyRequest body -> !HashMap StageVarName StageVarValue
[_agprqRequestContext] :: APIGatewayProxyRequest body -> !ProxyRequestContext
[_agprqBody] :: APIGatewayProxyRequest body -> !Maybe (TextValue body)
agprqStageVariables :: forall body_aSiQ. Lens' (APIGatewayProxyRequest body_aSiQ) (HashMap StageVarName StageVarValue)
agprqResource :: forall body_aSiQ. Lens' (APIGatewayProxyRequest body_aSiQ) Text
agprqRequestContext :: forall body_aSiQ. Lens' (APIGatewayProxyRequest body_aSiQ) ProxyRequestContext
agprqQueryStringParameters :: forall body_aSiQ. Lens' (APIGatewayProxyRequest body_aSiQ) Query
agprqPathParameters :: forall body_aSiQ. Lens' (APIGatewayProxyRequest body_aSiQ) (HashMap PathParamName PathParamValue)
agprqPath :: forall body_aSiQ. Lens' (APIGatewayProxyRequest body_aSiQ) ByteString
agprqHttpMethod :: forall body_aSiQ. Lens' (APIGatewayProxyRequest body_aSiQ) Method
agprqHeaders :: forall body_aSiQ. Lens' (APIGatewayProxyRequest body_aSiQ) RequestHeaders
agprqBody :: forall body_aSiQ body_aSCt. Lens (APIGatewayProxyRequest body_aSiQ) (APIGatewayProxyRequest body_aSCt) (Maybe (TextValue body_aSiQ)) (Maybe (TextValue body_aSCt))
-- | Get the request body, if there is one
requestBody :: Getter (APIGatewayProxyRequest body) (Maybe body)
-- | Get the embedded request body, if there is one
requestBodyEmbedded :: Getter (APIGatewayProxyRequest (Embedded v)) (Maybe v)
-- | Get the binary (decoded Base64) request body, if there is one
requestBodyBinary :: Getter (APIGatewayProxyRequest Base64) (Maybe ByteString)
data APIGatewayProxyResponse body
APIGatewayProxyResponse :: !Int -> !ResponseHeaders -> !Maybe (TextValue body) -> APIGatewayProxyResponse body
[_agprsStatusCode] :: APIGatewayProxyResponse body -> !Int
[_agprsHeaders] :: APIGatewayProxyResponse body -> !ResponseHeaders
[_agprsBody] :: APIGatewayProxyResponse body -> !Maybe (TextValue body)
agprsStatusCode :: forall body_aSEm. Lens' (APIGatewayProxyResponse body_aSEm) Int
agprsHeaders :: forall body_aSEm. Lens' (APIGatewayProxyResponse body_aSEm) ResponseHeaders
agprsBody :: forall body_aSEm body_aSVJ. Lens (APIGatewayProxyResponse body_aSEm) (APIGatewayProxyResponse body_aSVJ) (Maybe (TextValue body_aSEm)) (Maybe (TextValue body_aSVJ))
response :: Int -> APIGatewayProxyResponse body
responseOK :: APIGatewayProxyResponse body
responseNotFound :: APIGatewayProxyResponse body
responseBadRequest :: APIGatewayProxyResponse body
responseBody :: Setter' (APIGatewayProxyResponse body) (Maybe body)
responseBodyEmbedded :: Setter' (APIGatewayProxyResponse (Embedded body)) (Maybe body)
responseBodyBinary :: Setter' (APIGatewayProxyResponse Base64) (Maybe ByteString)
-- | Process incoming events from serverless-haskell using a
-- provided function.
--
-- This is a specialisation of lambdaMain for API Gateway.
--
-- The handler receives the input event given to the AWS Lambda function,
-- and its return value is returned from the function.
--
-- This is intended to be used as main, for example:
--
-- -- import AWSLambda.Events.APIGateway -- import Control.Lens -- import Data.Aeson -- import Data.Aeson.Embedded -- -- main = apiGatewayMain handler -- -- handler :: APIGatewayProxyRequest (Embedded Value) -> IO (APIGatewayProxyResponse (Embedded [Int])) -- handler request = do -- putStrLn "This should go to logs" -- print $ request ^. requestBody -- pure $ responseOK & responseBodyEmbedded ?~ [1, 2, 3] ---- -- The type parameters reqBody and resBody represent -- the types of request and response body, respectively. The -- FromText and ToText contraints are required because -- these values come from string fields in the request and response JSON -- objects. To get direct access to the body string, use Text as -- the parameter type. To treat the body as a stringified embedded JSON -- value, use Embedded a, where a has the appropriate -- FromJSON or ToJSON instances. To treat the body as -- base 64 encoded binary use Base64. apiGatewayMain :: (FromText reqBody, ToText resBody) => (APIGatewayProxyRequest reqBody -> IO (APIGatewayProxyResponse resBody)) -> IO () instance GHC.Generics.Generic (AWSLambda.Events.APIGateway.APIGatewayProxyResponse body) instance GHC.Show.Show body => GHC.Show.Show (AWSLambda.Events.APIGateway.APIGatewayProxyResponse body) instance GHC.Classes.Eq body => GHC.Classes.Eq (AWSLambda.Events.APIGateway.APIGatewayProxyResponse body) instance Network.AWS.Data.Text.ToText body => Data.Aeson.Types.ToJSON.ToJSON (AWSLambda.Events.APIGateway.APIGatewayProxyResponse body) instance Network.AWS.Data.Text.FromText body => Data.Aeson.Types.FromJSON.FromJSON (AWSLambda.Events.APIGateway.APIGatewayProxyResponse body) instance GHC.Generics.Generic (AWSLambda.Events.APIGateway.APIGatewayProxyRequest body) instance GHC.Show.Show body => GHC.Show.Show (AWSLambda.Events.APIGateway.APIGatewayProxyRequest body) instance GHC.Classes.Eq body => GHC.Classes.Eq (AWSLambda.Events.APIGateway.APIGatewayProxyRequest body) instance Network.AWS.Data.Text.FromText body => Data.Aeson.Types.FromJSON.FromJSON (AWSLambda.Events.APIGateway.APIGatewayProxyRequest body) instance Data.Aeson.Types.FromJSON.FromJSON AWSLambda.Events.APIGateway.ProxyRequestContext instance GHC.Show.Show AWSLambda.Events.APIGateway.ProxyRequestContext instance GHC.Classes.Eq AWSLambda.Events.APIGateway.ProxyRequestContext instance GHC.Show.Show AWSLambda.Events.APIGateway.Authorizer instance GHC.Classes.Eq AWSLambda.Events.APIGateway.Authorizer instance Data.Aeson.Types.FromJSON.FromJSON AWSLambda.Events.APIGateway.Authorizer instance GHC.Show.Show AWSLambda.Events.APIGateway.RequestIdentity instance GHC.Classes.Eq AWSLambda.Events.APIGateway.RequestIdentity instance Data.Aeson.Types.FromJSON.FromJSON AWSLambda.Events.APIGateway.RequestIdentity module AWSLambda.Events -- | Traverse all the SNS messages embedded in an SQS event traverseSnsInSqs :: (FromJSON a, Applicative m) => (a -> m ()) -> SQSEvent (Embedded (SNSMessage (Embedded a))) -> m () -- | A specialised version of the lambdaMain entry-point for -- handling individual SNS messages embedded in an SQS event snsInSqsMain :: (FromJSON a, MonadCatch m, MonadIO m) => (a -> m ()) -> m () -- | Traverse S3 events embedded within SNS messages within an SQS event traverseS3InSnsInSqs :: Applicative m => (S3EventNotification -> m ()) -> SQSEvent (Embedded (SNSMessage (Embedded S3Event))) -> m () -- | A specialised version of the lambdaMain entry-point for -- handling individual S3 event notifications embedded in SNS messages -- embedded in an SQS event s3InSnsInSqsMain :: (MonadCatch m, MonadIO m) => (S3EventNotification -> m ()) -> m () -- | Tools for running Haskell on AWS Lambda using Serverless. -- --
npm init -y npm install --save serverless -- serverless-haskell@x.y.zThe version of the NPM package to -- install must match the version of the Haskell package.
service: myservice provider: name: aws runtime: haskell -- functions: myfunc: handler: mypackage.mypackage-exe # Here, mypackage -- is the Haskell package name and mypackage-exe is the # executable name -- as defined in the Cabal file plugins: - serverless-haskell
-- dependencies: -- - base >= 4.7 && < 5 -- - aeson -- - serverless-haskell ---- --
-- export SLS_DEBUG=* -- sls invoke local -f myfunc ---- --
export SLS_DEBUG=* sls -- deployYou can test the function and see the invocation results -- with sls invoke -f myfunc.
custom: haskell: stackBuildArgs: - -- --pedantic - --allow-different-user
custom: haskell: docker: -- false
custom: haskell: buildAll: -- false
-- import qualified Data.Aeson as Aeson -- -- import AWSLambda -- -- main = lambdaMain handler -- -- handler :: Aeson.Value -> IO [Int] -- handler evt = do -- putStrLn "This should go to logs" -- print evt -- pure [1, 2, 3] ---- -- The handler function can receive arbitrary JSON values from custom -- invocations, or one of the events from the AWSLambda.Events -- module, such as S3Event: -- --
-- import AWSLambda.Events.S3Event -- -- handler :: S3Event -> IO () -- handler evt = do -- print $ records evt ---- -- If the Lambda function needs to process several types of events, use -- Alternative to combine several handlers: -- --
-- import AWSLambda -- import AWSLambda.Events.S3Event -- import Data.Aeson -- import Data.Aeson.Alternative -- -- main = lambdaMain $ handlerS3 `alternative` handlerCustom -- -- handlerS3 :: S3Event -> IO () -- handlerS3 = _ -- -- handlerCustom :: Value -> IO () -- handlerCustom = _ ---- -- When run outside the AWS Lambda environment, the input is read as JSON -- from the command line, and the result of the execution is printed, -- also as JSON, to the standard output. lambdaMain :: (FromJSON event, ToJSON res, MonadCatch m, MonadIO m) => (event -> m res) -> m ()