Skip to content

Latest commit

History

History

Folders and files

NameName
Last commit message
Last commit date

parent directory

..

README.md

NodeJS Logo

NodeJS Lambda Debugging Workshop

1. Cloning the sample code and set the SQS queue URL

First clone this repository to your local machine and open the sample-lambda-code sub directory with your IDE. This directory contains is a sample lambda function, which extracts a message from the Lambda event and then publishes it to a pre-defined SQS queue.

Setting the SQS URL

For this sample code to work, you need to have a SQS queue created in your AWS account. For that, log into the SQS (Simple Queue Service) console of your AWS account and create a new SQS queue. After the queue is created, you can see its URL and the ARN in the Details tab as below. Please note them down for later use.

New SQS queue details

If you already have a queue that can be used for this activity, that can also be used instead of creating a new one.

  • Then open the index.js file of the sample code and specify the above Queue URL as the value of the SQS_URL constant.
const SQS_URL = 'https://sqs.us-east-1.amazonaws.com/123456789000/my-message-queue';

2. Including the SLAppForge Lambda Debug Proxy to the Lambda function

The next step is to include the SLAppForge Lambda Debug Proxy module to the function code. For that, simply add the below require statement to the very end of the index.js file.

require('slappforge-lambda-debug-proxy');

Since we are going to provide this module through a Lambda Layer later, it is not required to install this as a npm dependency (unless you need to run your Lambda code locally). Therefore any warnings indicated by the IDE regarding that can be safely ignored.

Important

If you intend to use Visual Studio Code as the IDE for the debugging, please add a debugger; statement as the very first line of the function handler.

const AWS = require('aws-sdk');
let sqs = new AWS.SQS();
const SQS_URL = '<specify-your-queue-url-here>';
exports.handler = async (event, context) => {
debugger;
// rest of the function code
};
require('slappforge-lambda-debug-proxy');

Once this line is added, create a zip file containing the Lambda code to be uploaded to AWS later.

3. Creating and configuring the Lambda function

Create a new Lambda function

Login to the AWS Lambda Console and create a new Lambda function using NodeJS (either 10.x or 12.x) as the runtime. Let's name it as SQSMessagePublisher. For the execution role configuration, choose the Create a new role with basic Lambda permissions option.

Creating a new Lambda

Upload the code

Once the Lambda function is created, scroll down to the Function code section and choose the Code Entry Type as Upload a .zip file. Then upload the previously created ZIP file containing the sample Lambda code.

Then set the Handler name correctly based on how the function code was bundled into the ZIP file. For example, if the index.js is without any enclosing directory, the handler name should be index.handler. If index.js is enclosed inside a directory (e.g.: sample-lambda-code/index.js), the handler name should be sample-lambda-code/index.handler.

Add the Lambda Debug Proxy Layer

Click on the Layers button on the Designer section and choose to Add a layer. Then select Provide a layer version ARN option and provide the ARN of the SLAppForge Live Debug for AWS - NodeJS layer, which contains the slappforge-lambda-debug-proxy module. Based on the region of the Lambda function, pick the correct layer ARN from the below table.

RegionLayer ARN
us-east-1arn:aws:lambda:us-east-1:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
us-east-2arn:aws:lambda:us-east-2:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
us-west-1arn:aws:lambda:us-west-1:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
us-west-2arn:aws:lambda:us-west-2:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
ap-south-1arn:aws:lambda:ap-south-1:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
ap-northeast-1arn:aws:lambda:ap-northeast-1:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
ap-northeast-2arn:aws:lambda:ap-northeast-2:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
ap-southeast-1arn:aws:lambda:ap-southeast-1:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
ap-southeast-2arn:aws:lambda:ap-southeast-2:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
ca-central-1arn:aws:lambda:ca-central-1:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
eu-central-1arn:aws:lambda:eu-central-1:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
eu-west-1arn:aws:lambda:eu-west-1:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
eu-west-2arn:aws:lambda:eu-west-2:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
eu-west-3arn:aws:lambda:eu-west-3:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
eu-north-1arn:aws:lambda:eu-north-1:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
sa-east-1arn:aws:lambda:sa-east-1:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1

Adding Debug Proxy Layer

Grant SQS publish permission

Since the Lambda function is supposed to publish messages to the SQS queue, SQS publishing permission should be granted to the Lambda execution role. For that, switch to the Permissions tab on the Lambda function console and click on the Manage these permissions on the IAM console link.

Once the Lambda execution role is opened in the AWS IAM console, add a new Inline Policy with the following parameters.

ParameterValue
ServiceSQS
ActionsWrite -> SendMessage
ResourcesARN of the SQS queue created in the 1st step

SQS Publish Permission

Create a test event

To invoke the Lambda function, create a new Test Event on the Lambda console with the following JSON.

{
"message": "Hello World!"
}

Lambda Test Event

Then invoke the test event to see if our Lambda code works without any issues. If it was successful, the SQS console can be used to check if the queue has received the message.

Configure Lambda environment variables

Then the following environment variables must be set for the Lambda function with the appropriate values. These are used by the debug proxy to decide whether to enable debug mode and also to connect with the broker server.

NameRequiredDescription
SLAPP_DEBUGGER_ACTIVEThis is the flag that indicates whether the Lambda should be invoked in debug mode or not. Setting this to true will enable debugging.
SLAPP_KEYThis is the Access Key obtained from the access key manager
SLAPP_SECRETThis is the Access Secret obtained from the access key manager
SLAPP_SESSIONThis is a unique ID to distinguish this Lambda function for debugger to connect. This can be any string value.

Lambda Environment Variables

Also make sure to set a reasonable Timeout value for the Lambda function, so that you have enough time for debugging, before the Lambda function runs out of time. Generally a timeout of 3-5 minutes would be adequate for a typical debugging session.


4. Installing and running the Local Client

The Local Client module of the toolkit should be installed as a global NPM dependency on the developer machine.

npm i slappforge-debug-client -g

Then it can be invoked via a terminal providing the following arguments.

Short ArgumentLong ArgumentRequiredDescription
-f--sessionThis is a unique ID set as the SLAPP_SESSION variable of the Lambda function
-k--keyThis is the Access Key obtained from the access key manager
-x--secretThis is the Access Secret obtained from the access key manager
slp-debug-client -k=abcd-efgh-1234-5678 -x=abc123def456ghi789 -f=MyDebuggerSession

Local Client


5. Configuring the IDE Debugger

IntelliJ IDEA / WebStorm

  • Open the project containing the Lambda source code and create a new Run/Debug Configuration selecting Attach to NodeJS/Chrome as the type from left side panel
  • Provide any name for the Run/Debug profile
  • Configure the Host as localhost and the Port as 9249
  • Select the Attach to type as Chrome or NodeJS > 6.3 started with --inspect
  • Click Apply and then OK

WebStorm Debugger Config

VS Code

  • Open the workspace containing the Lambda source code and add a new launch configuration similar to below. You can provide any name for the name field. Launch type: Node.JS: Attach to Remote.
{
"type": "node",
"request": "attach",
"name": "Attach to Remote Lambda",
"address": "127.0.0.1",
"port": 9249,
"localRoot": "${workspaceFolder}",
"remoteRoot": "/var/task",
"outFiles": [
"${workspaceFolder}/**/*.js"
]
}

Based on your VS Code version, the configuration fields may slightly vary. For example, in 1.46: launch config type = Node.JS: Attach to Remote; type = pwa-node and outFiles becomes skipFiles.

  • If your Lambda source code is in a sub directory of the current workspace, you have to append that sub path to the localRoot field.
"localRoot": "${workspaceFolder}/subPath"
  • Similarly, if your Lambda deployment bundle has an enclosing directory, you have to append that also to the remoteRoot field.
"remoteRoot": "/var/task/MyLambda"
  • Finally save the launch.json file

6. Running the Debugger

  • First start the Local Client providing the necessary parameters as mentioned in step 4.
  • Then invoke the Lambda with the previously created test event.
  • Then the Lambda execution will suspend waiting for a debugger to connect.
  • Finally invoke the Debugger from the IDE and wait for a couple of seconds for it to connect through. If you are using WebStorm or IntelliJ IDEA, make sure to add at least one debug breakpoint before you invoke the IDE debugger, so that the Lambda execution will suspend at that point.
  • Happy Debugging!
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
lambda-debugging-workshops/nodejs-debugging at master · slappforge/lambda-debugging-workshops · GitHub
Skip to content

