Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

AWS lambda nodejs runtime: io: read/write on closed pipe

I am trying to execute a couple of async requests from a lambda function. The first call resolveEndpoints() succeeds and the second fails with

2017/11/03 17:13:27 Function oauth.callbackHandler timed out after 3 seconds

2017/11/03 17:13:27 Error invoking nodejs6.10 runtime: io: read/write on closed pipe

The handler is:

exports.callbackHandler = async (event, context, callback) => {
    context.callbackWaitsForEmptyEventLoop = false;

    let endpoints: any = await resolveEnpoints();

    config.accessTokenUri = endpoints.token_endpoint;

    let tokenRequestPath =
    `http://localhost:7001${event.path}?code=${event.queryStringParameters.code}&realmId=${event.queryStringParameters.realmId}&`;

    let accessToken: any = await getAuthToken(tokenRequestPath);

    callback(undefined, {statusCode: 200, body: JSON.stringify(accessToken.data)});
};

If I remove the resolveEndpoint() call then getAuthToken() succeeds.

resolveEndpoint() returns a promise that resolves once the request has completed.

const resolveEnpoints = async () => {
    return new Promise((resolve, reject) => {
        request({
            url: config.sandboxEndpoint,
            headers: {
                'Accept': 'application/json'
            }
        }, (err, response) => {
            if (err) {
                reject(err);
            }

            let payload = JSON.parse(response.body);
            resolve(payload);
        });
    });
};
like image 364
nilobarp Avatar asked Nov 03 '17 06:11

nilobarp


1 Answers

Lambda's default timeout is 3 seconds and I was hitting that beyond a single HTTP call. Just need to update SAM Template to increase the timeout for handlers that needs to call multiple third party services.

Updated template with timeout set to 10 seconds allows the handler to run to completion.

AWSTemplateFormatVersion : '2010-09-09'
Transform: AWS::Serverless-2016-10-31

Description: |
  Data service

Resources:
  OAuthCallback:
    Type: AWS::Serverless::Function
    Properties:
      Runtime: nodejs6.10
      CodeUri: ./build/services/quickbooks
      Handler: oauth2.callbackHandler
      Timeout: 10
      Events:
        AuthRoute:
          Type: Api
          Properties:
            Path: /oauth2/callback
            Method: get
like image 166
nilobarp Avatar answered Nov 03 '22 11:11

nilobarp