【发布时间】: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