Latest commit

History

History

Folders and files

NameName
Last commit message
Last commit date

parent directory

..

README.md

NodeJS Logo

NodeJS Lambda Debugging Workshop

1. Cloning the sample code and set the SQS queue URL

First clone this repository to your local machine and open the sample-lambda-code sub directory with your IDE. This directory contains is a sample lambda function, which extracts a message from the Lambda event and then publishes it to a pre-defined SQS queue.

Setting the SQS URL

For this sample code to work, you need to have a SQS queue created in your AWS account. For that, log into the SQS (Simple Queue Service) console of your AWS account and create a new SQS queue. After the queue is created, you can see its URL and the ARN in the Details tab as below. Please note them down for later use.

New SQS queue details

If you already have a queue that can be used for this activity, that can also be used instead of creating a new one.

  • Then open the index.js file of the sample code and specify the above Queue URL as the value of the SQS_URL constant.
const SQS_URL = 'https://sqs.us-east-1.amazonaws.com/123456789000/my-message-queue';

2. Including the SLAppForge Lambda Debug Proxy to the Lambda function

The next step is to include the SLAppForge Lambda Debug Proxy module to the function code. For that, simply add the below require statement to the very end of the index.js file.

require('slappforge-lambda-debug-proxy');

Since we are going to provide this module through a Lambda Layer later, it is not required to install this as a npm dependency (unless you need to run your Lambda code locally). Therefore any warnings indicated by the IDE regarding that can be safely ignored.

Important

If you intend to use Visual Studio Code as the IDE for the debugging, please add a debugger; statement as the very first line of the function handler.

const AWS = require('aws-sdk');
let sqs = new AWS.SQS();
const SQS_URL = '<specify-your-queue-url-here>';
exports.handler = async (event, context) => {
debugger;
// rest of the function code
};
require('slappforge-lambda-debug-proxy');

Once this line is added, create a zip file containing the Lambda code to be uploaded to AWS later.

3. Creating and configuring the Lambda function

Create a new Lambda function

Login to the AWS Lambda Console and create a new Lambda function using NodeJS (either 10.x or 12.x) as the runtime. Let's name it as SQSMessagePublisher. For the execution role configuration, choose the Create a new role with basic Lambda permissions option.

Creating a new Lambda

Upload the code

Once the Lambda function is created, scroll down to the Function code section and choose the Code Entry Type as Upload a .zip file. Then upload the previously created ZIP file containing the sample Lambda code.

Then set the Handler name correctly based on how the function code was bundled into the ZIP file. For example, if the index.js is without any enclosing directory, the handler name should be index.handler. If index.js is enclosed inside a directory (e.g.: sample-lambda-code/index.js), the handler name should be sample-lambda-code/index.handler.

Add the Lambda Debug Proxy Layer

Click on the Layers button on the Designer section and choose to Add a layer. Then select Provide a layer version ARN option and provide the ARN of the SLAppForge Live Debug for AWS - NodeJS layer, which contains the slappforge-lambda-debug-proxy module. Based on the region of the Lambda function, pick the correct layer ARN from the below table.

RegionLayer ARN
us-east-1arn:aws:lambda:us-east-1:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
us-east-2arn:aws:lambda:us-east-2:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
us-west-1arn:aws:lambda:us-west-1:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
us-west-2arn:aws:lambda:us-west-2:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
ap-south-1arn:aws:lambda:ap-south-1:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
ap-northeast-1arn:aws:lambda:ap-northeast-1:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
ap-northeast-2arn:aws:lambda:ap-northeast-2:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
ap-southeast-1arn:aws:lambda:ap-southeast-1:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
ap-southeast-2arn:aws:lambda:ap-southeast-2:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
ca-central-1arn:aws:lambda:ca-central-1:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
eu-central-1arn:aws:lambda:eu-central-1:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
eu-west-1arn:aws:lambda:eu-west-1:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
eu-west-2arn:aws:lambda:eu-west-2:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
eu-west-3arn:aws:lambda:eu-west-3:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
eu-north-1arn:aws:lambda:eu-north-1:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
sa-east-1arn:aws:lambda:sa-east-1:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1

Adding Debug Proxy Layer

Grant SQS publish permission

Since the Lambda function is supposed to publish messages to the SQS queue, SQS publishing permission should be granted to the Lambda execution role. For that, switch to the Permissions tab on the Lambda function console and click on the Manage these permissions on the IAM console link.

Once the Lambda execution role is opened in the AWS IAM console, add a new Inline Policy with the following parameters.

ParameterValue
ServiceSQS
ActionsWrite -> SendMessage
ResourcesARN of the SQS queue created in the 1st step

SQS Publish Permission

Create a test event

To invoke the Lambda function, create a new Test Event on the Lambda console with the following JSON.

{
"message": "Hello World!"
}

Lambda Test Event

Then invoke the test event to see if our Lambda code works without any issues. If it was successful, the SQS console can be used to check if the queue has received the message.

Configure Lambda environment variables

Then the following environment variables must be set for the Lambda function with the appropriate values. These are used by the debug proxy to decide whether to enable debug mode and also to connect with the broker server.

NameRequiredDescription
SLAPP_DEBUGGER_ACTIVEThis is the flag that indicates whether the Lambda should be invoked in debug mode or not. Setting this to true will enable debugging.
SLAPP_KEYThis is the Access Key obtained from the access key manager
SLAPP_SECRETThis is the Access Secret obtained from the access key manager
SLAPP_SESSIONThis is a unique ID to distinguish this Lambda function for debugger to connect. This can be any string value.

Lambda Environment Variables

Also make sure to set a reasonable Timeout value for the Lambda function, so that you have enough time for debugging, before the Lambda function runs out of time. Generally a timeout of 3-5 minutes would be adequate for a typical debugging session.


4. Installing and running the Local Client

The Local Client module of the toolkit should be installed as a global NPM dependency on the developer machine.

npm i slappforge-debug-client -g

Then it can be invoked via a terminal providing the following arguments.

Short ArgumentLong ArgumentRequiredDescription
-f--sessionThis is a unique ID set as the SLAPP_SESSION variable of the Lambda function
-k--keyThis is the Access Key obtained from the access key manager
-x--secretThis is the Access Secret obtained from the access key manager
slp-debug-client -k=abcd-efgh-1234-5678 -x=abc123def456ghi789 -f=MyDebuggerSession

Local Client


5. Configuring the IDE Debugger

IntelliJ IDEA / WebStorm

  • Open the project containing the Lambda source code and create a new Run/Debug Configuration selecting Attach to NodeJS/Chrome as the type from left side panel
  • Provide any name for the Run/Debug profile
  • Configure the Host as localhost and the Port as 9249
  • Select the Attach to type as Chrome or NodeJS > 6.3 started with --inspect
  • Click Apply and then OK

WebStorm Debugger Config

VS Code

  • Open the workspace containing the Lambda source code and add a new launch configuration similar to below. You can provide any name for the name field. Launch type: Node.JS: Attach to Remote.
{
"type": "node",
"request": "attach",
"name": "Attach to Remote Lambda",
"address": "127.0.0.1",
"port": 9249,
"localRoot": "${workspaceFolder}",
"remoteRoot": "/var/task",
"outFiles": [
"${workspaceFolder}/**/*.js"
]
}

Based on your VS Code version, the configuration fields may slightly vary. For example, in 1.46: launch config type = Node.JS: Attach to Remote; type = pwa-node and outFiles becomes skipFiles.

  • If your Lambda source code is in a sub directory of the current workspace, you have to append that sub path to the localRoot field.
"localRoot": "${workspaceFolder}/subPath"
  • Similarly, if your Lambda deployment bundle has an enclosing directory, you have to append that also to the remoteRoot field.
"remoteRoot": "/var/task/MyLambda"
  • Finally save the launch.json file

6. Running the Debugger

  • First start the Local Client providing the necessary parameters as mentioned in step 4.
  • Then invoke the Lambda with the previously created test event.
  • Then the Lambda execution will suspend waiting for a debugger to connect.
  • Finally invoke the Debugger from the IDE and wait for a couple of seconds for it to connect through. If you are using WebStorm or IntelliJ IDEA, make sure to add at least one debug breakpoint before you invoke the IDE debugger, so that the Lambda execution will suspend at that point.
  • Happy Debugging!
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' lambda-debugging-workshops/nodejs-debugging at master · slappforge/lambda-debugging-workshops · GitHub
Skip to content

