Я новичок в .NET Core, Entity Framework, AWS, и почти все здесь (пожалуйста, прокомментируйте и дайте мне знать, если что-то нужно добавить к сообщению).
Я пытаюсь развернуть .NET Core Web API с помощью AWS Lambda. Похоже, мой API работает локально, так как я тестировал его (у меня есть приложение на языке Angular, с помощью которого я могу успешно выполнить все API). Однако, когда я развертываю с AWS и запускаю несколько API на Postman, я получаю ошибку «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 инструментария управления Windows (WMI-In).
Кажется, ни один из них не решил мою проблему.