AMAZON and serverless(5)Lambda Invoke and Log

AMAZON and serverless(5)Lambda Invoke and Log

Logging
There is a logging package called debug
> npm info debug version
3.1.0

https://github.com/visionmedia/debug#readme

import debug from 'debug';
const logger = debug('acknowledgehandler');
const record = JSON.parse(parameters);
logger(record);
logger('Meeting creation succeeded');

Then we can configure the DEBUG=* to show all the logging, or configure DEBUG=acknowldegehandler to show only some logging.

Lambda Directly Invoke
import { APIGatewayEvent, Callback, Context } from 'aws-lambda';
const aws_region = process.env.AWS_REGION;
const lambda = new AWS.Lambda({ region: aws_region });

export async function invokeLambda(functionName: string, request: any) {
    const params = {
        FunctionName: functionName,
        InvocationType: 'RequestResponse',
        LogType: 'None',
        Payload: JSON.stringify(request)
    };

    try {
        console.log('invoking lambda: ', params);
        const response = await lambda.invoke(params).promise();
        if(!response) {
            console.error(`failure getting result from ${functionName} lambda`)
            throw new Error(`failure getting result from ${functionName} lambda`);
        }
        console.log('lambda response: ', response);
        const responseObj = JSON.parse(response.Payload as string);
        const statusCode = idx(responseObj, _ => _.statusCode);
        const statusMessage = idx(responseObj, _ => _.statusMessage);
        if(statusCode < 200 || 202 < statusCode) {
            throw new Error(`Bad statusCode returnd by ${functionName} lambda: ${statusCode} - ${statusMessage}`);
        }
        return idx(responseObj, _ => _.body) || {};
    } catch(err) {
        throw err;
    }
}

export async function getExtension() {
    return await invokeLambda(get_extension_lambda, {});
}

TypeScript Validation
> npm info joi version
13.2.0

https://github.com/hapijs/joi

import Joi = require('joi’);

const meetingCreateSchema = Joi.object().keys({
displayName: Joi.string()
.min(1)
.optional(),
description: Joi.string()
.min(1)
.optional(),
pin: Joi.number()
.min(1)
.optional(),
moderatorExtension: Joi.number()
.min(1)
.optional(),
ownerExtension: Joi.number()
.min(1)
.optional(),
lecturerExtension: Joi.number()
.min(1)
.optional(),
tempMeeting: Joi.boolean()
.optional(),
hiddenMeeting: Joi.boolean()
.optional()
});

const meetingUpdateSchema = Joi.object().keys({
uuid: Joi.string()
.uuid({version: ['uuidv4']})
.required(),
displayName: Joi.string()
.min(1)
.optional(),
description: Joi.string()
.min(1)
.optional(),
pin: Joi.number()
.min(1)
.optional(),
moderatorExtension: Joi.number()
.min(1)
.optional(),
ownerExtension: Joi.number()
.min(1)
.optional(),
lecturerExtension: Joi.number()
.min(1)
.optional(),
tempMeeting: Joi.boolean()
.optional(),
hiddenMeeting: Joi.boolean()
.optional()
});

const meetingDeleteSchema = Joi.object().keys({
uuid: Joi.string()
.uuid({version: ['uuidv4']})
.required(),
});

const validationMapByOperation = {
'/meeting/create': meetingCreateSchema,
'/meeting/update': meetingUpdateSchema,
'/meeting/delete': meetingDeleteSchema
};

const schema = validationMapByOperation[uriSuffix];
const validationResult = Joi.validate(parameters, schema, {convert: true, allowUnknown: false});
if (validationResult.error) {
    console.log('validation error: ', validationResult );
    const errorMessage = idx(validationResult, _ => _.error.details[0].message); // returns the first validation error
    return errorResponse(cb, 401, `${uriSuffix} : ${errorMessage}`);
}

References:
https://github.com/visionmedia/debug#readme






猜你喜欢

转载自sillycat.iteye.com/blog/2421922
今日推荐