Почему мой .NET Core Web API (развернутый в AWS Lambda) возвращает ошибку 502 Bad Gateway? - PullRequest
1 голос
/ 06 июня 2019

Я новичок в .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).

Кажется, ни один из них не решил мою проблему.

1 Ответ

0 голосов
/ 06 июня 2019

Вы, вероятно, используете ту же строку подключения, которую использовали для тестирования в своей локальной базе данных, вы должны изменить ее, чтобы использовать некоторую базу данных, к которой api может получить доступ из aws. Если это так, то ваш API пытается получить доступ к локальной базе данных (которую, очевидно, он не найдет), что объясняет проблему тайм-аута.

Чтобы исправить это, вы, вероятно, должны также развернуть свою базу данных в AWS и изменить строку подключения проекта на строку подключения этой базы данных внутри AWS.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...