serverless-haskell: Deploying Haskell code onto AWS Lambda using Serverless

[ aws, cloud, library, mit, network ] [ Propose Tags ]

Utilities to help process the events from AWS Lambda when deployed with the serverless-haskell plugin.

[Skip to Readme]
Versions [faq] 0.0.0, 0.0.2, 0.0.3, 0.0.4, 0.0.6, 0.1.0, 0.2.0, 0.2.1, 0.3.0, 0.3.1, 0.4.0, 0.4.1, 0.4.2, 0.4.3, 0.5.0, 0.5.1, 0.5.2, 0.5.3, 0.6.0, 0.6.1, 0.6.2, 0.6.3, 0.6.4, 0.6.5, 0.6.6, 0.6.7, 0.7.0, 0.7.1, 0.7.2, 0.7.3, 0.7.4, 0.7.5, 0.8.1, 0.8.2, 0.8.3, 0.8.4, 0.8.5, 0.8.6, 0.8.7, 0.8.8, 0.8.10, 0.8.11, 0.9.0, 0.9.1, 0.9.3, 0.9.4, 0.10.0, 0.10.1, 0.10.2, 0.10.3, 0.10.4, 0.10.5, 0.11.2, 0.11.3, 0.12.0, 0.12.1
Dependencies aeson, aeson-casing, aeson-extra, amazonka-core, amazonka-kinesis, amazonka-s3, base (>=4.7 && <5), bytestring, case-insensitive, http-types, iproute, lens, text, time, unix, unordered-containers [details]
License MIT
Category AWS, Cloud, Network
Home page
Bug tracker
Source repo head: git clone
Uploaded by AlexeyKotlyarov at 2018-06-12T10:28:25Z
Distributions LTSHaskell:0.8.8, NixOS:0.12.1
Downloads 20225 total (1414 in the last 30 days)
Rating (no votes yet) [estimated by Bayesian average]
Your Rating
  • λ
  • λ
  • λ
Status Hackage Matrix CI
Docs not available [build log]
All reported builds failed as of 2018-06-12 [all 3 reports]


  • AWSLambda
    • AWSLambda.Events
      • AWSLambda.Events.APIGateway
      • AWSLambda.Events.KinesisEvent
      • AWSLambda.Events.Records
      • AWSLambda.Events.S3Event
      • AWSLambda.Events.SNSEvent
    • AWSLambda.Handler
    • AWSLambda.Orphans
  • Data
    • Aeson
      • Data.Aeson.Alternative
      • Data.Aeson.Embedded
      • Data.Aeson.TextValue


Maintainer's Corner

For package maintainers and hackage trustees

Readme for serverless-haskell-0.6.0

[back to package description]

Serverless Haskell

Build status Hackage Hackage dependencies npm

Deploying Haskell code onto AWS Lambda using Serverless.



  • Create a Stack package for your code:

    stack new mypackage

    LTS 9, 10 and 11 are supported, older versions are likely to work too but untested.

  • Initialise a Serverless project inside the Stack package directory and install the serverless-haskell plugin:

    cd mypackage
    npm init .
    npm install --save serverless serverless-haskell
  • Create serverless.yml with the following contents:

    service: myservice
      name: aws
      runtime: nodejs8.10
        handler: mypackage.myfunc
        # Here, mypackage is the Haskell package name and myfunc is the executable
        # name as defined in the Cabal file. The handler field may be prefixed
        # with a path of the form `dir1/.../dirn`, relative to `serverless.yml`,
        # which points to the location where the Haskell package `mypackage` is
        # defined. This prefix is not needed when the Stack project is defined at
        # the same level as `serverless.yml`.
      - serverless-haskell
  • Write your main function:

    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]
  • Use sls deploy to deploy the executable to AWS Lambda. Note: sls deploy function is not supported yet.

    The serverless-haskell plugin will build the package using Stack and upload it to AWS together with a JavaScript wrapper to pass the input and output from/to AWS Lambda.

    You can test the function and see the invocation results with sls invoke myfunc.


  • sls deploy function is not supported yet.
  • sls invoke local is not supported yet.
  • Only AWS Lambda is supported at the moment. Other cloud providers would require different JavaScript wrappers to be implemented.

See AWSLambda for documentation, including additional options to control the deployment.


  • Haskell code is tested with Stack: stack test.
  • JavaScript code is linted with eslint.

Integration tests

Integration test verifies that the project can build and deploy a complete function to AWS, and it runs with expected functionality.

Integration test is only automatically run up to deployment due to the need for an AWS account. To run manually:

  • Ensure you have the required dependencies: curl, jq, NPM, pwgen and Stack.
  • Get an AWS account and add the access credentials into your shell environment.
  • Run ./integration-test/ The exit code indicates success.
  • To verify just the packaging, without deployment, run ./integration-test/ --dry-run.
  • By default, the integration test is run with LTS 11. To specify a different series, use RESOLVER_SERIES=lts-9.


  • Run the integration tests.
  • Install bumpversion: pip install bumpversion.
  • Run bumpversion major|minor|patch.
  • Run git push --tags && git push.