@whook/aws-lambda
v20.1.2
Published
Build and deploy to AWS Lambda with Whook.
Readme
@whook/aws-lambda
Build and deploy to AWS Lambda with Whook.
This module is aimed to help you to build and deploy your Whook server to AWS Lambda.
You can find a complete setup with a Terraform deployment example in this pull request.
Quick setup
Install this module:
npm i @whook/aws-lambda;Add the plugin to the src/index.ts main file:
// ...
$.register(
constant('WHOOK_PLUGINS', [
...WHOOK_DEFAULT_PLUGINS,
+ '@whook/aws-lambda',
'@whook/cors',
]),
);
// ...Tweak the 2 build functions in your src/build.ts main file:
import {
// (...)
- DEFAULT_INITIALIZER_PATH_MAP,
- runBuild as runBaseBuild,
- prepareBuildEnvironment as prepareBaseBuildEnvironment,
// (...)
} from '@whook/whook';
+import {
+ DEFAULT_BUILD_INITIALIZER_PATH_MAP,
+ runBuild as runBaseBuild,
+ prepareBuildEnvironment as prepareBaseBuildEnvironment,
+} from '@whook/aws-lambda';
// (...)
// The `prepareBuildEnvironment` create the build
// environment
export async function prepareBuildEnvironment(
$: Knifecycle = new Knifecycle(),
): Promise<Knifecycle> {
$ = await prepareEnvironment($);
// (...)
- // Usually, here you call the installed build env
- $ = await prepareBaseBuildEnvironment($);
+ // Calling the AWS specific build env
+ $ = await prepareBaseBuildEnvironment($);
// The build often need to know were initializers
// can be found to create a static build and
// remove the need to create an injector
$.register(
constant('INITIALIZER_PATH_MAP', {
// (...)
- ...DEFAULT_INITIALIZER_PATH_MAP,
+ ...DEFAULT_BUILD_INITIALIZER_PATH_MAP,
}),
);
// (...)
}Declare this module types in your src/whook.d.ts type definitions:
import {
+ type WhookCompilerConfig,
type WhookBaseRouteConfig,
type WhookBaseCronConfig,
+ type WhookBaseConsumerConfig,
+ type WhookBaseTransformerConfig,
+ } from '@whook/whook';
+ import {
+ type WhookAWSLambdaBuildConfig,
+ type WhookAWSLambdaRouteConfig
+ type WhookAWSLambdaConsumerConfig,
+ type WhookAWSLambdaTransformerConfig,
+ } from '@whook/aws-lambda';
declare module 'application-services' {
// ...
export interface AppConfig
- extends WhookBaseConfigs {}
+ extends WhookBaseConfigs,
+ WhookAWSLambdaBuildConfig,
+ WhookCompilerConfig {}
}
// ...
// ...
declare module '@whook/whook' {
export interface WhookRouteConfig
extends WhookBaseRouteConfig,
+ WhookAWSLambdaRouteConfig,
WhookCORSRouteConfig {}
export interface WhookCronConfig
- extends WhookBaseCronConfig {}
+ extends WhookBaseCronConfig,
+ WhookAWSLambdaCronConfig {}
+
+ export interface WhookConsumerConfig
+ extends WhookBaseConsumerConfig,
+ WhookAWSLambdaConsumerConfig {}
+
+ export interface WhookTransformerConfig
+ extends WhookBaseTransformerConfig,
+ WhookAWSLambdaTransformerConfig {}
}
And add the AWS Lambda config (usually in src/config/common/config.js):
// ...
import { type AppConfig } from 'application-services';
// ...
const CONFIG: AppConfig = {
// ...
+ COMPILER_OPTIONS: {
+ externalModules: [],
+ target: '22',
+ },
};
export default CONFIG;Build
To build your functions:
# Build all functions
npm run build
# Build only one function
npm run build -- getPingDebug
You can easily test your functions builds by adding @whook/aws-lambda to your
WHOOK_PLUGINS list. It provides you some commands like the testAWSLambdaRoute
one:
npx whook testAWSLambdaRoute --name getPingTo get more insights when some errors happens:
DEBUG=whook npm run dev -- testAWSLambdaRoute --name getPingDeployment
We recommend using Terraform to deploy your lambda functions.
There is a complete example on how to deploy your functions in this pull request.
API
Functions
initWrapHandlerForConsumerLambda(services) ⇒ Promise.<Object>
Wrap an handler to make it work with a consumer AWS Lambda.
Kind: global function
Returns: Promise.<Object> - A promise of an object containing the reshaped env vars.
| Param | Type | Default | Description | | --- | --- | --- | --- | | services | Object | | The services the wrapper depends on | | services.ENV | Object | | The process environment | | services.MAIN_DEFINITION | Object | | An OpenAPI definitition for that handler | | services.apm | Object | | An application monitoring service | | [services.time] | Object | | An optional time service | | [services.log] | Object | noop | An optional logging service |
initWrapHandlerForCronLambda(services) ⇒ Promise.<Object>
Wrap an handler to make it work with cron AWS Lambda.
Kind: global function
Returns: Promise.<Object> - A promise of an object containing the reshaped env vars.
| Param | Type | Default | Description | | --- | --- | --- | --- | | services | Object | | The services the wrapper depends on | | services.ENV | Object | | The process environment | | services.MAIN_DEFINITION | Object | | An OpenAPI definitition for that handler | | services.apm | Object | | An application monitoring service | | [services.time] | Object | | An optional time service | | [services.log] | Object | noop | An optional logging service |
initWrapHandlerForConsumerLambda(services) ⇒ Promise.<Object>
Wrap an handler to make it work with a consumer AWS Lambda.
Kind: global function
Returns: Promise.<Object> - A promise of an object containing the reshaped env vars.
| Param | Type | Default | Description | | --- | --- | --- | --- | | services | Object | | The services the wrapper depends on | | services.MAIN_DEFINITION | Object | | An OpenAPI definitition for that handler | | services.ENV | Object | | The process environment | | services.DECODERS | Object | | Request body decoders available | | services.ENCODERS | Object | | Response body encoders available | | services.PARSED_HEADERS | Object | | A list of headers that should be parsed as JSON | | services.PARSERS | Object | | Request body parsers available | | services.STRINGIFIERS | Object | | Response body stringifiers available | | services.BUFFER_LIMIT | Object | | The buffer size limit | | services.apm | Object | | An application monitoring service | | services.obfuscator | Object | | A service to hide sensible values | | services.errorHandler | Object | | A service that changes any error to Whook response | | [services.time] | Object | | An optional time service | | [services.log] | Object | noop | An optional logging service |
initWrapHandlerForKafkaLambda(services) ⇒ Promise.<Object>
Wrap an handler to make it work with a kafka AWS Lambda.
Kind: global function
Returns: Promise.<Object> - A promise of an object containing the reshaped env vars.
| Param | Type | Default | Description | | --- | --- | --- | --- | | services | Object | | The services the wrapper depends on | | services.ENV | Object | | The process environment | | services.MAIN_DEFINITION | Object | | An OpenAPI definitition for that handler | | services.apm | Object | | An application monitoring service | | [services.time] | Object | | An optional time service | | [services.log] | Object | noop | An optional logging service |
initWrapHandlerForLogSubscriberLambda(services) ⇒ Promise.<Object>
Wrap an handler to make it work with a log subscriber AWS Lambda.
Kind: global function
Returns: Promise.<Object> - A promise of an object containing the reshaped env vars.
| Param | Type | Default | Description | | --- | --- | --- | --- | | services | Object | | The services the wrapper depends on | | services.ENV | Object | | The process environment | | services.MAIN_DEFINITION | Object | | An OpenAPI definitition for that handler | | services.apm | Object | | An application monitoring service | | [services.time] | Object | | An optional time service | | [services.log] | Object | noop | An optional logging service |
initWrapHandlerForS3Lambda(services) ⇒ Promise.<Object>
Wrap an handler to make it work with a S3 AWS Lambda.
Kind: global function
Returns: Promise.<Object> - A promise of an object containing the reshaped env vars.
| Param | Type | Default | Description | | --- | --- | --- | --- | | services | Object | | The services the wrapper depends on | | services.ENV | Object | | The process environment | | services.MAIN_DEFINITION | Object | | An OpenAPI definitition for that handler | | services.apm | Object | | An application monitoring service | | [services.time] | Object | | An optional time service | | [services.log] | Object | noop | An optional logging service |
initWrapHandlerForConsumerLambda(services) ⇒ Promise.<Object>
Wrap an handler to make it work with a transformer AWS Lambda.
Kind: global function
Returns: Promise.<Object> - A promise of an object containing the reshaped env vars.
| Param | Type | Default | Description | | --- | --- | --- | --- | | services | Object | | The services the wrapper depends on | | services.ENV | Object | | The process environment | | services.MAIN_DEFINITION | Object | | An OpenAPI definitition for that handler | | services.apm | Object | | An application monitoring service | | [services.time] | Object | | An optional time service | | [services.log] | Object | noop | An optional logging service |
