Tutorial: Using a Lambda function to access Amazon RDS in an Amazon VPC
In this tutorial, you use a Lambda function to write data to an Amazon Relational Database Service (Amazon RDS) database. Your Lambda function reads records from an Amazon Simple Queue Service (Amazon SQS) queue and writes a new item to a table in your database whenever a message is added. In this example, you use the AWS Management Console to manually add messages to your queue. The following diagram shows the AWS resources you use to complete the tutorial.

With Amazon RDS, you can run a managed relational database in the cloud using common database products like Microsoft SQL Server, MySQL, and PostgresQL. By using Lambda to access your database, you can read and write data in response to events, such as a new customer registering with your website. Your function and database instance also scale automatically to meet periods of high demand.
To complete this tutorial, you carry out the following tasks:
-
Launch an Amazon RDS MySQL database instance in your AWS account's default Amazon Virtual Private Cloud (Amazon VPC).
-
Create and test a Lambda function that creates a new table in your database and writes data to it.
-
Create an Amazon SQS queue and configure it to invoke your Lambda function whenever a new message is added.
-
Test the complete set-up by adding messages to your queue using the AWS Management Console and monitoring the results using CloudWatch Logs.
By completing these steps, you learn:
How to use Lambda to open a connection to an Amazon RDS database instance
How to use Lambda to perform create and read operations on an Amazon RDS database
How to use Amazon SQS to invoke a Lambda function
You can complete this tutorial using the AWS Management Console or the AWS Command Line Interface (AWS CLI).
Prerequisites
If you do not have an AWS account, complete the following steps to create one.
To sign up for an AWS account
Follow the online instructions.
Part of the sign-up procedure involves receiving a phone call and entering a verification code on the phone keypad.
When you sign up for an AWS account, an AWS account root user is created. The root user has access to all AWS services and resources in the account. As a security best practice, assign administrative access to an administrative user, and use only the root user to perform tasks that require root user access.
AWS sends you a confirmation email after the sign-up process is
complete. At any time, you can view your current account activity and manage your account by
going to https://aws.amazon.com/
After you sign up for an AWS account, create an administrative user so that you don't use the root user for everyday tasks.
Secure your AWS account root user
-
Sign in to the AWS Management Console
as the account owner by choosing Root user and entering your AWS account email address. On the next page, enter your password. For help signing in by using root user, see Signing in as the root user in the AWS Sign-In User Guide.
-
Turn on multi-factor authentication (MFA) for your root user.
For instructions, see Enable a virtual MFA device for your AWS account root user (console) in the IAM User Guide.
Create an administrative user
-
For your daily administrative tasks, grant administrative access to an administrative user in AWS IAM Identity Center (successor to AWS Single Sign-On).
For instructions, see Getting started in the AWS IAM Identity Center (successor to AWS Single Sign-On) User Guide.
Sign in as the administrative user
-
To sign in with your IAM Identity Center user, use the sign-in URL that was sent to your email address when you created the IAM Identity Center user.
For help signing in using an IAM Identity Center user, see Signing in to the AWS access portal in the AWS Sign-In User Guide.
Create an Amazon RDS database instance

An Amazon RDS database instance is an isolated database environment running in the AWS Cloud. An instance can contain one or more user-created databases. Unless you specify otherwise, Amazon RDS creates new database instances in the default Amazon VPC included in your AWS account. For more information about Amazon VPCs, see the Amazon Virtual Private Cloud User Guide.
In this tutorial, you create a new instance in your AWS account's default VPC and create a database named ExampleDB
in that
instance. You can create your Amazon RDS instance and database using either the AWS Management Console or the AWS CLI.
For Lambda to connect to your database, you need to know its host address (endpoint) and VPC configuration.
To find the database host address and VPC configuration
-
Open the Databases page
of the Amazon RDS console. -
Choose the database instance you just created (
mysqlforlambda
), and select the Connectivity and security pane. -
Record the values of the endpoint, VPC subnets, and VPC security group.
The host endpoint will not be available until your database instance has finished initializing and the status displayed in the console has changed from Creating to Backing up. This can take several minutes.
Create a function execution role