Latest commit

History

History

Folders and files

NameName
Last commit message
Last commit date

parent directory

..

README.md

NodeJS Logo

NodeJS Lambda Debugging Workshop

1. Cloning the sample code and set the SQS queue URL

First clone this repository to your local machine and open the sample-lambda-code sub directory with your IDE. This directory contains is a sample lambda function, which extracts a message from the Lambda event and then publishes it to a pre-defined SQS queue.

Setting the SQS URL

For this sample code to work, you need to have a SQS queue created in your AWS account. For that, log into the SQS (Simple Queue Service) console of your AWS account and create a new SQS queue. After the queue is created, you can see its URL and the ARN in the Details tab as below. Please note them down for later use.

New SQS queue details

If you already have a queue that can be used for this activity, that can also be used instead of creating a new one.

  • Then open the index.js file of the sample code and specify the above Queue URL as the value of the SQS_URL constant.
const SQS_URL = 'https://sqs.us-east-1.amazonaws.com/123456789000/my-message-queue';

2. Including the SLAppForge Lambda Debug Proxy to the Lambda function

The next step is to include the SLAppForge Lambda Debug Proxy module to the function code. For that, simply add the below require statement to the very end of the index.js file.

require('slappforge-lambda-debug-proxy');

Since we are going to provide this module through a Lambda Layer later, it is not required to install this as a npm dependency (unless you need to run your Lambda code locally). Therefore any warnings indicated by the IDE regarding that can be safely ignored.

Important

If you intend to use Visual Studio Code as the IDE for the debugging, please add a debugger; statement as the very first line of the function handler.

const AWS = require('aws-sdk');
let sqs = new AWS.SQS();
const SQS_URL = '<specify-your-queue-url-here>';
exports.handler = async (event, context) => {
debugger;
// rest of the function code
};
require('slappforge-lambda-debug-proxy');

Once this line is added, create a zip file containing the Lambda code to be uploaded to AWS later.

3. Creating and configuring the Lambda function

Create a new Lambda function

Login to the AWS Lambda Console and create a new Lambda function using NodeJS (either 10.x or 12.x) as the runtime. Let's name it as SQSMessagePublisher. For the execution role configuration, choose the Create a new role with basic Lambda permissions option.

Creating a new Lambda

Upload the code

Once the Lambda function is created, scroll down to the Function code section and choose the Code Entry Type as Upload a .zip file. Then upload the previously created ZIP file containing the sample Lambda code.

Then set the Handler name correctly based on how the function code was bundled into the ZIP file. For example, if the index.js is without any enclosing directory, the handler name should be index.handler. If index.js is enclosed inside a directory (e.g.: sample-lambda-code/index.js), the handler name should be sample-lambda-code/index.handler.

Add the Lambda Debug Proxy Layer

Click on the Layers button on the Designer section and choose to Add a layer. Then select Provide a layer version ARN option and provide the ARN of the SLAppForge Live Debug for AWS - NodeJS layer, which contains the slappforge-lambda-debug-proxy module. Based on the region of the Lambda function, pick the correct layer ARN from the below table.

RegionLayer ARN
us-east-1arn:aws:lambda:us-east-1:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
us-east-2arn:aws:lambda:us-east-2:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
us-west-1arn:aws:lambda:us-west-1:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
us-west-2arn:aws:lambda:us-west-2:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
ap-south-1arn:aws:lambda:ap-south-1:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
ap-northeast-1arn:aws:lambda:ap-northeast-1:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
ap-northeast-2arn:aws:lambda:ap-northeast-2:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
ap-southeast-1arn:aws:lambda:ap-southeast-1:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
ap-southeast-2arn:aws:lambda:ap-southeast-2:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
ca-central-1arn:aws:lambda:ca-central-1:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
eu-central-1arn:aws:lambda:eu-central-1:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
eu-west-1arn:aws:lambda:eu-west-1:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
eu-west-2arn:aws:lambda:eu-west-2:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
eu-west-3arn:aws:lambda:eu-west-3:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
eu-north-1arn:aws:lambda:eu-north-1:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
sa-east-1arn:aws:lambda:sa-east-1:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1

Adding Debug Proxy Layer

Grant SQS publish permission

Since the Lambda function is supposed to publish messages to the SQS queue, SQS publishing permission should be granted to the Lambda execution role. For that, switch to the Permissions tab on the Lambda function console and click on the Manage these permissions on the IAM console link.

Once the Lambda execution role is opened in the AWS IAM console, add a new Inline Policy with the following parameters.

ParameterValue
ServiceSQS
ActionsWrite -> SendMessage
ResourcesARN of the SQS queue created in the 1st step

SQS Publish Permission

Create a test event

To invoke the Lambda function, create a new Test Event on the Lambda console with the following JSON.

{
"message": "Hello World!"
}

Lambda Test Event

Then invoke the test event to see if our Lambda code works without any issues. If it was successful, the SQS console can be used to check if the queue has received the message.

Configure Lambda environment variables

Then the following environment variables must be set for the Lambda function with the appropriate values. These are used by the debug proxy to decide whether to enable debug mode and also to connect with the broker server.

NameRequiredDescription
SLAPP_DEBUGGER_ACTIVEThis is the flag that indicates whether the Lambda should be invoked in debug mode or not. Setting this to true will enable debugging.
SLAPP_KEYThis is the Access Key obtained from the access key manager
SLAPP_SECRETThis is the Access Secret obtained from the access key manager
SLAPP_SESSIONThis is a unique ID to distinguish this Lambda function for debugger to connect. This can be any string value.

Lambda Environment Variables

Also make sure to set a reasonable Timeout value for the Lambda function, so that you have enough time for debugging, before the Lambda function runs out of time. Generally a timeout of 3-5 minutes would be adequate for a typical debugging session.


4. Installing and running the Local Client

The Local Client module of the toolkit should be installed as a global NPM dependency on the developer machine.

npm i slappforge-debug-client -g

Then it can be invoked via a terminal providing the following arguments.

Short ArgumentLong ArgumentRequiredDescription
-f--sessionThis is a unique ID set as the SLAPP_SESSION variable of the Lambda function
-k--keyThis is the Access Key obtained from the access key manager
-x--secretThis is the Access Secret obtained from the access key manager
slp-debug-client -k=abcd-efgh-1234-5678 -x=abc123def456ghi789 -f=MyDebuggerSession

Local Client


5. Configuring the IDE Debugger

IntelliJ IDEA / WebStorm

  • Open the project containing the Lambda source code and create a new Run/Debug Configuration selecting Attach to NodeJS/Chrome as the type from left side panel
  • Provide any name for the Run/Debug profile
  • Configure the Host as localhost and the Port as 9249
  • Select the Attach to type as Chrome or NodeJS > 6.3 started with --inspect
  • Click Apply and then OK

WebStorm Debugger Config

VS Code

  • Open the workspace containing the Lambda source code and add a new launch configuration similar to below. You can provide any name for the name field. Launch type: Node.JS: Attach to Remote.
{
"type": "node",
"request": "attach",
"name": "Attach to Remote Lambda",
"address": "127.0.0.1",
"port": 9249,
"localRoot": "${workspaceFolder}",
"remoteRoot": "/var/task",
"outFiles": [
"${workspaceFolder}/**/*.js"
]
}

Based on your VS Code version, the configuration fields may slightly vary. For example, in 1.46: launch config type = Node.JS: Attach to Remote; type = pwa-node and outFiles becomes skipFiles.

  • If your Lambda source code is in a sub directory of the current workspace, you have to append that sub path to the localRoot field.
"localRoot": "${workspaceFolder}/subPath"
  • Similarly, if your Lambda deployment bundle has an enclosing directory, you have to append that also to the remoteRoot field.
"remoteRoot": "/var/task/MyLambda"
  • Finally save the launch.json file

6. Running the Debugger

  • First start the Local Client providing the necessary parameters as mentioned in step 4.
  • Then invoke the Lambda with the previously created test event.
  • Then the Lambda execution will suspend waiting for a debugger to connect.
  • Finally invoke the Debugger from the IDE and wait for a couple of seconds for it to connect through. If you are using WebStorm or IntelliJ IDEA, make sure to add at least one debug breakpoint before you invoke the IDE debugger, so that the Lambda execution will suspend at that point.
  • Happy Debugging!
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' lambda-debugging-workshops/nodejs-debugging at master · slappforge/lambda-debugging-workshops · GitHub
Skip to content

