1
votes

Hey guys anyone here had success breakpointing a lambda function ran locally with visual studio code and nodejs8.10? I wonder if it's because my project is typescript. I've followed https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-using-debugging-nodejs.html to no avail.

The function runs, if I do stopOnEntry: true vscode stops on some file, but not on my actual function's breakpoints.

Output:

$ sam local invoke ConsumeSQSFunction --no-event --region us-west-2 -d 5858
2019-04-30 11:19:16 Found credentials in shared credentials file: ~/.aws/credentials
2019-04-30 11:19:16 Invoking index.processPublisherServicesQueue (nodejs8.10)

Fetching lambci/lambda:nodejs8.10 Docker container image......
2019-04-30 11:19:17 Mounting /home/dev/Documents/xxxx/main-dir/dist/lambda-section/consume-sqs as /var/task:ro,delegated inside runtime container
Debugger listening on ws://0.0.0.0:5858/74f34edb-cdcd-4da0-82c0-950f5d809fd9
For help see https://nodejs.org/en/docs/inspector
Debugger attached.
START RequestId: 1a4198ca-cceb-1b38-f251-386a239dad19 Version: $LATEST
2019-04-30T18:19:19.800Z        1a4198ca-cceb-1b38-f251-386a239dad19    Hello World!
2019-04-30T18:19:19.800Z        1a4198ca-cceb-1b38-f251-386a239dad19    Processing queue {} [] undefined
END RequestId: 1a4198ca-cceb-1b38-f251-386a239dad19
REPORT RequestId: 1a4198ca-cceb-1b38-f251-386a239dad19  Duration: 199.46 ms     Billed Duration: 200 ms Memory Size: 128 MB     Max Memory Used: 45 MB

{"statusCode":200,"body":"{\"message\":\"hello world\"}"}
Waiting for the debugger to disconnect...

Project structure:

launch.json
/main-dir
   /app
        /lambda-section (where I did sam init)
               /ConsumeSQS
                   index.ts
              template.yaml
              event.json
        /etc
   /dist
       /lambda-section
         /ConsumeSQS
            index.js
            index.js.map

Relevant section from template.yaml

Resources:
  ConsumeSQSFunction:
    Type: AWS::Serverless::Function # More info about Function Resource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction
    Properties:
      FunctionName: ConsumeSQS
      Description: 'Consumes messages from SQS queue'
      CodeUri: ../../dist/lambda-section/consume-sqs/
      Handler: index.processPublisherServicesQueue
      Runtime: nodejs8.10

launch.json:

,
        {
            "name": "Attach to SAM CLI",
            "type": "node",
            "request": "attach",
            "address": "localhost",
            "port": 5858,
            // From the sam init example, it would be "${workspaceRoot}/hello_world"
            "localRoot": "${workspaceRoot}/main-dir/app/lambda-section",
            "remoteRoot": "/var/task",
            "protocol": "inspector",
            "stopOnEntry": false
        }
1

1 Answers

1
votes

I think the issue is that you have not configured source maps.

When you run SAM, the code that actually invokes is dist/lambda-section/ConsumeSQS/index.js, ad even that is required through a wrapper (which is what you see when you stopOnEntry.)

I suggest you add "sourceMaps": true to your launch.json. If that works then great, however you may also need to use the sourceMapPathOverrides key.

If you checkout the contents of your dist/.../index.js and matching map you should be able to see the different between the source map paths referenced in those files, and the paths to the actual typescript files. You can then provide the overrides accordingly as a map, for example:

"sourceMapPathOverrides": {
  "file:///lambda-section/ConsumeSQS/*": "${workspaceRoot}/main-dir/app/lambda-section/*"
}

(n.b. more information about these attributes can be found in the VSCode documentation)