Before you create your Lambda function, you create an execution role to give your function the necessary permissions. For this tutorial, Lambda needs permission to manage the network connection to the Amazon VPC containing your database instance and to poll messages from an Amazon SQS queue.
To give your Lambda function the permissions it needs, this tutorial uses IAM managed policies. These are policies that grant permissions for many common use cases and are available in your AWS account. For more information about using managed policies, see Policy best practices.
To create the Lambda execution role
-
Open the Roles
page of the IAM console and choose Create role. -
For the Trusted entity type, choose AWS Service, and for the Use case, choose Lambda.
-
Choose Next.
-
Add the IAM managed policies by doing the following:
-
Using the policy search box, search for
AWSLambdaVPCAccessExecutionRole
. -
In the results list, select the check box next to the role, then choose Clear filters.
-
Using the policy search box, search for
AWSLambdaSQSQueueExecutionRole
. -
In the results list, select the check box next to the role, then choose Next.
-
-
For the Role name, enter
lambda-vpc-sqs-role
, then choose Create role.
Later in the tutorial, you need the Amazon Resource Name (ARN) of the execution role you just created.
To find the execution role ARN
-
Open the Roles
page of the IAM console and choose your role ( lambda-vpc-sqs-role
) -
Copy the Role ARN displayed in the Summary section.
Create a Lambda deployment package

The following example Python code uses the PyMySQLCustomer
. The table uses the following schema, where
CustID
is the primary key:
Customer(CustID, Name)
The function also uses PyMySQL to add records to this table. The function adds records using customer IDs and names specified in messages you will add to your Amazon SQS queue.
Note that the code creates the connection to your database outside of the handler function. Creating the connection in the initialization code allows the connection to be re-used by subsequent invocations of your function and improves performance. In a production application, you can also use provisioned concurrency to initialize a requested number of database connections. These connections are available as soon as your function is invoked.
import sys import logging import pymysql import json # rds settings rds_host =
"mysqlforlambda.cdipnbm2csku.us-west-2.rds.amazonaws.com"
user_name = "admin" password ="password"
db_name = "ExampleDB" logger = logging.getLogger() logger.setLevel(logging.INFO) # create the database connection outside of the handler to allow connections to be # re-used by subsequent function invocations. try: conn = pymysql.connect(host=rds_host, user=user_name, passwd=password, db=db_name, connect_timeout=5) except pymysql.MySQLError as e: logger.error("ERROR: Unexpected error: Could not connect to MySQL instance.") logger.error(e) sys.exit() logger.info("SUCCESS: Connection to RDS MySQL instance succeeded") def lambda_handler(event, context): """ This function creates a new RDS database table and writes records to it """ message = event['Records'][0]['body'] data = json.loads(message) CustID = data['CustID'] Name = data['Name'] item_count = 0 sql_string = f"insert into Customer (CustID, Name) values({CustID}, '{Name}')" with conn.cursor() as cur: cur.execute("create table if not exists Customer ( CustID int NOT NULL, Name varchar(255) NOT NULL, PRIMARY KEY (CustID))") cur.execute(sql_string) conn.commit() cur.execute("select * from Customer") logger.info("The following items have been added to the database:") for row in cur: item_count += 1 logger.info(row) conn.commit() return "Added %d items to RDS MySQL table" %(item_count)
In this example code, your database name, username, and password are hardcoded into your function. In a production application, you should not hardcode these parameters. Use AWS Secrets Manager to securely store database access credentials.
To include the PyMySQL dependency with your function code, create a .zip deployment package.
To create a .zip deployment package
-
Save the example code as a file named
lambda_function.py
. Use your own Amazon RDS host endpoint and replace the password in the example code with the password you chose when you created your database instance. -
In the same directory in which you created your
lambda_function.py
file, create a new directory namedpackage
and install the PyMySQL library.mkdir package
pip install --target package pymysql
-
Create a zip file containing your application code and the PyMySQL library. In Linux or MacOS, run the following CLI commands. In Windows, use your preferred zip tool to create the
lambda_function.zip
file.cd package
zip -r ../lambda_function.zip .
cd ..
zip lambda_function.zip lambda_function.py
You can also create your deployment package using a Python virtual environment. See Deploy Python Lambda functions with .zip file archives.
Create the Lambda function

Using the .zip package you just created, you now create a Lambda function using either the AWS CLI or the Lambda console.
Test your Lambda function in the console