Latest commit

History

History

Folders and files

NameName
Last commit message
Last commit date

parent directory

..

README.md

NodeJS Logo

NodeJS Lambda Debugging Workshop

1. Cloning the sample code and set the SQS queue URL

First clone this repository to your local machine and open the sample-lambda-code sub directory with your IDE. This directory contains is a sample lambda function, which extracts a message from the Lambda event and then publishes it to a pre-defined SQS queue.

Setting the SQS URL

For this sample code to work, you need to have a SQS queue created in your AWS account. For that, log into the SQS (Simple Queue Service) console of your AWS account and create a new SQS queue. After the queue is created, you can see its URL and the ARN in the Details tab as below. Please note them down for later use.

New SQS queue details

If you already have a queue that can be used for this activity, that can also be used instead of creating a new one.

  • Then open the index.js file of the sample code and specify the above Queue URL as the value of the SQS_URL constant.
const SQS_URL = 'https://sqs.us-east-1.amazonaws.com/123456789000/my-message-queue';

2. Including the SLAppForge Lambda Debug Proxy to the Lambda function

The next step is to include the SLAppForge Lambda Debug Proxy module to the function code. For that, simply add the below require statement to the very end of the index.js file.

require('slappforge-lambda-debug-proxy');

Since we are going to provide this module through a Lambda Layer later, it is not required to install this as a npm dependency (unless you need to run your Lambda code locally). Therefore any warnings indicated by the IDE regarding that can be safely ignored.

Important

If you intend to use Visual Studio Code as the IDE for the debugging, please add a debugger; statement as the very first line of the function handler.

const AWS = require('aws-sdk');
let sqs = new AWS.SQS();
const SQS_URL = '<specify-your-queue-url-here>';
exports.handler = async (event, context) => {
debugger;
// rest of the function code
};
require('slappforge-lambda-debug-proxy');

Once this line is added, create a zip file containing the Lambda code to be uploaded to AWS later.

3. Creating and configuring the Lambda function

Create a new Lambda function

Login to the AWS Lambda Console and create a new Lambda function using NodeJS (either 10.x or 12.x) as the runtime. Let's name it as SQSMessagePublisher. For the execution role configuration, choose the Create a new role with basic Lambda permissions option.

Creating a new Lambda

Upload the code

Once the Lambda function is created, scroll down to the Function code section and choose the Code Entry Type as Upload a .zip file. Then upload the previously created ZIP file containing the sample Lambda code.

Then set the Handler name correctly based on how the function code was bundled into the ZIP file. For example, if the index.js is without any enclosing directory, the handler name should be index.handler. If index.js is enclosed inside a directory (e.g.: sample-lambda-code/index.js), the handler name should be sample-lambda-code/index.handler.

Add the Lambda Debug Proxy Layer

Click on the Layers button on the Designer section and choose to Add a layer. Then select Provide a layer version ARN option and provide the ARN of the SLAppForge Live Debug for AWS - NodeJS layer, which contains the slappforge-lambda-debug-proxy module. Based on the region of the Lambda function, pick the correct layer ARN from the below table.

RegionLayer ARN
us-east-1arn:aws:lambda:us-east-1:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
us-east-2arn:aws:lambda:us-east-2:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
us-west-1arn:aws:lambda:us-west-1:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
us-west-2arn:aws:lambda:us-west-2:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
ap-south-1arn:aws:lambda:ap-south-1:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
ap-northeast-1arn:aws:lambda:ap-northeast-1:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
ap-northeast-2arn:aws:lambda:ap-northeast-2:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
ap-southeast-1arn:aws:lambda:ap-southeast-1:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
ap-southeast-2arn:aws:lambda:ap-southeast-2:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
ca-central-1arn:aws:lambda:ca-central-1:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
eu-central-1arn:aws:lambda:eu-central-1:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
eu-west-1arn:aws:lambda:eu-west-1:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
eu-west-2arn:aws:lambda:eu-west-2:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
eu-west-3arn:aws:lambda:eu-west-3:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
eu-north-1arn:aws:lambda:eu-north-1:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
sa-east-1arn:aws:lambda:sa-east-1:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1

Adding Debug Proxy Layer

Grant SQS publish permission

Since the Lambda function is supposed to publish messages to the SQS queue, SQS publishing permission should be granted to the Lambda execution role. For that, switch to the Permissions tab on the Lambda function console and click on the Manage these permissions on the IAM console link.

Once the Lambda execution role is opened in the AWS IAM console, add a new Inline Policy with the following parameters.

ParameterValue
ServiceSQS
ActionsWrite -> SendMessage
ResourcesARN of the SQS queue created in the 1st step

SQS Publish Permission

Create a test event

To invoke the Lambda function, create a new Test Event on the Lambda console with the following JSON.

{
"message": "Hello World!"
}

Lambda Test Event

Then invoke the test event to see if our Lambda code works without any issues. If it was successful, the SQS console can be used to check if the queue has received the message.

Configure Lambda environment variables

Then the following environment variables must be set for the Lambda function with the appropriate values. These are used by the debug proxy to decide whether to enable debug mode and also to connect with the broker server.

NameRequiredDescription
SLAPP_DEBUGGER_ACTIVEThis is the flag that indicates whether the Lambda should be invoked in debug mode or not. Setting this to true will enable debugging.
SLAPP_KEYThis is the Access Key obtained from the access key manager
SLAPP_SECRETThis is the Access Secret obtained from the access key manager
SLAPP_SESSIONThis is a unique ID to distinguish this Lambda function for debugger to connect. This can be any string value.

Lambda Environment Variables

Also make sure to set a reasonable Timeout value for the Lambda function, so that you have enough time for debugging, before the Lambda function runs out of time. Generally a timeout of 3-5 minutes would be adequate for a typical debugging session.


4. Installing and running the Local Client

The Local Client module of the toolkit should be installed as a global NPM dependency on the developer machine.

npm i slappforge-debug-client -g

Then it can be invoked via a terminal providing the following arguments.

Short ArgumentLong ArgumentRequiredDescription
-f--sessionThis is a unique ID set as the SLAPP_SESSION variable of the Lambda function
-k--keyThis is the Access Key obtained from the access key manager
-x--secretThis is the Access Secret obtained from the access key manager
slp-debug-client -k=abcd-efgh-1234-5678 -x=abc123def456ghi789 -f=MyDebuggerSession

Local Client


5. Configuring the IDE Debugger

IntelliJ IDEA / WebStorm

  • Open the project containing the Lambda source code and create a new Run/Debug Configuration selecting Attach to NodeJS/Chrome as the type from left side panel
  • Provide any name for the Run/Debug profile
  • Configure the Host as localhost and the Port as 9249
  • Select the Attach to type as Chrome or NodeJS > 6.3 started with --inspect
  • Click Apply and then OK

WebStorm Debugger Config

VS Code

  • Open the workspace containing the Lambda source code and add a new launch configuration similar to below. You can provide any name for the name field. Launch type: Node.JS: Attach to Remote.
{
"type": "node",
"request": "attach",
"name": "Attach to Remote Lambda",
"address": "127.0.0.1",
"port": 9249,
"localRoot": "${workspaceFolder}",
"remoteRoot": "/var/task",
"outFiles": [
"${workspaceFolder}/**/*.js"
]
}

Based on your VS Code version, the configuration fields may slightly vary. For example, in 1.46: launch config type = Node.JS: Attach to Remote; type = pwa-node and outFiles becomes skipFiles.

  • If your Lambda source code is in a sub directory of the current workspace, you have to append that sub path to the localRoot field.
"localRoot": "${workspaceFolder}/subPath"
  • Similarly, if your Lambda deployment bundle has an enclosing directory, you have to append that also to the remoteRoot field.
"remoteRoot": "/var/task/MyLambda"
  • Finally save the launch.json file

6. Running the Debugger

  • First start the Local Client providing the necessary parameters as mentioned in step 4.
  • Then invoke the Lambda with the previously created test event.
  • Then the Lambda execution will suspend waiting for a debugger to connect.
  • Finally invoke the Debugger from the IDE and wait for a couple of seconds for it to connect through. If you are using WebStorm or IntelliJ IDEA, make sure to add at least one debug breakpoint before you invoke the IDE debugger, so that the Lambda execution will suspend at that point.
  • Happy Debugging!
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' lambda-debugging-workshops/nodejs-debugging at master · slappforge/lambda-debugging-workshops · GitHub
Skip to content

