2017-07-10 204 views
1

您好我有与this post相同的问题,但没有提供发布的答案(没有示例代码),所以我会开始一个新的线程,并问你们。AWS Lambda - 无法连接到SQL Server RDS

我创建了一个AWS无服务器应用程序(.NET核心)项目为我们的lambda函数和下面的代码是我用来在AWS RDS连接。


string ConnectionString = "Data Source=rds4abc1190.asdfqwerqb9l.us-east-1.rds.amazonaws.com,2855;Initial Catalog=MyDatabase;Persist Security Info=True;User ID=myID;Password=mypassword;Encrypt=False"; 

using (var Conn = new SqlConnection(ConnectionString)) 
{ 
    using (var Cmd = new SqlCommand("SELECT * from Customer", Conn)) 
    { 
      Conn.Open(); //<-- this is where the error fires. 

      SqlDataReader rdr = Cmd.ExecuteReader(); 
      while (rdr.Read()) 
      { 
       myDbItems.Add(rdr[1].ToString()); 
      } 

      Conn.Close(); 
     } 
} 

使用上面的代码在本地机器上运行时,工作正常,但如果部署在AWS API网关,该代码就会出错。

“ERRORTYPE”:“SQLEXCEPTION”,“的errorMessage”:“连接超时过期时后登录阶段超时时间已过的连接可能超时的同时等待服务器完成登录过程和响应;或者尝试创建多个活动连接时可能超时;试图连接到此服务器的时间是[预登录]初始化= 781;握手= 1957; [登录]初始化= 40;身份验证= 122;后登录]完整= 12219;”

+0

您的lambda是否驻留在与有权访问SQLServer RDS子网的SQLServer在同一个VPC中的VPC子网内部? – Ashan

回答

0

如果答案是一样的引用后,再有就是没有任何样本代码,因为它不是一个代码问题。他升级了RDS中的数据库引擎版本,因为AWS Lambda使用的驱动程序不支持连接到MSSQL 2008 R2,而他的本地计算机具有必要的驱动程序。

这里是升级RDS SQL Server引擎版本的AWS文档:

http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_UpgradeDBInstance.SQLServer.html

+0

我们解决了我的问题。我们只是在serverless.template中添加/包含了VpcConfig,角色和策略。 –

+0

啊,有道理。确保Lambda函数在具有正确角色和安全组的正确VPC中运行可能是一个棘手的问题。我将在IAM控制台中为角色设置策略,以确定它的价值,因此您不必在每个无服务器模板上输入策略。 –

1

添加在serverless.template每个功能下面。

"Role": "arn:aws:iam::053984854873:role/1234-Dev",    
    "Policies": [ "AWSLambdaBasicExecutionRole", "AWSLambdaBasicExecutionRole-ABC1234","LambdaAccess-1234" ], 
    "VpcConfig" : { 
     "SecurityGroupIds" : ["sg-4f2cbff1","sg-3584a444"], 
     "SubnetIds" : ["subnet-f2520727","subnet-388b4ab2"] 
    }