5

Если у меня есть две службы «Пользователи» и «Продукты», каждая из которых имеет несколько функций с конечными точками, определенными для каждого (как и любой традиционный API), возможно ли, чтобы они быть организованы отдельно в базе кода (для ясности), но после развертывания используется один и тот же базовый URL-адрес API? Например, рассмотрим я иметь следующую структуру:Serverless Framework - две службы в одной конечной точке APIGW

/src 
-- /users 
---- event.json 
---- handler.js 
---- serverless.yml 
-- /products 
---- event.json 
---- handler.js 
---- serverless.yml 

и мой src/users/serverless.yml имеет следующие определены:

functions: 
    create: 
    handler: handler.create 
    events: 
     - http: POST user 

    read: 
    handler: handler.read 
    events: 
     - http: GET user 

и мой src/products/serverless.yml имеет в основном то же самое, только своп «пользователя» для «продуктов» ,

В настоящее время обе эти услуги будут развернуты совершенно разные API конечных точек, один с URL https://fghijklmnop.execute-api..., а другой с URL https://abcdevwxyz.execute-api....

Мой вопрос, возможно ли было бы, чтобы эти услуги будут развернуты, но остаются под одним API с одним URL (так что оба будут обслуживаться по адресу https://abcdevwxyz.execute-api....)?

Я предполагаю, что ответ должен быть «Нет, потому что облачная формация ...», но я подумал, что поставил бы здесь вопрос просто ради обсуждения и помог бы себе понять создание безсерверных приложений.

Я знаю использование пользовательских доменов, согласно the answer here, но для более быстрого цикла разработки это не идеальное решение.

Моим единственным решением до сих пор было бы просто создать службу под названием «api», которая будет содержать все конечные точки, которые потребует мой API, который просто вызовет функции Lambda других моих служб, а не через предварительно сконфигурированные конечные точки. На самом деле это был бы слой абстракции, но добавьте потенциально ненужные слои в мое приложение. Опять же, любопытно посмотреть, что чувствует сообщество на этом.

ответ

0

Я придумал свое решение этой проблемы. Я абстрагировал точки интеграции моего приложения, чтобы у меня были определенные службы интеграции (API, S3, SNS и т. Д.), Которые реагируют на события, а затем обрабатывают эти события и делегируют их для разделения микросервисов. Я написал на нем article с примерами кода.

1

Вы можете поместить несколько функций в одном serverless.yml

/src 
-- event.json 
-- users.handler.js 
-- products.handler.js 
-- serverless.yml 
+0

Это правда, но эти службы тесно связаны и всегда должны быть развернуты и управляться вместе. Если вы хотите, чтобы службы явно отличались друг от друга (но связаны через слой API), это не работает. Имя службы должно быть таким же, например. –

1

Я не могу говорить непосредственно рамочная поддержку бессерверной, но это, конечно, возможно в API шлюзе.

Вы можете поддерживать несколько файлов Swagger для каждого «sub API» и использовать import? Mode = merge для импорта обоих определений в один и тот же API.

См http://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-import-api.html

Спасибо, Райан

0

Вы можете использовать пользовательские имена доменов: http://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-custom-domains.html

установки имя пользовательских доменов (вам нужен сертификат SSL) http://myapi.com/

тогда сопоставьте ваш apis:

http://myapi.com/users 
http://myapi.com/products 

Просто позвоните свои функции, как это:

http://myapi.com/users/create 
http://myapi.com/users/read 
http://myapi.com/products/whaterver 
+0

По моему вопросу, я действительно ищу альтернативы этому, поскольку он не подходит для плавного развития. Я не готов регистрировать любые домены прямо сейчас. –

1

Что я сделал с моим собственным кодом, чтобы тянуть весь код из handler.js файлов и поместить его внутри модулей.Эти модули потребуются в файлах handler.js, и тогда будет вызываться простая функция.

usersModule.js:

export const doSomething =() => { 
    // Do something here. 
}; 

пользователей/handler.js:

import {doSomething} from '../.../usersModule.js'; 

export const handler = (event, context, callback) => { 
    doSomething(); 
    // Do other stuff... 
    callback(null, "Success"); 
}; 

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

У вас, однако, все равно должен быть установлен один API. Или используйте ответ от RyanG-AWS, чтобы объединить API.


Если вы по-прежнему хотите, чтобы отдельные определения кода и API были разделены, вы можете создать API-интерфейс пользователей и API продуктов отдельно. Тогда у вас будет другой комбинированный API, который будет вызывать любой из этих API. Таким образом, у вас будет одна служба с одним базовым URL-адресом, который вы бы назвали. Вы можете сделать это с помощью типа интеграции HTTP. Я не пробовал этого, поэтому я не знаю, как хорошо это сработает.