Есть ли какой-либо способ автоматического управления предполетными конечными точками для каждой конечной точки в бессерверном (AWS Lambda)

#aws-lambda #serverless-framework #serverless #preflight

#aws-lambda #бессерверный фреймворк #бессерверный #предполетный

Вопрос:

Я работаю над AWS Lambda, используя бессерверную платформу, и мне нужно указать два метода functions.yml для каждого из API. Например, если мне нужно создать конечную точку для получения книг http://basic-url.com/api/books/all . Я должен добавить для этого два метода functions.yml следующим образом.

 get_books:
  handler: books/handler.get_books
  tags:
    Name: get-books
  events:
    - httpApi:
        method: GET
        path: /api/books/all

get_books_preflight:
  handler: default/handler.get_preflight
  tags:
    Name: get-preflight
  events:
    - httpApi:
        method: OPTIONS
        path: /api/books/all
 

Я должен указать предполетный запуск для всех конечных точек, которые я хочу создать functions.yml . Есть ли какой-либо способ автоматического управления этими предполетными конечными точками для каждой конечной точки?

Ответ №1:

Нет необходимости создавать функцию для каждой предполетной конечной точки.

Когда браузер получает непростой HTTP-запрос, протокол CORS требует, чтобы браузер отправил предполетный запрос на сервер и дождался утверждения (или запроса учетных данных) с сервера перед отправкой фактического запроса. Предполетный запрос отображается в вашем API как HTTP-запрос, который:

  • Включает заголовок источника.
  • Использует метод OPTIONS.
  • Включает следующие заголовки:
    • Метод запроса управления доступом
    • Заголовки запросов управления доступом

Поэтому для поддержки CORS ресурсу REST API необходимо реализовать метод OPTIONS, который может отвечать на предполетный запрос OPTIONS по крайней мере следующими заголовками ответа, требуемыми стандартом выборки:

  • Управление доступом-Разрешить-Методы
  • Access-Control-Allow-Headers
  • Access-Control-Allow-Origin

С помощью Serverless Framework вы можете сделать это в два простых шага:

  1. Добавьте cors: true флаг к каждой конечной точке HTTP в вашем serverless.yml :
 getBooks:
  handler: books/handler.getBooks
  tags:
    Name: get-books
  events:
    - http:
        path: /api/books/all
        method: GET
        cors: true 
 
  1. Добавьте в свой ответ следующие заголовки:
 module.exports.getBooks = (event, context, callback) => {

  // Do work to retrieve a Book
  const book = retrieveBook(event);

  const response = {
    statusCode: 200,
    headers: {
      'Access-Control-Allow-Origin': '*',
      'Access-Control-Allow-Credentials': true,
      'Access-Control-Allow-Headers': 'Authorization',
    },
    body: JSON.stringify({
      book: book
    }),
  };

  callback(null, response);
};

 

В конце концов, если вы используете Javascript, посмотрите на механизм промежуточного программного обеспечения Middy для использования с Lambda. В нем много хороших промежуточных программ, и одним из них является промежуточное программное обеспечение cors, которое автоматически добавляет заголовки CORS к вашим функциям.

Комментарии:

1. Спасибо за приветствие гардемарина!

2. Привет @willFarrell, спасибо за потрясающую работу, которую вы делаете 😉