@stone-ton/lambda-handlers
Lib para fazer wrapper de lambdas
Lambda trigada pela API Gateway como proxy (múltiplas rotas numa lambda)
import { LambdaApiProxyHandler, Controller } from '@stone-ton/lambda-handlers'
import { APIGatewayProxyHandler } from 'aws-lambda'
import authentication from './authentication'
import foo from './controllers/foo'
const api = new LambdaApiProxyHandler({
base: process.env.ADMIN_API_BASE_PATH,
})
const foo: Controller = (req) => {
return Promise.resolve({
body: {
message: 'Hello World'
},
})
}
export const handler: APIGatewayProxyHandler = async (
event,
context,
) => {
api.addRoute({
method: 'GET',
path: '/',
run: foo,
auth: authentication(['admin']),
})
return api.handler(event, context)
}
Lambda trigada pela API Gateway como proxy (uma rota por lambda)
import { Controller, LambdaApiHandler } from '@stone-ton/lambda-handlers'
import { APIGatewayProxyHandler } from 'aws-lambda'
const getUserController: Controller = async (request) => {
const user = await getUser(request.params.id)
return {
body: user,
}
}
const apiHandler = new LambdaApiHandler(getUserController)
export const handler: APIGatewayProxyHandler = async (
event,
context,
) => {
return apiHandler.handler(event, context)
}
Lambda trigada por SQS
import { LambdaSqsHandler, Worker } from '@stone-ton/lambda-handlers'
import { SQSHandler } from 'aws-lambda'
interface CreateUserMessage {
user_id: string
}
const workerCreateUser: Worker<CreateUserMessage> = async (messages) => {
for (const { body } of messages) {
const user = await getUser(body.user_id)
}
}
const sqsHandler = new LambdaSqsHandler(workerCreateUser)
export const handler: SQSHandler = async (event) => {
return sqsHandler.handler(event)
}
Lambda trigada por SQS (Worker com processamento em paralelo)
import { LambdaSqsHandlerV2, WorkerV2 } from '@stone-ton/lambda-handlers'
import { SQSHandler } from 'aws-lambda'
interface CreateUserMessage {
user_id: string
}
const workerCreateUser: WorkerV2<CreateUserMessage> = async (message, logger) => {
logger.debug('Start create user')
const user = await getUser(body.user_id)
}
const sqsHandler = new LambdaSqsHandler({
worker: workerCreateUser,
parallel: false,
service: 'migraton',
})
export const handler: SQSHandler = async (event) => {
return sqsHandler.handler(event)
}
A LambdaSqsHandlerV2 precisa ter o Report Batch Item Failures habilitado. Abaixo exemplo com terraform:
resource "aws_lambda_event_source_mapping" "event_handler" {
event_source_arn = module.sqs_event_handler.sqs_arn
function_name = module.event_handler.arn
batch_size = 1
function_response_types = ["ReportBatchItemFailures"]
}
Lambda trigada pelo sdk
import { LambdaInvokeHandler, InvokeHandler } from '@stone-ton/lambda-handlers'
import { Handler } from 'aws-lambda'
interface CreateUserRequest {
user_id: string
}
interface CreateUserResponse {
message: string
}
const createUserInvoke: InvokeHandler<CreateUserRequest, CreateUserResponse> = async (event) => {
return {
message: event.user_id
}
}
const invokeHandler = new LambdaInvokeHandler(createUserInvoke)
export const handler: Handler<CreateUserRequest, CreateUserResponse> = async (event) => {
return invokeHandler.handler(event)
}