Latest commit

History

History

Folders and files

NameName
Last commit message
Last commit date

parent directory

..

README.md

NodeJS Logo

NodeJS Lambda Debugging Workshop

1. Cloning the sample code and set the SQS queue URL

First clone this repository to your local machine and open the sample-lambda-code sub directory with your IDE. This directory contains is a sample lambda function, which extracts a message from the Lambda event and then publishes it to a pre-defined SQS queue.

Setting the SQS URL

For this sample code to work, you need to have a SQS queue created in your AWS account. For that, log into the SQS (Simple Queue Service) console of your AWS account and create a new SQS queue. After the queue is created, you can see its URL and the ARN in the Details tab as below. Please note them down for later use.

New SQS queue details

If you already have a queue that can be used for this activity, that can also be used instead of creating a new one.

  • Then open the index.js file of the sample code and specify the above Queue URL as the value of the SQS_URL constant.
const SQS_URL = 'https://sqs.us-east-1.amazonaws.com/123456789000/my-message-queue';

2. Including the SLAppForge Lambda Debug Proxy to the Lambda function

The next step is to include the SLAppForge Lambda Debug Proxy module to the function code. For that, simply add the below require statement to the very end of the index.js file.

require('slappforge-lambda-debug-proxy');

Since we are going to provide this module through a Lambda Layer later, it is not required to install this as a npm dependency (unless you need to run your Lambda code locally). Therefore any warnings indicated by the IDE regarding that can be safely ignored.

Important

If you intend to use Visual Studio Code as the IDE for the debugging, please add a debugger; statement as the very first line of the function handler.

const AWS = require('aws-sdk');
let sqs = new AWS.SQS();
const SQS_URL = '<specify-your-queue-url-here>';
exports.handler = async (event, context) => {
debugger;
// rest of the function code
};
require('slappforge-lambda-debug-proxy');

Once this line is added, create a zip file containing the Lambda code to be uploaded to AWS later.

3. Creating and configuring the Lambda function

Create a new Lambda function

Login to the AWS Lambda Console and create a new Lambda function using NodeJS (either 10.x or 12.x) as the runtime. Let's name it as SQSMessagePublisher. For the execution role configuration, choose the Create a new role with basic Lambda permissions option.

Creating a new Lambda

Upload the code

Once the Lambda function is created, scroll down to the Function code section and choose the Code Entry Type as Upload a .zip file. Then upload the previously created ZIP file containing the sample Lambda code.

Then set the Handler name correctly based on how the function code was bundled into the ZIP file. For example, if the index.js is without any enclosing directory, the handler name should be index.handler. If index.js is enclosed inside a directory (e.g.: sample-lambda-code/index.js), the handler name should be sample-lambda-code/index.handler.

Add the Lambda Debug Proxy Layer

Click on the Layers button on the Designer section and choose to Add a layer. Then select Provide a layer version ARN option and provide the ARN of the SLAppForge Live Debug for AWS - NodeJS layer, which contains the slappforge-lambda-debug-proxy module. Based on the region of the Lambda function, pick the correct layer ARN from the below table.

RegionLayer ARN
us-east-1arn:aws:lambda:us-east-1:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
us-east-2arn:aws:lambda:us-east-2:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
us-west-1arn:aws:lambda:us-west-1:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
us-west-2arn:aws:lambda:us-west-2:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
ap-south-1arn:aws:lambda:ap-south-1:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
ap-northeast-1arn:aws:lambda:ap-northeast-1:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
ap-northeast-2arn:aws:lambda:ap-northeast-2:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
ap-southeast-1arn:aws:lambda:ap-southeast-1:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
ap-southeast-2arn:aws:lambda:ap-southeast-2:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
ca-central-1arn:aws:lambda:ca-central-1:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
eu-central-1arn:aws:lambda:eu-central-1:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
eu-west-1arn:aws:lambda:eu-west-1:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
eu-west-2arn:aws:lambda:eu-west-2:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
eu-west-3arn:aws:lambda:eu-west-3:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
eu-north-1arn:aws:lambda:eu-north-1:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
sa-east-1arn:aws:lambda:sa-east-1:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1

Adding Debug Proxy Layer

Grant SQS publish permission

Since the Lambda function is supposed to publish messages to the SQS queue, SQS publishing permission should be granted to the Lambda execution role. For that, switch to the Permissions tab on the Lambda function console and click on the Manage these permissions on the IAM console link.

Once the Lambda execution role is opened in the AWS IAM console, add a new Inline Policy with the following parameters.

ParameterValue
ServiceSQS
ActionsWrite -> SendMessage
ResourcesARN of the SQS queue created in the 1st step

SQS Publish Permission

Create a test event

To invoke the Lambda function, create a new Test Event on the Lambda console with the following JSON.

{
"message": "Hello World!"
}

Lambda Test Event

Then invoke the test event to see if our Lambda code works without any issues. If it was successful, the SQS console can be used to check if the queue has received the message.

Configure Lambda environment variables

Then the following environment variables must be set for the Lambda function with the appropriate values. These are used by the debug proxy to decide whether to enable debug mode and also to connect with the broker server.

NameRequiredDescription
SLAPP_DEBUGGER_ACTIVEThis is the flag that indicates whether the Lambda should be invoked in debug mode or not. Setting this to true will enable debugging.
SLAPP_KEYThis is the Access Key obtained from the access key manager
SLAPP_SECRETThis is the Access Secret obtained from the access key manager
SLAPP_SESSIONThis is a unique ID to distinguish this Lambda function for debugger to connect. This can be any string value.

Lambda Environment Variables

Also make sure to set a reasonable Timeout value for the Lambda function, so that you have enough time for debugging, before the Lambda function runs out of time. Generally a timeout of 3-5 minutes would be adequate for a typical debugging session.


4. Installing and running the Local Client

The Local Client module of the toolkit should be installed as a global NPM dependency on the developer machine.

npm i slappforge-debug-client -g

Then it can be invoked via a terminal providing the following arguments.

Short ArgumentLong ArgumentRequiredDescription
-f--sessionThis is a unique ID set as the SLAPP_SESSION variable of the Lambda function
-k--keyThis is the Access Key obtained from the access key manager
-x--secretThis is the Access Secret obtained from the access key manager
slp-debug-client -k=abcd-efgh-1234-5678 -x=abc123def456ghi789 -f=MyDebuggerSession

Local Client


5. Configuring the IDE Debugger

IntelliJ IDEA / WebStorm

  • Open the project containing the Lambda source code and create a new Run/Debug Configuration selecting Attach to NodeJS/Chrome as the type from left side panel
  • Provide any name for the Run/Debug profile
  • Configure the Host as localhost and the Port as 9249
  • Select the Attach to type as Chrome or NodeJS > 6.3 started with --inspect
  • Click Apply and then OK

WebStorm Debugger Config

VS Code

  • Open the workspace containing the Lambda source code and add a new launch configuration similar to below. You can provide any name for the name field. Launch type: Node.JS: Attach to Remote.
{
"type": "node",
"request": "attach",
"name": "Attach to Remote Lambda",
"address": "127.0.0.1",
"port": 9249,
"localRoot": "${workspaceFolder}",
"remoteRoot": "/var/task",
"outFiles": [
"${workspaceFolder}/**/*.js"
]
}

Based on your VS Code version, the configuration fields may slightly vary. For example, in 1.46: launch config type = Node.JS: Attach to Remote; type = pwa-node and outFiles becomes skipFiles.

  • If your Lambda source code is in a sub directory of the current workspace, you have to append that sub path to the localRoot field.
"localRoot": "${workspaceFolder}/subPath"
  • Similarly, if your Lambda deployment bundle has an enclosing directory, you have to append that also to the remoteRoot field.
"remoteRoot": "/var/task/MyLambda"
  • Finally save the launch.json file

6. Running the Debugger

  • First start the Local Client providing the necessary parameters as mentioned in step 4.
  • Then invoke the Lambda with the previously created test event.
  • Then the Lambda execution will suspend waiting for a debugger to connect.
  • Finally invoke the Debugger from the IDE and wait for a couple of seconds for it to connect through. If you are using WebStorm or IntelliJ IDEA, make sure to add at least one debug breakpoint before you invoke the IDE debugger, so that the Lambda execution will suspend at that point.
  • Happy Debugging!
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' lambda-debugging-workshops/nodejs-debugging at master · slappforge/lambda-debugging-workshops · GitHub
Skip to content

