2

enter image description here

I'm getting started trying to write a lambda function with node and puppeteer. I'm using the serverless framework

I've been trying to follow https://codissimo.sinumo.tech/2019/12/27/serverless-puppeteer-with-aws-lambda-layers-and-node-js/ to utilize the provisioned chrome at https://github.com/shelfio/chrome-aws-lambda-layer . My function is working as expected locally.

my handler.js contains:

module.exports.main = async event => {
    console.log('IN HANDLER');

  return {
    statusCode: 200,
    body: JSON.stringify(
      {
        message: 'main function executed!',
        input: event,
      },
      null,
      2
    ),
  };

my index.js contains a longrunning (45- 60 seconds) puppeteer function (main ) which returns an array of objects:

async function main(event, context, callback) {
  const chromium = require('chrome-aws-lambda');

 ...................................

 var obj_arr = [];
  var keys = head[0];
  for (let index = 0; index < body.length; index++) {
    var row = body[index];
    var obj = {};
    for (let i = 0; i < keys.length; i++) {
      var k = keys[i];
      obj[k] = row[i];
      console.log(obj);

    }
    obj_arr.push(obj);

  };

  console.log(obj_arr);
  return obj_arr;

After uploading my function to lambda using serverless framework without error. I followed the directions at the bottom of the article about testing the pre provisioned chrome in my layers dashboard. As you can see in the screenshot it appears to be working correctly.

being brand new to this I don't understand the log output:

START RequestId: f62dcf47-e2ff-4a96-9807-b34c39f218e3 Version: $LATEST
2020-05-31T19:10:21.280Z    f62dcf47-e2ff-4a96-9807-b34c39f218e3    INFO    SERVERLESS_ENTERPRISE {"c":true,"b":"H4sIAAAAAAAAA7VWbU/cOBD+Kyi6D3fSJms7ifNSIR1aoK1UKsouVe+ADyZxdlMSO9gJL0X732+cZF9ZEJzUL7CZeTyemWf82E+WVPk0F1Zs6ULbbMpFbQ0sncx4yb5zpXNpfMhBYK3zkuualRVYCCLIRr7t4gmOYoxigh0ShP8CTPHbBnCfU4BllKRJ5gU2J1lmeyyidhSiwL52vcSNMoJD7prIjxUHdK2Y0CypzaYDq2KPhWQQ5anPZ9KhtK0rJl7MUlZcMRPiKys7+FpYO2vEIj6UoupJ3oJ2l+OZcrhIXwW1NadNt6cVuw5ClAQuxIcsR1LU/KE2NUAWCX9PU8z6Fo+J5+IsRLYbUNf2QopsljFkezhKSYhpwMNrwD9MljucSVnvY9vnqYcwTgDpRiRKeeZSlvihl0VeSpIo+XDKFDC+j9yMJggSSVOCvYR/GAPLBU/3kTUHdthU72Dhpbb+z9lpmy3V1BQgmqIYWKyqijzZ4JIXBVdmE67u8oSvmesZL5hIhbzvqJ0unCm/A8siwZ0rbMDYJctFn6hsgDE6sBJZVk3N+4rZvXYKVl6nzFq6zhpRd8Ox8jpCpvyndjBxMHXcNTCfdi1ptM2Zrm288p3wUqrHcf7LxMKIeNuuc80Ns0+XltL6EuYsotSn1BtcWjPOqomsWQFmjJChmvZmswqslLoB8kIwwjByJToojjANw/n2TqdcJTAU0MFuT+T4oR+5gb/EmamGbnF1XnXVI6iUBL7nmrnvQZ/1SBbp2BwyK65Vw1ceAfwIGFVxJzt6RxL6CBmtdmh0Lcvx5sD1PhtabW8Tsb5ge/Y2IMdvHYSdq1ah//hyMDkaT7aBB8o4mRIxZBl3WcZLvmPs+6ZN1EUejRczGb8xidfmp0O8MkUdwLT8hq+O2Gbu9/rs/dq9EeLHb9GgrU2+yOlHJZuqp3AInR52nR6+sZMQYVwrzso+hFGkIfKHLh5e9MReURJGDLtpkEQIimchYYTD34S51zjJyHbMI3F3WrA6k6qEiEUumocdkAOVzMD9QJ9RA86OvvYow2EgOIJJ8T3vJeCx4tyc+MAPgBhMn+NGVQPKbV2AapQgSubUX1qf4Uoq/jz7a+8Hl8L8P1Uy4VpLtff3HnF89PHTr0sLtEJXvFUP4iMEn62EwycEa0B/WwVpHQKUGL7MT/1oEL7b2vO0MHYSwqh0IXJ1a4Dz+eA3ZdQ7nmVEvK2MCA42M7oyV/0dDGIvN424gQkSS+vb7q8WO5YNKOjiiLWmXp6MqC6vJK6UVKuj2H4es5b7NcuoKSqV1xu2o4eEV0Y5ulx3eU6gfe1mu5yQR3LTvkcW/rW7/D1PjpoLJjq1kG3kmYQ2YaNLcHmf58ZRfvqZfvNn3yYn9+NDF539g5cLO8D3sNCH09vR4bFOk1l0gkzkqmjgWbqSW9ehThu3NqdjDE8jbfh976sKXjOFbF8z8+6BBT8vrhYct++ci6v5/D/G0CmZFwsAAA==","origin":"sls-agent"}
END RequestId: f62dcf47-e2ff-4a96-9807-b34c39f218e3
REPORT RequestId: f62dcf47-e2ff-4a96-9807-b34c39f218e3  Duration: 14.09 ms  Billed Duration: 100 ms Memory Size: 1024 MB    Max Memory Used: 71 MB  Init Duration: 190.72 ms  

I get a similar log output when I run my deployed function through the api gatewaybut I don't see either the console.log In my function locally I am able to see console.log statements or the returned array of objects which I see when I run locally. How to I see those in my deployed lambda function when I run it?

EDIT:

I've added a screenshot of what I think you are referring to. I don't see the console logged output I see locally. Can you explain further or am I looking in the wrong place?

enter image description here

EDIT1:

{ origin: 'sls-agent',
  schemaVersion: '0.0',
  timestamp: '2020-06-03T13:13:52.763Z',
  requestId: 'f4a4cb9b-3e09-46d3-adba-6f14753cdce3',
  type: 'transaction',
  payload:
   { schemaType: 's-span',
     .....
     tags:
      { schemaType: 's-transaction-function',
        schemaVersion: '0.0',
        timestamp: '2020-06-03T13:13:52.758Z',
        orgId: null,
        applicationName: 'xxxx',
        serviceName: 'xxxxxx',
        stageName: 'dev',
        functionName: 'xxxxx-dev-main',
        timeout: 6,
        computeType: 'aws.lambda',
        computeRuntime: 'aws.lambda.nodejs.12.16.3',
        computeRegion: 'us-east-1',
        computeMemorySize: '1024',
        computeMemoryUsed:
         '{"rss":39337984,"heapTotal":10039296,"heapUsed":6716000,"external":1191688}',
         ......
        eventCustomRequestTime: '03/Jun/2020:13:13:51 +0000',
        eventCustomRequestTimeEpoch: 1591190031809,
        eventCustomHttpPath: '/main/get',
        eventCustomHttpMethod: 'GET',
        eventCustomXTraceId: 'Root=1-5ed7a20f-9a64d880002f1600092ec680',
        eventCustomXForwardedFor: null,
        eventCustomUserAgent:
         'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:77.0) Gecko/20100101 Firefox/77.0',
        errorId: null,
        errorFatal: null,
        errorCulprit: null,
        errorExceptionType: null,
        errorExceptionMessage: null,
        errorExceptionStacktrace: null,
        transactionId: '77fef8cb-3f2c-4f5a-be2c-7fcd51e9ed92',
        tenantId: 'option88',
        appUid: 'mHjdQ5hQ0RY1',
        tenantUid: 'V8lsDgch9M0b',
        pluginVersion: '3.6.11',
        totalSpans: 0,
        traceId: 'f4a4cb9b-3e09-46d3-adba-6f14753cdce3' },
     logs: {},
     spans: [],
     eventTags: [] } }

Edit2:

enter image description here

Edit3:

I changed the handler to :

'use strict';
var index = require('./index.js');

module.exports.main = async event => {
  var res = await index.main();

  console.log('hello');
  console.log(res);

  console.log('IN HANDLER');
  return {
    statusCode: 200,
    body: JSON.stringify(
      {
        message: 'main function executed!',
        input: event,
      },
      null,
      2
    ),
  };


};

Now seeing error messages.

user1592380
  • 34,265
  • 92
  • 284
  • 515

2 Answers2

3

The logs written to CloudWatch by your Lambda function seem to be Base64 encoded and compressed with the gzip format. This looks like the behavior of the serverless enterprise plugin after issues regarding high costs for CloudWatch were opened.

To retrieve the original logs, you can try running the following Node.js code and pass in the encoded log string.

function getReadableLogs(encodedLogs) {
    const decodedLog = Buffer.from(encodedLogs, 'base64'); // Decode log data
    const parsed = JSON.parse(zlib.gunzipSync(decodedLog).toString('utf8')); // Decompress log data
    return parsed;
}
Paradigm
  • 1,876
  • 1
  • 12
  • 16
  • Thank you , I can now see the logs in a human readable way. I've attached an edited output above in edit1. However the 'logs' field in the bottom is empty. Any other ideas on why I don't see them? – user1592380 Jun 03 '20 at 13:57
  • Hmm, it seems that particular log event was only for the `SERVERLESS PLATFORM` logs, from looking at the [source code](https://github.com/serverless/enterprise-plugin/blob/f7d513c3d13af6859292f5eeae809578f5500677/lib/logsCollection.js). So you don't see anything in the `logs` JSON object because there weren't any for the plugin. Could you try adding a log statement right after the start of your Lambda handler to check if that shows up? – Paradigm Jun 03 '20 at 14:31
  • I changed the handler as above. Deployed and sent a request to it. The logs object is still empty , but you can see the phrase 'IN HANDLER' under info – user1592380 Jun 04 '20 at 02:06
  • The `logs` object would only be populated with the serverless plugin logs. Your Lambda log statements should show up separately as you now see. I'm guessing the log statements in the `index.js` file aren't printed because that code is never invoked. Note: When the Lambda function is invoked, the code inside the defined Lambda handler is called, your handler code does not seem to call any function in the `index.js` file. – Paradigm Jun 04 '20 at 05:19
  • I'm just getting my feet wet with node , but I assumed 'module.exports.main = async event => { ' was running the "main" function which I exported from index.js.. Is this wrong? If so how do I import and run a function from a different file in handler.js? – user1592380 Jun 04 '20 at 12:28
  • Google that! You can refer to this [SO](https://stackoverflow.com/questions/5797852/in-node-js-how-do-i-include-functions-from-my-other-files?rq=1) question on how to call functions present in another file. Since you're using asynchronous methods, you'll also need to understand how the async/await keywords work. [This](https://javascript.info/async-await) would help with that. – Paradigm Jun 04 '20 at 15:28
0

These are accessible in CloudWatch logs.

If you access in the region you execute the Lambda in it should have a log group of /aws/lambda/functionname.

Then a stream of the save revision

Chris Williams
  • 32,215
  • 4
  • 30
  • 68