6

How can I connect to a RDS SQL server database on a ASW Lambda function?

This code below work fine on regular C# console app project but giving me error on AWS Lambda project once I deployed it to AWS and tried to invoke it:

public static string CS = "Data Source=host-name, 1433; Initial Catalog=database-name; User ID=username; Password='password';";

    public static List<string> Get_Rule_Group()
    {
        using (SqlConnection con = new SqlConnection(CS))
        {
            string query = "SELECT abc from table where abc = xyz";
            SqlCommand cmd = new SqlCommand(query, con);
            con.Open();
            SqlDataReader reader = cmd.ExecuteReader();
            List<string> Rule_Group = new List<string>();
            while (reader.Read())
            {
                Rule_Group.Add(reader["abc"].ToString());
            }
            return Rule_Group;
        }
    }

Error:

2017-10-06 19:10:27: START RequestId: f33cf098-9360-11e7-96fb-7594ff8505a7 Version: $LATEST
2017-10-06 19:10:43: A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: TCP Provider, error: 35 - An internal exception was caught)
2017-10-06 19:10:44:    at System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, Object providerInfo, Boolean redirectedUserInstance, SqlConnectionString userConnectionOptions, SessionData reconnectSessionData, Boolean applyTransientFaultHandling)
2017-10-06 19:10:44:    at System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection, DbConnectionOptions userOptions)
2017-10-06 19:10:44:    at System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnectionPool pool, DbConnection owningObject, DbConnectionOptions options, DbConnectionPoolKey poolKey, DbConnectionOptions userOptions)
2017-10-06 19:10:44:    at System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection)
2017-10-06 19:10:44:    at System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection)
2017-10-06 19:10:44:    at System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, UInt32 waitForMultipleObjectsTimeout, Boolean allowCreate, Boolean onlyOneCheckConnection, DbConnectionOptions userOptions, DbConnectionInternal& connection)
2017-10-06 19:10:44:    at System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal& connection)
2017-10-06 19:10:44:    at System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal oldConnection, DbConnectionInternal& connection)
2017-10-06 19:10:44:    at System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
2017-10-06 19:10:44:    at System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry)
2017-10-06 19:10:44:    at System.Data.SqlClient.SqlConnection.Open()
2017-10-06 19:10:44:    at AWSLambdaErrorReport.DAL.Get_Rule_Group()
2017-10-06 19:10:44:    at AWSLambdaErrorReport.Function.<FunctionHandler>d__6.MoveNext()
2017-10-06 19:10:44: FAILED to proceed
2017-10-06 19:10:44: END RequestId: f33cf098-9360-11e7-96fb-7594ff8505a7
2017-10-06 19:10:44: REPORT RequestId: f33cf098-9360-11e7-96fb-7594ff8505a7 Duration: 17209.25 ms   Billed Duration: 17300 ms   Memory Size: 256 MB Max Memory Used: 40 MB
0

2 Answers 2

3

You have to do the following:

  1. Place the Lambda function in the same VPC as the RDS instance.
  2. Open the Security Group assigned to the RDS instance to allow connections from the Lambda function. The easiest way to do this is to create a rule in the RDS security group allowing inbound connections from the Lambda security group.
Sign up to request clarification or add additional context in comments.

3 Comments

How do I know if my Lambda function and the RDS intance are in a same VPC? I see the VPC name when I look at my RDS instance but my Lamdba function doesn't show what VPC it is reside on?
Nmv I see the VPC option for Lambda under the configuration tab, they are in the same VPC
OK, IAM role for the Lambda has full access ro almost everything (Lambda, S3, Clouwatch, RDS, EC2 etc.), security group for the RDS is open to accept ALL TRAFFICS from everywhere, still having same issues. I wonder if .Net core and LAmbda dont support ADO.NET (sqlconnection etc.)
1

Did you configure the VPC in your Lambda Function?

Have a look at: http://docs.aws.amazon.com/lambda/latest/dg/vpc-rds.html

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.