Safe Haskell | None |
---|---|
Language | Haskell2010 |
Control.Distributed.Fork.Lambda
Description
Provides a Backend
using AWS Lambda functions.
In order to do that, roughly:
- It creates a deployment archive containing the program binary and a tiny wrapper written in Python and uploads it to the given S3 bucket.
- Creates a CloudFormation stack containing the Lambda function and an SQS queue to gather the answers.
- It starts polling the SQS queue for any answers.
- When executing, it invokes the Lambda function using asynchronous invocation mode and blocks until a message appears in the queue.
- On exit, it deletes the CloudFormation stack.
Some warts:
The same binary should run on AWS Lambda. In practice, this means:
- You have to build and use this library on a Linux machine.
- You have to statically link everything. You can use GHC's
'
-static -optl-static -optl-pthread -fPIC
' parameters for that. See examples/examples.cabal#L16 for an example.
- On AWS Lambda, more memory you assign to a function, more CPU you get. So it might make your function run faster if you overallocate memory.
- When invoked asynchronously, AWS Lambda retries the invocation 2 more times waiting a minute between every retry. This means when something fails, it will take at least a few minutes to until you get an exception.
- withLambdaBackend :: LambdaBackendOptions -> (Backend -> IO a) -> IO a
- data LambdaBackendOptions
- lambdaBackendOptions :: Text -> LambdaBackendOptions
- lboPrefix :: Lens' LambdaBackendOptions Text
- lboMemory :: Lens' LambdaBackendOptions Int
Usage
withLambdaBackend :: LambdaBackendOptions -> (Backend -> IO a) -> IO a Source #
Provides a Backend
using AWS Lambda functions.
Created AWS resources except the uploaded deployment package will be cleaned up when exiting.
Example usage:
{-# LANGUAGE StaticPointers #-} import Control.Lens import Control.Distributed.Fork import Control.Distributed.Fork.Lambda opts :: LambdaBackendOptions opts = lambdaBackendOptions "my-s3-bucket" & lboMemory .~ 1024 main :: IO () main = doinitDistributedFork
withLambdaBackend
opts $ \backend -> do handle <-fork
backend (static Dict) (static (return "Hello from Lambda!")) await handle >>= putStrLn
Options
data LambdaBackendOptions Source #
Options required for creating a Lambda backend.
Use lambdaBackendOptions
smart constructor to create and lenses below for
setting optional fields.
Arguments
:: Text | Name of the S3 bucket to store the deployment archive in. |
-> LambdaBackendOptions |
lboPrefix :: Lens' LambdaBackendOptions Text Source #
Prefix to the deployment archive and the CloudFormation stack.
Default: "distributed-fork"
lboMemory :: Lens' LambdaBackendOptions Int Source #
Desired memory for the Lambda functions.
See CloudFormation's AWS::Lambda::Function::MemorySize page for allowed values.
Default: 128