This post is an ported, edited version of the original
Purpose
This post shows you how to run PureScript 0.12 on AWS Lambda, using Express on the Serverless platform.
Setup
The final output of this article is also a repo
Prerequisites.
You should have nodejs (i.e. nvm, npm) setup on your machine, preferably 8.10. AWS Lambda uses 8.10. I’m new to nodejs land but I’m guessing that higher minor versions should be ok.
Software Setup
npm install -g purescript npm install -g pulp bower npm install -g serverless
AWS Credentials
If you haven’t already, generate an AWS key and secret. This user must have AdministratorAccess permissions. Here are the docs or a slightly outdated video. For the video, follow on to 1:40 and ignore the Serverless Dashboard instructions(around 0:58 to 1:00), we are going to do that on the command line.
serverless config credentials --provider aws --key your-aws-key --secret your-aws-secret
Project Setup
mkdir hello-purescript-serverless cd hello-purescript-serverless npm init # fill in as directed pulp init pulp build
If all goes well, you should see something like below:
* Building project in /Users/rabraham/Documents/dev/purescript/hello-purescript-serverless Compiling Data.Symbol Compiling Type.Data.RowList ... Compiling Main Compiling PSCI.Support Compiling Effect.Class.Console * Build successful.
Now let’s install our project specific packages.
bower install --save purescript-aws-lambda-express purescript-express npm install --save aws-serverless-express express npm install serverless-offline --save-dev
purescript-express is a wrapper on express while purescript-aws-lambda-express provides the wrapper for AWS Lambda. serverless-offline allows us to test the code locally before deploying it to AWS Lambda.
At time of writing, purescript-express has an issue where we have to install the following two packages too. Try a pulp build
right now and if that fails, run the following commands
bower install --save purescript-test-unit bower install --save purescript-aff
Let’s build it
pulp build
You should see some warnings but at the end, you should see * Build successful
.
Main Course
In your src/Main.purs
, delete the previous code and paste the following:
module Main where import Node.Express.App (App, get) import Node.Express.Handler (Handler) import Node.Express.Response (sendJson) import Network.AWS.Lambda.Express as Lambda -- Define an Express web app indexHandler :: Handler indexHandler = do sendJson { status: "ok" } app :: App app = do get "/" indexHandler -- Define the AWS Lambda handler handler :: Lambda.HttpHandler handler = Lambda.makeHandler app
Build Your App
pulp build
Serverless Setup
In the root of your project, create the file serverless.yml
and paste the following:
service: purescript-aws-lambda-express-test provider: name: aws runtime: nodejs8.10 memorySize: 128 # stage: ${opt:stage dev} region: us-east-1 functions: lambda: handler: output/Main/index.handler events: - http: path: / # this matches the base path method: ANY - http: path: /{any+} method: ANY plugins: - serverless-offline
Let’s test this locally: On one terminal.
serverless offline start
Open another terminal and do:
curl http://localhost:3000
You should see {"status":"ok"}
Deploy
Once it works locally, let’s deploy to AWS.
serverless deploy -v
Output should look like something below. Note, your endpoint will be different:
Serverless: Packaging service ... Service Information service: purescript-aws-lambda-express-test stage: dev region: us-east-1 ... Stack Outputs ... ServiceEndpoint: https://l4qajv7v95.execute-api.us-east-1.amazonaws.com/dev ....
Copy the link shown as ServiceEndpoint
and you know what to do!
curl https://l4qajv7v95.execute-api.us-east-1.amazonaws.com/dev
Output:
{"status":"ok"}%
Undeploy
serverless remove -v
I hope this enables you to make PureScript web applications! Thanks to purescript-express and purescript-aws-lambda-express for making this possible.
Top comments (0)