Debugging AWS Lambda Functions in Go with VSCode
From time to time developers would need to understand how their code behaves across different environments for different reasons. One of the powerful tools that can be used is logging. As the code gets complicated, changing an existing codebase or fixing bugs without being able to debug would be quite a nightmare.
The wages of sin is debugging. — Author: Ron Jeffries
In this article, I’ll walk you through how to set up an environment for an SQS triggered lambda function written in Go language. This walkthrough can be used as an example for other triggering mechanisms.
With AWS Serverless Application Model (AWS SAM) CLI, you can easily run or debug AWS Lambda code on your local environment.
As a first step, we need a Lamba Function handler to debug. We’ll use a sample on AWS Lambda Developer Guide. This code piece is a basic handler that consumes SQS events and outputs the message body.
To debug the project on a local environment, AWS SAM CLI & Delve binaries for Linux need to be installed.
brew tap aws/tap
brew install aws-sam-cli
Lambda executes functions on Linux OS so you need Linux Delve debugger binaries for Linux. If the local environment is not a Linux based environment, use the following command to install Delve.
GOOS=linux GOARCH=amd64 go install github.com/go-delve/delve/cmd/dlv@latest
After installing the dependencies, there are 2 files that need to be created under
.vscode folder. To pass this step easier, you can use the files in this Git repo.
AWS SAM uses
template.yaml file to define a serverless application. This file also can be used to create AWS resources.
AWS SAM template anatomy
An AWS SAM template file closely follows the format of an AWS CloudFormation template file, which is described in…
Simply, create a template.yaml file to the project’s root folder. The template defines the Lambda function’s properties, trigger details, and the SQS that the handler will consume.
To run the lambda function on a local machine;
sam local generate-event sqs receive-message — body ‘Test message’ | sam local invoke — event — MySQSQueueFunction
First part of the command creates an SQS message then passes the SQS message payload to local invoke event parameter. You can change event type to other trigger methods eg. SNS, Kinesis or S3. Click for further types.
Or you can use a pre-generated event file as a parameter for
sam local invoke command like;
sam local invoke -e sqs_event.json MySQSQueueFunction
We need to run sam local invoke command with
-d parameter to attach and debug. Debug argument also needs a port to attachment. Thanks to VSCode
launch.json files, we could run preLaunch tasks in the background.
Makefile simply defines SAM local invoke command. It can be executed by using the following command.
Define a debug attachment ports, mode, and preLaunchTask with
launch.json file. Before attaching the process, SAM needs to be started in debug mode.
preLaunchTask: "debug-with-sam” simply runs the process for us. After running it successfully, it simply attaches itself to the previously started process.
preLaunchTask details need to be defined on
“debug-with-sam” task simply runs
make debug-with-sam command that we defined earlier.
preLaunchTask details need to be define on tasks.json file. Background tasks need also problem matcher and background configurations to get information about process status.
After creating the above-mentioned files, hit the play button on RUN AND DEBUG section. Voila! You’re ready to set breakpoints and hit them.
In case you might need to change sample SQS messages, you can do so by updating
Thank you for reading so far. I hope this will give you a quick introduction to Go Lambda function debugging on VSCode. For more complex use cases, please refer links below.
Testing and debugging serverless applications
With the AWS SAM command line interface (CLI), you can locally test and "step-through" debug your serverless…
VSCode Tasks Problem Matchers
If you use VSCode tasks, you'll probably be familiar with the warning that's reported in the command pallette if you…
Tasks in Visual Studio Code
Expand your development workflow with task integration in Visual Studio Code.
Thanks soyhan beyazıt for peer reviewing!