You can now use the Lambda console to test your function. You create a test event which mimics the data your function will
receive when you invoke it using Amazon SQS in the final stage of the tutorial. Your test event contains a JSON object specifying a
customer ID and customer name to add to the Customer
table your function creates.
To test the Lambda function
-
Open the Functions
page of the Lambda console and choose your function. -
Choose the Code tab.
-
In the Code source pane, choose Test and enter
myTestEvent
for the event name. -
Copy the following code into Event JSON and choose Save.
{ "Records": [ { "messageId": "059f36b4-87a3-44ab-83d2-661975830a7d", "receiptHandle": "AQEBwJnKyrHigUMZj6rYigCgxlaS3SLy0a...", "body": "{\n \"CustID\": 1021,\n \"Name\": \"Martha Rivera\"\n}", "attributes": { "ApproximateReceiveCount": "1", "SentTimestamp": "1545082649183", "SenderId": "AIDAIENQZJOLO23YVJ4VO", "ApproximateFirstReceiveTimestamp": "1545082649185" }, "messageAttributes": {}, "md5OfBody": "e4e68fb7bd0e697a0ae8f1bb342846b3", "eventSource": "aws:sqs", "eventSourceARN": "arn:aws:sqs:us-west-2:123456789012:my-queue", "awsRegion": "us-west-2" } ] }
-
Choose Test.
In the Execution results tab, you should see results similar to the following displayed in the Function Logs:
[INFO] 2023-02-14T19:31:35.149Z bdd06682-00c7-4d6f-9abb-89f4bbb4a27f The following items have been added to the database: [INFO] 2023-02-14T19:31:35.149Z bdd06682-00c7-4d6f-9abb-89f4bbb4a27f (1021, 'Martha Rivera')
Create an Amazon SQS queue

You have successfully tested the integration of your Lambda function and Amazon RDS database instance. Now you create the Amazon SQS queue you will use to invoke your Lambda function in the final stage of the tutorial.
Create an event source mapping to invoke your Lambda function

An event source mapping is a Lambda resource which reads items from a stream or queue and invokes a Lambda function. When you configure an event source mapping, you can specify a batch size so that records from your stream or queue are batched together into a single payload. In this example, you set the batch size to 1 so that your Lambda function is invoked every time you send a message to your queue. You can configure the event source mapping using either the AWS CLI or the Lambda console.
You are now ready to test your complete setup by adding a message to your Amazon SQS queue.
Test and monitor your setup

To test your complete setup, add messages to your Amazon SQS queue using the console. You then use CloudWatch Logs to confirm that your Lambda function is writing records to your database as expected.
To test and monitor your setup
-
Open the Queues
page of the Amazon SQS console and select your queue ( LambdaRDSQueue
). -
Choose Send and receive messages and paste the following JSON into the Message body in the Send message pane.
{
"CustID": 1054,
"Name": "Richard Roe"
}
-
Choose Send message.
Sending your message to the queue will cause Lambda to invoke your function through your event source mapping. To confirm that Lambda has invoked your function as expected, use CloudWatch Logs to verify that the function has written the customer name and ID to your database table:
-
Open the Log groups
page of the CloudWatch console and select the log group for your function ( aws/lambda/LambdaFunctionWithRDS
). -
In the Log streams pane, choose the most recent log stream.
Your table should contain two customer records, one from each invocation of your function. In the log stream, you should see messages similar to the following:
[INFO] 2023-02-14T19:06:43.873Z 45368126-3eee-47f7-88ca-3086ae6d3a77 The following items have been added to the database: [INFO] 2023-02-14T19:06:43.873Z 45368126-3eee-47f7-88ca-3086ae6d3a77 (1021, 'Martha Rivera') [INFO] 2023-02-14T19:06:43.873Z 45368126-3eee-47f7-88ca-3086ae6d3a77 (1054, 'Richard Roe')
Clean up your resources
You can now delete the resources that you created for this tutorial, unless you want to retain them. By deleting AWS resources that you're no longer using, you prevent unnecessary charges to your AWS account.
To delete the Lambda function
-
Open the Functions page
of the Lambda console. -
Select the function that you created.
-
Choose Actions, Delete.
-
Type
delete
in the text input field and choose Delete.
To delete the execution role
-
Open the Roles page
of the IAM console. -
Select the execution role that you created.
-
Choose Delete.
-
Enter the name of the role in the text input field and choose Delete.
To delete the MySQL DB instance
-
Open the Databases page
of the Amazon RDS console. -
Select the database you created.
-
Choose Actions, Delete.
-
Clear the Create final snapshot check box.
-
Enter
delete me
in the text box. -
Choose Delete.
To delete the Amazon SQS queue
-
Sign in to the AWS Management Console and open the Amazon SQS console at https://console.aws.amazon.com/sqs/
. -
Select the queue you created.
-
Choose Delete.
-
Enter
delete
in the text input field. -
Choose Delete.