Latest commit

History

History

Folders and files

NameName
Last commit message
Last commit date

parent directory

..

README.md

NodeJS Logo

NodeJS Lambda Debugging Workshop

1. Cloning the sample code and set the SQS queue URL

First clone this repository to your local machine and open the sample-lambda-code sub directory with your IDE. This directory contains is a sample lambda function, which extracts a message from the Lambda event and then publishes it to a pre-defined SQS queue.

Setting the SQS URL

For this sample code to work, you need to have a SQS queue created in your AWS account. For that, log into the SQS (Simple Queue Service) console of your AWS account and create a new SQS queue. After the queue is created, you can see its URL and the ARN in the Details tab as below. Please note them down for later use.

New SQS queue details

If you already have a queue that can be used for this activity, that can also be used instead of creating a new one.

  • Then open the index.js file of the sample code and specify the above Queue URL as the value of the SQS_URL constant.
const SQS_URL = 'https://sqs.us-east-1.amazonaws.com/123456789000/my-message-queue';

2. Including the SLAppForge Lambda Debug Proxy to the Lambda function

The next step is to include the SLAppForge Lambda Debug Proxy module to the function code. For that, simply add the below require statement to the very end of the index.js file.

require('slappforge-lambda-debug-proxy');

Since we are going to provide this module through a Lambda Layer later, it is not required to install this as a npm dependency (unless you need to run your Lambda code locally). Therefore any warnings indicated by the IDE regarding that can be safely ignored.

Important

If you intend to use Visual Studio Code as the IDE for the debugging, please add a debugger; statement as the very first line of the function handler.

const AWS = require('aws-sdk');
let sqs = new AWS.SQS();
const SQS_URL = '<specify-your-queue-url-here>';
exports.handler = async (event, context) => {
debugger;
// rest of the function code
};
require('slappforge-lambda-debug-proxy');

Once this line is added, create a zip file containing the Lambda code to be uploaded to AWS later.

3. Creating and configuring the Lambda function

Create a new Lambda function

Login to the AWS Lambda Console and create a new Lambda function using NodeJS (either 10.x or 12.x) as the runtime. Let's name it as SQSMessagePublisher. For the execution role configuration, choose the Create a new role with basic Lambda permissions option.

Creating a new Lambda

Upload the code

Once the Lambda function is created, scroll down to the Function code section and choose the Code Entry Type as Upload a .zip file. Then upload the previously created ZIP file containing the sample Lambda code.

Then set the Handler name correctly based on how the function code was bundled into the ZIP file. For example, if the index.js is without any enclosing directory, the handler name should be index.handler. If index.js is enclosed inside a directory (e.g.: sample-lambda-code/index.js), the handler name should be sample-lambda-code/index.handler.

Add the Lambda Debug Proxy Layer

Click on the Layers button on the Designer section and choose to Add a layer. Then select Provide a layer version ARN option and provide the ARN of the SLAppForge Live Debug for AWS - NodeJS layer, which contains the slappforge-lambda-debug-proxy module. Based on the region of the Lambda function, pick the correct layer ARN from the below table.

RegionLayer ARN
us-east-1arn:aws:lambda:us-east-1:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
us-east-2arn:aws:lambda:us-east-2:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
us-west-1arn:aws:lambda:us-west-1:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
us-west-2arn:aws:lambda:us-west-2:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
ap-south-1arn:aws:lambda:ap-south-1:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
ap-northeast-1arn:aws:lambda:ap-northeast-1:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
ap-northeast-2arn:aws:lambda:ap-northeast-2:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
ap-southeast-1arn:aws:lambda:ap-southeast-1:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
ap-southeast-2arn:aws:lambda:ap-southeast-2:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
ca-central-1arn:aws:lambda:ca-central-1:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
eu-central-1arn:aws:lambda:eu-central-1:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
eu-west-1arn:aws:lambda:eu-west-1:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
eu-west-2arn:aws:lambda:eu-west-2:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
eu-west-3arn:aws:lambda:eu-west-3:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
eu-north-1arn:aws:lambda:eu-north-1:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
sa-east-1arn:aws:lambda:sa-east-1:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1

Adding Debug Proxy Layer

Grant SQS publish permission

Since the Lambda function is supposed to publish messages to the SQS queue, SQS publishing permission should be granted to the Lambda execution role. For that, switch to the Permissions tab on the Lambda function console and click on the Manage these permissions on the IAM console link.

Once the Lambda execution role is opened in the AWS IAM console, add a new Inline Policy with the following parameters.

ParameterValue
ServiceSQS
ActionsWrite -> SendMessage
ResourcesARN of the SQS queue created in the 1st step

SQS Publish Permission

Create a test event

To invoke the Lambda function, create a new Test Event on the Lambda console with the following JSON.

{
"message": "Hello World!"
}

Lambda Test Event

Then invoke the test event to see if our Lambda code works without any issues. If it was successful, the SQS console can be used to check if the queue has received the message.

Configure Lambda environment variables

Then the following environment variables must be set for the Lambda function with the appropriate values. These are used by the debug proxy to decide whether to enable debug mode and also to connect with the broker server.

NameRequiredDescription
SLAPP_DEBUGGER_ACTIVEThis is the flag that indicates whether the Lambda should be invoked in debug mode or not. Setting this to true will enable debugging.
SLAPP_KEYThis is the Access Key obtained from the access key manager
SLAPP_SECRETThis is the Access Secret obtained from the access key manager
SLAPP_SESSIONThis is a unique ID to distinguish this Lambda function for debugger to connect. This can be any string value.

Lambda Environment Variables

Also make sure to set a reasonable Timeout value for the Lambda function, so that you have enough time for debugging, before the Lambda function runs out of time. Generally a timeout of 3-5 minutes would be adequate for a typical debugging session.


4. Installing and running the Local Client

The Local Client module of the toolkit should be installed as a global NPM dependency on the developer machine.

npm i slappforge-debug-client -g

Then it can be invoked via a terminal providing the following arguments.

Short ArgumentLong ArgumentRequiredDescription
-f--sessionThis is a unique ID set as the SLAPP_SESSION variable of the Lambda function
-k--keyThis is the Access Key obtained from the access key manager
-x--secretThis is the Access Secret obtained from the access key manager
slp-debug-client -k=abcd-efgh-1234-5678 -x=abc123def456ghi789 -f=MyDebuggerSession

Local Client


5. Configuring the IDE Debugger

IntelliJ IDEA / WebStorm

  • Open the project containing the Lambda source code and create a new Run/Debug Configuration selecting Attach to NodeJS/Chrome as the type from left side panel
  • Provide any name for the Run/Debug profile
  • Configure the Host as localhost and the Port as 9249
  • Select the Attach to type as Chrome or NodeJS > 6.3 started with --inspect
  • Click Apply and then OK

WebStorm Debugger Config

VS Code

  • Open the workspace containing the Lambda source code and add a new launch configuration similar to below. You can provide any name for the name field. Launch type: Node.JS: Attach to Remote.
{
"type": "node",
"request": "attach",
"name": "Attach to Remote Lambda",
"address": "127.0.0.1",
"port": 9249,
"localRoot": "${workspaceFolder}",
"remoteRoot": "/var/task",
"outFiles": [
"${workspaceFolder}/**/*.js"
]
}

Based on your VS Code version, the configuration fields may slightly vary. For example, in 1.46: launch config type = Node.JS: Attach to Remote; type = pwa-node and outFiles becomes skipFiles.

  • If your Lambda source code is in a sub directory of the current workspace, you have to append that sub path to the localRoot field.
"localRoot": "${workspaceFolder}/subPath"
  • Similarly, if your Lambda deployment bundle has an enclosing directory, you have to append that also to the remoteRoot field.
"remoteRoot": "/var/task/MyLambda"
  • Finally save the launch.json file

6. Running the Debugger

  • First start the Local Client providing the necessary parameters as mentioned in step 4.
  • Then invoke the Lambda with the previously created test event.
  • Then the Lambda execution will suspend waiting for a debugger to connect.
  • Finally invoke the Debugger from the IDE and wait for a couple of seconds for it to connect through. If you are using WebStorm or IntelliJ IDEA, make sure to add at least one debug breakpoint before you invoke the IDE debugger, so that the Lambda execution will suspend at that point.
  • Happy Debugging!
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' lambda-debugging-workshops/nodejs-debugging at master · slappforge/lambda-debugging-workshops · GitHub
Skip to content

