【问题标题】:Cannot connect .net core API in AWS Lambda to RDS无法将 AWS Lambda 中的 .net core API 连接到 RDS
【发布时间】:2020-04-19 19:22:30
【问题描述】:

我有一个 .net 核心 Web api,我正在尝试将其部署到 AWS Lambda / API Gateway。我收到一个平淡的错误“无法连接到任何指定的 MySQL 主机”。

我的 API 有 2 个端点用于测试。它们是 /TestConnect 和 /TestAWS。 /TestConnect 端点工作正常(返回“成功”字符串),因此我知道 Web Api 已正确部署。 /TestAWS 端点只是应该返回表的第一行。该代码如下,但它非常简单。我知道这不是最佳做法,但我用它来测试以尝试消除所有其他可能性。

        [HttpGet("TestAWS")]
        public IActionResult TestAWS()
        {
            try
            {
                string dataString = "";

                MySqlConnectionStringBuilder cnString = new MySqlConnectionStringBuilder();

                cnString.Server = Environment.GetEnvironmentVariable("DB_ENDPOINT");
                cnString.UserID = Environment.GetEnvironmentVariable("USER");
                cnString.Password = Environment.GetEnvironmentVariable("PASSWORD");
                cnString.Database = Environment.GetEnvironmentVariable("DATABASE");
                cnString.Port = Environment.GetEnvironmentVariable("PORT");;

                using (MySqlConnection conn = new MySqlConnection(cnString.ToString()))
                {
                    conn.Open();

                    MySqlCommand cmd = new MySqlCommand("SELECT UserName FROM Users LIMIT 1", conn);

                    using (MySqlDataReader dr = cmd.ExecuteReader())
                    {
                        while (dr.Read())
                        {
                            dataString = dr["userName"].ToString();
                        }
                    }
                }

                return Ok("Returned: " + dataString);
            }
            catch (Exception ex)
            {
                return BadRequest("Returned Date { Environmnet: " + Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") + "-" + ex.Message + "}");
            }
        }

为了调试问题,我直接在 AWS 中创建了第二个 Lambda 函数。这是一个非常简单的 Node.js 函数,与我的 API 做同样的事情。

var mysql = require('mysql');
var config = require('./config.json');
var pool  = mysql.createPool({
    connectionLimit : 10,
    host            : config.dbhost,
    user            : config.dbuser,
    password        : config.dbpassword,
    database        : config.dbname
  });

  exports.handler = (event, context, callback) => {
    context.callbackWaitsForEmptyEventLoop = false;
pool.getConnection(function(err, connection) {
  if (err) throw err; // not connected

  connection.query('SELECT UserName FROM Users LIMIT 1', function (error, results, fields) {
    connection.release();

    if (error) callback(error);
    else callback(null, results[0].UserName)
  });
});
  };

该函数正常工作并返回表中的行。

这两个函数具有相同的 VPC 设置。相同的 VPC、相同的子网、相同的 IAM 角色、相同的安全组。这告诉我 AWS 基础设施设置正确,并且 VPC、NACL 等没有问题。

我认为只剩下 C# 代码。

我是否必须对 Web Api 进行一些更改才能使其正常工作?似乎我必须在 C# 中添加一些特定于 Lambda 的处理,就像我在工作 Lambda 中所做的那样,但我找不到任何对这种效果的引用。

非常感谢任何帮助。

【问题讨论】:

  • 最近提出了非常相似的问题(但 OP 最终没有提供所请求的信息):stackoverflow.com/questions/59310932/… 虽然我怀疑问题是网络/VPC/防火墙问题,它阻止了网络数据包从到达 MySQL 服务器的 C# 代码,我想知道您使用的数据库库是否是问题的一部分。尝试从 MySql.Data 切换到 nuget.org/packages/MySqlConnector,它是一个更稳定的库,具有更好的 .NET Core 支持。
  • 我同意数据包没有到达服务器。奇怪的是,我的测试 Lambda 函数可以连接到数据库。这就是为什么我虽然它可能围绕连接池或 callbackWaitsForEmptyEventLoop 展开,但我在文档中没有看到它。我去看看那个图书馆。

标签: c# mysql asp.net-core aws-lambda asp.net-core-webapi


【解决方案1】:

来自 cmets:@Bradley Grainger

“尝试从 MySql.Data 切换到 nuget.org/packages/MySqlConnector, 它是一个更稳定的库,具有更好的 .NET Core 支持。”

我切换到那个包,一切正常。我最终不能说这是唯一的问题,因为我在此调试过程中重新创建了整个 VPC/子网/数据库等。

但是,在我重新创建 VPC 后,我使用 MySql.Data 库运行我的代码但它不起作用,然后我切换到 MySqlConnnector 库并且它正常工作。

图书馆至少是问题的一部分。

【讨论】:

    猜你喜欢
    • 2017-11-15
    • 2021-06-10
    • 2019-10-07
    • 2017-12-13
    • 2018-05-13
    • 2017-10-12
    • 2019-09-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多