Stability | experimental |
---|---|
Portability | POSIX |
Safe Haskell | None |
Language | Haskell2010 |
Tools for running Haskell on AWS Lambda.
Usage
To deploy a Haskell function on AWS Lambda:
- Initialise a Serverless project in the same directory as your Stack-enabled package.
- Install
serverless-haskell
plugin (Warning: not uploaded to NPM registry yet, install manually by cloning this repository and specifying itsserverless-plugin
directory tonpm install
). - Add the following to
serverless.yml
:
provider: name: aws runtime: nodejs6.10 functions: myfunc: handler: mypackage.myfunc # Here, mypackage is the Haskell package name and myfunc is the executable # name as defined in the Cabal file plugins: - serverless-haskell
- Write your
main
function usinglambdaMain
. - Use
sls deploy
to deploy the executable to AWS Lambda. Note:sls deploy function
is not supported.
Additional features
To add flags to stack build
, add the following key to serverless.yml
:
custom: haskell: stackBuildArgs: - --pedantic - --allow-different-user
- lambdaMain :: (FromJSON event, ToJSON res) => (event -> IO res) -> IO ()
- module AWSLambda.Events
Documentation
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.
module AWSLambda.Events