Latest commit

History

History

Folders and files

NameName
Last commit message
Last commit date

parent directory

..

README.md

NodeJS Logo

NodeJS Lambda Debugging Workshop

1. Cloning the sample code and set the SQS queue URL

First clone this repository to your local machine and open the sample-lambda-code sub directory with your IDE. This directory contains is a sample lambda function, which extracts a message from the Lambda event and then publishes it to a pre-defined SQS queue.

Setting the SQS URL

For this sample code to work, you need to have a SQS queue created in your AWS account. For that, log into the SQS (Simple Queue Service) console of your AWS account and create a new SQS queue. After the queue is created, you can see its URL and the ARN in the Details tab as below. Please note them down for later use.

New SQS queue details

If you already have a queue that can be used for this activity, that can also be used instead of creating a new one.

  • Then open the index.js file of the sample code and specify the above Queue URL as the value of the SQS_URL constant.
const SQS_URL = 'https://sqs.us-east-1.amazonaws.com/123456789000/my-message-queue';

2. Including the SLAppForge Lambda Debug Proxy to the Lambda function

The next step is to include the SLAppForge Lambda Debug Proxy module to the function code. For that, simply add the below require statement to the very end of the index.js file.

require('slappforge-lambda-debug-proxy');

Since we are going to provide this module through a Lambda Layer later, it is not required to install this as a npm dependency (unless you need to run your Lambda code locally). Therefore any warnings indicated by the IDE regarding that can be safely ignored.

Important

If you intend to use Visual Studio Code as the IDE for the debugging, please add a debugger; statement as the very first line of the function handler.

const AWS = require('aws-sdk');
let sqs = new AWS.SQS();
const SQS_URL = '<specify-your-queue-url-here>';
exports.handler = async (event, context) => {
debugger;
// rest of the function code
};
require('slappforge-lambda-debug-proxy');

Once this line is added, create a zip file containing the Lambda code to be uploaded to AWS later.

3. Creating and configuring the Lambda function

Create a new Lambda function

Login to the AWS Lambda Console and create a new Lambda function using NodeJS (either 10.x or 12.x) as the runtime. Let's name it as SQSMessagePublisher. For the execution role configuration, choose the Create a new role with basic Lambda permissions option.

Creating a new Lambda

Upload the code

Once the Lambda function is created, scroll down to the Function code section and choose the Code Entry Type as Upload a .zip file. Then upload the previously created ZIP file containing the sample Lambda code.

Then set the Handler name correctly based on how the function code was bundled into the ZIP file. For example, if the index.js is without any enclosing directory, the handler name should be index.handler. If index.js is enclosed inside a directory (e.g.: sample-lambda-code/index.js), the handler name should be sample-lambda-code/index.handler.

Add the Lambda Debug Proxy Layer

Click on the Layers button on the Designer section and choose to Add a layer. Then select Provide a layer version ARN option and provide the ARN of the SLAppForge Live Debug for AWS - NodeJS layer, which contains the slappforge-lambda-debug-proxy module. Based on the region of the Lambda function, pick the correct layer ARN from the below table.

RegionLayer ARN
us-east-1arn:aws:lambda:us-east-1:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
us-east-2arn:aws:lambda:us-east-2:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
us-west-1arn:aws:lambda:us-west-1:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
us-west-2arn:aws:lambda:us-west-2:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
ap-south-1arn:aws:lambda:ap-south-1:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
ap-northeast-1arn:aws:lambda:ap-northeast-1:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
ap-northeast-2arn:aws:lambda:ap-northeast-2:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
ap-southeast-1arn:aws:lambda:ap-southeast-1:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
ap-southeast-2arn:aws:lambda:ap-southeast-2:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
ca-central-1arn:aws:lambda:ca-central-1:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
eu-central-1arn:aws:lambda:eu-central-1:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
eu-west-1arn:aws:lambda:eu-west-1:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
eu-west-2arn:aws:lambda:eu-west-2:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
eu-west-3arn:aws:lambda:eu-west-3:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
eu-north-1arn:aws:lambda:eu-north-1:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
sa-east-1arn:aws:lambda:sa-east-1:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1

Adding Debug Proxy Layer

Grant SQS publish permission

Since the Lambda function is supposed to publish messages to the SQS queue, SQS publishing permission should be granted to the Lambda execution role. For that, switch to the Permissions tab on the Lambda function console and click on the Manage these permissions on the IAM console link.

Once the Lambda execution role is opened in the AWS IAM console, add a new Inline Policy with the following parameters.

ParameterValue
ServiceSQS
ActionsWrite -> SendMessage
ResourcesARN of the SQS queue created in the 1st step

SQS Publish Permission

Create a test event

To invoke the Lambda function, create a new Test Event on the Lambda console with the following JSON.

{
"message": "Hello World!"
}

Lambda Test Event

Then invoke the test event to see if our Lambda code works without any issues. If it was successful, the SQS console can be used to check if the queue has received the message.

Configure Lambda environment variables

Then the following environment variables must be set for the Lambda function with the appropriate values. These are used by the debug proxy to decide whether to enable debug mode and also to connect with the broker server.

NameRequiredDescription
SLAPP_DEBUGGER_ACTIVEThis is the flag that indicates whether the Lambda should be invoked in debug mode or not. Setting this to true will enable debugging.
SLAPP_KEYThis is the Access Key obtained from the access key manager
SLAPP_SECRETThis is the Access Secret obtained from the access key manager
SLAPP_SESSIONThis is a unique ID to distinguish this Lambda function for debugger to connect. This can be any string value.

Lambda Environment Variables

Also make sure to set a reasonable Timeout value for the Lambda function, so that you have enough time for debugging, before the Lambda function runs out of time. Generally a timeout of 3-5 minutes would be adequate for a typical debugging session.


4. Installing and running the Local Client

The Local Client module of the toolkit should be installed as a global NPM dependency on the developer machine.

npm i slappforge-debug-client -g

Then it can be invoked via a terminal providing the following arguments.

Short ArgumentLong ArgumentRequiredDescription
-f--sessionThis is a unique ID set as the SLAPP_SESSION variable of the Lambda function
-k--keyThis is the Access Key obtained from the access key manager
-x--secretThis is the Access Secret obtained from the access key manager
slp-debug-client -k=abcd-efgh-1234-5678 -x=abc123def456ghi789 -f=MyDebuggerSession

Local Client


5. Configuring the IDE Debugger

IntelliJ IDEA / WebStorm

  • Open the project containing the Lambda source code and create a new Run/Debug Configuration selecting Attach to NodeJS/Chrome as the type from left side panel
  • Provide any name for the Run/Debug profile
  • Configure the Host as localhost and the Port as 9249
  • Select the Attach to type as Chrome or NodeJS > 6.3 started with --inspect
  • Click Apply and then OK

WebStorm Debugger Config

VS Code

  • Open the workspace containing the Lambda source code and add a new launch configuration similar to below. You can provide any name for the name field. Launch type: Node.JS: Attach to Remote.
{
"type": "node",
"request": "attach",
"name": "Attach to Remote Lambda",
"address": "127.0.0.1",
"port": 9249,
"localRoot": "${workspaceFolder}",
"remoteRoot": "/var/task",
"outFiles": [
"${workspaceFolder}/**/*.js"
]
}

Based on your VS Code version, the configuration fields may slightly vary. For example, in 1.46: launch config type = Node.JS: Attach to Remote; type = pwa-node and outFiles becomes skipFiles.

  • If your Lambda source code is in a sub directory of the current workspace, you have to append that sub path to the localRoot field.
"localRoot": "${workspaceFolder}/subPath"
  • Similarly, if your Lambda deployment bundle has an enclosing directory, you have to append that also to the remoteRoot field.
"remoteRoot": "/var/task/MyLambda"
  • Finally save the launch.json file

6. Running the Debugger

  • First start the Local Client providing the necessary parameters as mentioned in step 4.
  • Then invoke the Lambda with the previously created test event.
  • Then the Lambda execution will suspend waiting for a debugger to connect.
  • Finally invoke the Debugger from the IDE and wait for a couple of seconds for it to connect through. If you are using WebStorm or IntelliJ IDEA, make sure to add at least one debug breakpoint before you invoke the IDE debugger, so that the Lambda execution will suspend at that point.
  • Happy Debugging!
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); lambda-debugging-workshops/nodejs-debugging at master · slappforge/lambda-debugging-workshops · GitHub
Skip to content

