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
}
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)