Podchaser Logo
Home
70: Haskell Serverless

70: Haskell Serverless

Released Thursday, 21st February 2019
Good episode? Give it some love!
70: Haskell Serverless

70: Haskell Serverless

70: Haskell Serverless

70: Haskell Serverless

Thursday, 21st February 2019
Good episode? Give it some love!
Rate Episode
Finally Ready to Go
  • We’ve got our environment all set up so let’s get going!

  • Steps

    • A new stack project using the template
    • stack new my-haskell-lambda https://github.com/theam/aws-lambda-haskell-runtime/raw/master/stack-template.hsfiles --resolver=lts-12.13 --omit-packages
    • Say it with me “stack is not like NPM, it is NOT a package manager” stack handles the management of your tool-chain.
    • resolver ?

    Specifies which snapshot is to be used for this project. A snapshot defines a GHC version, a number of packages available for installation, and various settings like build flags. It is called a resolver since a snapshot states how dependencies are resolved. There are currently four resolver types:

  • omit-packages ? this leaves the extra-depsflag commented out in the stack.yml
  • Added to stack.yml
packages: - . extra-deps: - aws-lambda-haskell-runtime-1.0.9
  • initially I had only added the extra-deps. I didn’t realize that having added --omit-packages I still needed to add packages .
  • running make and we’re off to the races Progress 0/111
aws lambda create-function --function-name lambda-haskell \ --zip-file fileb://build/function.zip --handler src/Lib.handler \ --layers arn:aws:lambda:us-west-2:785355572843:layer:haskell-runtime:2 \ --runtime provided --role arn:aws:iam::XXXXXXXXXX:role/lambda-haskell-role
  • Oh man. needed
  • Success it’s been deployed.
  • Let’s see if it works on the first try…
  • NOPE execute failure. :cry:
  • Oh well, we spelled the handler wrong. AND
  • we had the wrong ‘Layer ARN’ This is the custom runtime, once we updated it to match the read me file, we had
  • :rocket: Lift Off!!

Can we update the code ?

aws lambda update-function-code --zip-file fileb://build/function.zip --publish --function-name lambda-haskell

HELL YES we can.

OK. So what did we actually deploy ? Let’s walk through the code.

  • Lib source file with aws runtime for having access to the ‘Context’ that is passed in to our application when it’s instantiated.

  • GHC.Generics for work with JSON

  • Aeson for (de)serializing JSON to our types

  • Handler

    • This is defined in scr/Lib
    • Must be called handler limit of Haskell runtime
    • handler :: Person -> Context -> IO (Either String Person)
  • Main

    • import aws runtime again
    • import fully qualified Lib
    • call configureLambda which will dynamically generate our dispatchers for us.
    • also of note, with compared to C++ and Rust runtimes, Haskell doesn’t need the entire runtime included with it. I am guessing it can make smart decisions about what is required
    • we can create more ‘handlers’ just need to remember to import them
BOOM

Person API *update age to a negative value or 0 and see the string response. Thanks great!

{ "personAge": 43, "personName": "John Doe" } Picks Resources

AWS Custom Runtimes

Runtime Details with Haskell Medium Post

Custom Haskell Runtime Repo

Lexi Lambda Guide to Haskell 2018

Follow

 

Show More
Rate

Join Podchaser to...

  • Rate podcasts and episodes
  • Follow podcasts and creators
  • Create podcast and episode lists
  • & much more

Episode Tags

Do you host or manage this podcast?
Claim and edit this page to your liking.
,

Unlock more with Podchaser Pro

  • Audience Insights
  • Contact Information
  • Demographics
  • Charts
  • Sponsor History
  • and More!
Pro Features