Latest commit

History

History

Folders and files

NameName
Last commit message
Last commit date

parent directory

..

README.md

NodeJS Logo

NodeJS Lambda Debugging Workshop

1. Cloning the sample code and set the SQS queue URL

First clone this repository to your local machine and open the sample-lambda-code sub directory with your IDE. This directory contains is a sample lambda function, which extracts a message from the Lambda event and then publishes it to a pre-defined SQS queue.

Setting the SQS URL

For this sample code to work, you need to have a SQS queue created in your AWS account. For that, log into the SQS (Simple Queue Service) console of your AWS account and create a new SQS queue. After the queue is created, you can see its URL and the ARN in the Details tab as below. Please note them down for later use.

New SQS queue details

If you already have a queue that can be used for this activity, that can also be used instead of creating a new one.

  • Then open the index.js file of the sample code and specify the above Queue URL as the value of the SQS_URL constant.
const SQS_URL = 'https://sqs.us-east-1.amazonaws.com/123456789000/my-message-queue';

2. Including the SLAppForge Lambda Debug Proxy to the Lambda function

The next step is to include the SLAppForge Lambda Debug Proxy module to the function code. For that, simply add the below require statement to the very end of the index.js file.

require('slappforge-lambda-debug-proxy');

Since we are going to provide this module through a Lambda Layer later, it is not required to install this as a npm dependency (unless you need to run your Lambda code locally). Therefore any warnings indicated by the IDE regarding that can be safely ignored.

Important

If you intend to use Visual Studio Code as the IDE for the debugging, please add a debugger; statement as the very first line of the function handler.

const AWS = require('aws-sdk');
let sqs = new AWS.SQS();
const SQS_URL = '<specify-your-queue-url-here>';
exports.handler = async (event, context) => {
debugger;
// rest of the function code
};
require('slappforge-lambda-debug-proxy');

Once this line is added, create a zip file containing the Lambda code to be uploaded to AWS later.

3. Creating and configuring the Lambda function

Create a new Lambda function

Login to the AWS Lambda Console and create a new Lambda function using NodeJS (either 10.x or 12.x) as the runtime. Let's name it as SQSMessagePublisher. For the execution role configuration, choose the Create a new role with basic Lambda permissions option.

Creating a new Lambda

Upload the code

Once the Lambda function is created, scroll down to the Function code section and choose the Code Entry Type as Upload a .zip file. Then upload the previously created ZIP file containing the sample Lambda code.

Then set the Handler name correctly based on how the function code was bundled into the ZIP file. For example, if the index.js is without any enclosing directory, the handler name should be index.handler. If index.js is enclosed inside a directory (e.g.: sample-lambda-code/index.js), the handler name should be sample-lambda-code/index.handler.

Add the Lambda Debug Proxy Layer

Click on the Layers button on the Designer section and choose to Add a layer. Then select Provide a layer version ARN option and provide the ARN of the SLAppForge Live Debug for AWS - NodeJS layer, which contains the slappforge-lambda-debug-proxy module. Based on the region of the Lambda function, pick the correct layer ARN from the below table.

RegionLayer ARN
us-east-1arn:aws:lambda:us-east-1:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
us-east-2arn:aws:lambda:us-east-2:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
us-west-1arn:aws:lambda:us-west-1:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
us-west-2arn:aws:lambda:us-west-2:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
ap-south-1arn:aws:lambda:ap-south-1:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
ap-northeast-1arn:aws:lambda:ap-northeast-1:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
ap-northeast-2arn:aws:lambda:ap-northeast-2:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
ap-southeast-1arn:aws:lambda:ap-southeast-1:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
ap-southeast-2arn:aws:lambda:ap-southeast-2:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
ca-central-1arn:aws:lambda:ca-central-1:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
eu-central-1arn:aws:lambda:eu-central-1:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
eu-west-1arn:aws:lambda:eu-west-1:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
eu-west-2arn:aws:lambda:eu-west-2:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
eu-west-3arn:aws:lambda:eu-west-3:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
eu-north-1arn:aws:lambda:eu-north-1:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1
sa-east-1arn:aws:lambda:sa-east-1:892904900711:layer:slappforge-debug-nodejs-1-0-0-build-01:1

Adding Debug Proxy Layer

Grant SQS publish permission

Since the Lambda function is supposed to publish messages to the SQS queue, SQS publishing permission should be granted to the Lambda execution role. For that, switch to the Permissions tab on the Lambda function console and click on the Manage these permissions on the IAM console link.

Once the Lambda execution role is opened in the AWS IAM console, add a new Inline Policy with the following parameters.

ParameterValue
ServiceSQS
ActionsWrite -> SendMessage
ResourcesARN of the SQS queue created in the 1st step

SQS Publish Permission

Create a test event

To invoke the Lambda function, create a new Test Event on the Lambda console with the following JSON.

{
"message": "Hello World!"
}

Lambda Test Event

Then invoke the test event to see if our Lambda code works without any issues. If it was successful, the SQS console can be used to check if the queue has received the message.

Configure Lambda environment variables

Then the following environment variables must be set for the Lambda function with the appropriate values. These are used by the debug proxy to decide whether to enable debug mode and also to connect with the broker server.

NameRequiredDescription
SLAPP_DEBUGGER_ACTIVEThis is the flag that indicates whether the Lambda should be invoked in debug mode or not. Setting this to true will enable debugging.
SLAPP_KEYThis is the Access Key obtained from the access key manager
SLAPP_SECRETThis is the Access Secret obtained from the access key manager
SLAPP_SESSIONThis is a unique ID to distinguish this Lambda function for debugger to connect. This can be any string value.

Lambda Environment Variables

Also make sure to set a reasonable Timeout value for the Lambda function, so that you have enough time for debugging, before the Lambda function runs out of time. Generally a timeout of 3-5 minutes would be adequate for a typical debugging session.


4. Installing and running the Local Client

The Local Client module of the toolkit should be installed as a global NPM dependency on the developer machine.

npm i slappforge-debug-client -g

Then it can be invoked via a terminal providing the following arguments.

Short ArgumentLong ArgumentRequiredDescription
-f--sessionThis is a unique ID set as the SLAPP_SESSION variable of the Lambda function
-k--keyThis is the Access Key obtained from the access key manager
-x--secretThis is the Access Secret obtained from the access key manager
slp-debug-client -k=abcd-efgh-1234-5678 -x=abc123def456ghi789 -f=MyDebuggerSession

Local Client


5. Configuring the IDE Debugger

IntelliJ IDEA / WebStorm

  • Open the project containing the Lambda source code and create a new Run/Debug Configuration selecting Attach to NodeJS/Chrome as the type from left side panel
  • Provide any name for the Run/Debug profile
  • Configure the Host as localhost and the Port as 9249
  • Select the Attach to type as Chrome or NodeJS > 6.3 started with --inspect
  • Click Apply and then OK

WebStorm Debugger Config

VS Code

  • Open the workspace containing the Lambda source code and add a new launch configuration similar to below. You can provide any name for the name field. Launch type: Node.JS: Attach to Remote.
{
"type": "node",
"request": "attach",
"name": "Attach to Remote Lambda",
"address": "127.0.0.1",
"port": 9249,
"localRoot": "${workspaceFolder}",
"remoteRoot": "/var/task",
"outFiles": [
"${workspaceFolder}/**/*.js"
]
}

Based on your VS Code version, the configuration fields may slightly vary. For example, in 1.46: launch config type = Node.JS: Attach to Remote; type = pwa-node and outFiles becomes skipFiles.

  • If your Lambda source code is in a sub directory of the current workspace, you have to append that sub path to the localRoot field.
"localRoot": "${workspaceFolder}/subPath"
  • Similarly, if your Lambda deployment bundle has an enclosing directory, you have to append that also to the remoteRoot field.
"remoteRoot": "/var/task/MyLambda"
  • Finally save the launch.json file

6. Running the Debugger

  • First start the Local Client providing the necessary parameters as mentioned in step 4.
  • Then invoke the Lambda with the previously created test event.
  • Then the Lambda execution will suspend waiting for a debugger to connect.
  • Finally invoke the Debugger from the IDE and wait for a couple of seconds for it to connect through. If you are using WebStorm or IntelliJ IDEA, make sure to add at least one debug breakpoint before you invoke the IDE debugger, so that the Lambda execution will suspend at that point.
  • Happy Debugging!