【问题标题】:Why does my .NET Core Web API (deployed on AWS Lambda) return a 502 Bad Gateway error?为什么我的 .NET Core Web API(部署在 AWS Lambda 上)返回 502 Bad Gateway 错误?
【发布时间】:2019-06-07 23:05:01
【问题描述】:

我是 .NET Core、Entity Framework、AWS 以及这里几乎所有内容的新手(如果需要在帖子中添加任何内容,请发表评论并告诉我)。

我正在尝试使用 AWS Lambda 部署 .NET Core Web API。我的 API 似乎在本地工作,因为我对其进行了测试(我有一个 Angular 前端应用程序,通过它我能够成功执行所有 API)。但是,当我使用 AWS 部署并在 Postman 上运行一些 API 时,我收到“502 Bad Gateway”错误。

我的serverless.yml 文件如下所示:

service: angularawardwebapi

provider: 
  name: aws
  runtime: dotnetcore2.1
  region: us-east-1

package:
  artifact: bin/release/netcoreapp2.1/deploy-package.zip

functions:
  api:
    handler: angularawardwebapi::angularawardwebapi.LambdaEntryPoint::FunctionHandlerAsync
    events: 
      - http:
          path: /{proxy+}
          method: ANY

我的模型类看起来像这样:

using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace angularawardwebapi.Models {
    public class Student {
        [Key]
        public int StudentId{get;set;}

        [Required]
        [Column(TypeName="nvarchar(50)")]
        public string StudentFirstName{get;set;}

        [Required]
        [Column(TypeName="varchar(50)")]
        public string StudentLastName{get;set;}
    }
}

我的 DbContext 文件如下所示:

public class DatabaseContext:DbContext {
        public DatabaseContext(DbContextOptions<DatabaseContext> options):base(options) {

        }

        public DbSet<Student> Students {get;set;} 
   }
}

我的控制器中有两个方法:

        [HttpGet("temp")]
        public ActionResult<List<String>> GetTemp() {
            return Ok("here");
        } 


        [HttpGet]
        public ActionResult<IEnumerable<Student>> GetStudent()
        {
            return Ok(_context.Students);
        }

第一个可以顺利运行(如预期的那样)。但是,当我尝试返回数据库中的学生列表时,我似乎遇到了问题。

我也尝试在本地使用第二个 API,并收到了适当的响应:

[
    {
        "StudentId": 1,
        "StudentFirstName": "John",
        "StudentLastName": "Doe"
    }
]

我还检查了 AWS CloudWatch 日志,显示如下:

[Information] Microsoft.AspNetCore.Hosting.Internal.WebHost: Request starting GET https://[myurl]/dev/api/Student/ 
[Information] Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker: Route matched with {action = "GetStudent", controller = "Student"}. Executing action WebApi.Controllers.StudentController.GetStudent ([myprojectname]) 
[Information] Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker: Executing action method WebApi.Controllers.StudentController.GetStudent ([myprojectname]) - Validation state: Valid 
[Information] Microsoft.EntityFrameworkCore.Infrastructure: Entity Framework Core 2.1.8-servicing-32085 initialized 'DatabaseContext' using provider 'Microsoft.EntityFrameworkCore.SqlServer' with options: None 
END RequestId: f57417d3-4075-4680-a78d-e90e2c710760
REPORT RequestId: f57417d3-4075-4680-a78d-e90e2c710760  Duration: 6006.80 ms    Billed Duration: 6000 ms Memory Size: 1024 MB   Max Memory Used: 141 MB 
2019-06-06T14:19:41.116Z f57417d3-4075-4680-a78d-e90e2c710760 Task timed out after 6.01 seconds

当我在本地运行 API 时,不会出现此超时问题,因为我会立即得到正确的响应(如上所述)。


更新

所以我现在有了一个 RDS 数据库,我可以成功地连接到它并在 SSMS 中使用它。在本地运行 API 也仍然有效。但是,在我使用serverless deploy -v 部署它之后,我仍然面临上一个问题。正如建议的那样,我尝试修改数据库的权限,尽管我也不确定我在那里做的事情是正确的。我所做的是:

  • 进入 SSMS 并修改数据库权限,方法是右键单击服务器,转到权限,选择我的登录名(我在配置 RDS 时设置的),并授予“更改任何数据库”选项。然后我进入数据库本身并修改了一些权限(删除、插入和更新)。
  • 我还启用了 Windows Management Instrumentation (WMI-In) Windows 防火墙规则。

这些似乎都没有解决我的问题。

【问题讨论】:

  • 生产数据库和本地数据库中有多少学生?
  • 现在,我同时使用本地数据库。
  • 是什么让我想到了这个问题:数据库似乎并非完全无法访问,否则错误会有所不同。像数据库一样超时气味需要太多时间来传输结果 - 例如,如果您有大量的点击量,就会出现这种情况。你如何托管你的数据库?在 AWS 上还是在完全不同的地方?
  • 谢谢!我想我必须首先使用 Elastic Beanstalk 设置我的数据库实例和所有内容,对吗?然后按照我设置本地数据库的相同步骤进行操作。
  • @Fildor 感谢您之前的帮助。我仍然遇到这个问题,但原因似乎不同。根据我在下面与 carlos chourio 的对话,我现在创建了一个 RDS 数据库并更新了我的 .NET 代码以连接到它。但是,我仍然遇到超时问题。

标签: c# entity-framework aws-lambda asp.net-core-webapi rds


【解决方案1】:

您可能使用了在本地 Db 中用于测试的相同连接字符串,您应该将其更改为使用 api 可以从 aws 访问的某个数据库。 如果是这种情况,那么您的 api 正在尝试访问本地数据库(显然它不会找到),这将解释超时问题。

为了修复它,您可能还应该将数据库部署到 AWS,并将项目的连接字符串更改为 AWS 内该数据库的连接字符串。

【讨论】:

  • 所以问题仍然存在。我现在已经设置了一个 RDS 数据库并修改了我的连接字符串以连接到该数据库。在本地使用它会产生正确的结果,因此我已正确配置它。但是,一旦我使用 serverless deploy -v 部署它并尝试相同,它会导致与以前相同的超时。
  • 您是否检查过您是否允许通过 api 连接数据库?您可能需要设置一些权限才能连接
  • 抱歉回复晚了。我该如何设置?我已经为项目设置了 IAM 令牌,但这似乎不是唯一的问题。
  • 我不认为我可以帮助你,我已经回答了,因为我在将 API 部署到 Azure 时遇到了同样的问题,但我不熟悉 AWS。在 azure 中,您必须转到防火墙设置并启用 允许访问 azure 服务 选项。 AWS 应该有类似的配置。您还可以向防火墙添加一条规则,让您从 web api 的 ip 连接并检查它是否有效
猜你喜欢
  • 2019-09-15
  • 2019-08-24
  • 2018-11-28
  • 1970-01-01
  • 1970-01-01
  • 2021-03-30
  • 2020-11-02
  • 1970-01-01
  • 2017-10-04
相关资源
最近更新 更多