Lambda does not continue after calling ssm getParameter

Viewed 176

I have been having problems getting data from the parameterStore, but they have not been successful and lambda is waiting for the response of the ssm.

Basically I have this code

lambda.js

const serverlessExpress = require('@vendia/serverless-express')
const { Context, Handler } = require('aws-lambda');
var credentials;
var data;
const { getEncryptedParameter } = require('./parameterStore')
let cachedServer;
const app = require('./app')

async function obtainsData() {
    try {
        if (!credentials) {
            console.log("getting credential!!!!")
            credentials = await getEncryptedParameter('my_parameter')
        } else {
            console.log("context!!!!")
        }
        return credentials;
    } catch (error) {
        console.log("error obtainCredentials", error)
    }

}


async function toServer() {
    if (!cachedServer) {

        data = await obtainsData();
        console.log(data)
        process.env.RDS_PASSWORD = data ? data : null
        
        cachedServer = serverlessExpress({ app });
    }

    return cachedServer;
}



exports.handler = async (event, context, callback) => {
    const server = await toServer();
    console.log("after await")
    return server(event, context, callback);
};

parameterStore.js

const { SSM } = require("aws-sdk");

const getParameterWorker = async (name, decrypt) => {
    const ssm = new SSM({region: process.env.REGION || 'us-east-2'});
    const result = await ssm
    .getParameter({ Name: name, WithDecryption: decrypt })
    .promise();
    return result.Parameter.Value;
}

async function getParameter(name) {
    return await getParameterWorker(name,false);
}

async function getEncryptedParameter (name) {
    return await getParameterWorker(name,true);
}

module.exports = {
    getParameter,
    getEncryptedParameter
}

app.js

var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');
const { getCurrentInvoke } = require('@vendia/serverless-express')
var usersRouter = require('./routes/users');
const { event, context } = getCurrentInvoke()//event and context from lambda


var app = express();

//const router = express.Router()
app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));


app.use(cookieParser());

app.use('/users', usersRouter);

app.use(function (req, res, next) {
    res.status(404);
    res.json({ "error": { "statusCode": "404", "code": "path unrecognized" } });
});

app.use(function (err, req, res, next) {
    res.status(500);
    res.json({ "status": "error", "msg": err.toString() });
});

module.exports = app;

users.js

var express = require('express');
var router = express.Router();

router.get('/sample/test', async function (req, res, next) {
    console.log("testing.....")
    
    

});


module.exports = router;

Testing inside lambda the answer is...

 Version: $LATEST
INFO getting credential!!!!
END RequestId: 
ask timed out after 180.02 seconds

Any idea why it doesn't go over toServer?

PD: Lambda has read permissions for any resource in aws/parameterStore

0 Answers
Related