Случай для отдельных стеков
1. What is a Shared API Gateway? 2. Why use a Shared API Gateway? 3. Implementing a Shared API Gateway 4. Deploying the Shared API Gateway 5. Conclusion
Что такое общий шлюз API?
Общий шлюз API — это когда несколько служб используют один шлюз API. Эти сервисы могут быть полностью отдельными API-интерфейсами или, чаще, небольшими компонентами более крупного API.
Зачем использовать общий шлюз API?
Есть несколько преимуществ общих шлюзов API. Первичным является разбиение больших API на более мелкие, более управляемые компоненты. Разбивая более крупные API-интерфейсы на более мелкие компоненты, при обновлении этих компонентов возникает гораздо меньше накладных расходов.
Например, при больших монолитных кодовых базах для обновления одной лямбда-функции потребуется повторно развернуть весь API. Это создает ненужные накладные расходы за счет увеличения времени и сложности развертывания.
Используя общие шлюзы API, можно обновить и повторно развернуть один компонент без повторного развертывания всего API.
Еще одним преимуществом разделения API на более мелкие компоненты является гибкость защиты конечных точек. При использовании отдельных API-интерфейсов безопасность может быть реализована по-разному для каждого API. Например, API аутентификации, который обрабатывает регистрацию, подтверждение по электронной почте и выход из системы, не обязательно нуждается в защищенных конечных точках. В то время как пользовательский API, возвращающий пользовательские данные, потребует безопасных конечных точек.
Имея отдельные компоненты для API-интерфейсов аутентификации и пользователя, безопасность можно было бы реализовать только в API-интерфейсе пользователя, вместо того, чтобы без необходимости реализовывать как API-интерфейсы пользователя, так и API-интерфейсы аутентификации с более традиционным монолитным API.
Внедрение общего шлюза API
Эта реализация будет разбита на следующие три компонента. Репозиторий кода будет предоставлен в конце статьи.
1. Shared API Gateway 2. Auth API 2. User API
Общий шлюз API
Это основной бессерверный файл со шлюзом API. Добавление выходов — это основное отличие от традиционного шлюза API. Выходные данные позволяют передавать переменные между общим шлюзом API и другими компонентами API. Основными переменными, необходимыми другим компонентам, являются RestApiId
и RootResourceId
.
service: shared-api-gateway frameworkVersion: '3' provider: name: aws runtime: nodejs16.x region: us-east-1 resources: Resources: SharedAPIGateway: Type: AWS::ApiGateway::RestApi Properties: Name: SharedAPIGateway Outputs: apiGatewayRestApiId: Value: Ref: SharedAPIGateway Export: Name: SharedAPIGateway-restApiId apiGatewayRestApiRootResourceId: Value: Fn::GetAtt: - SharedAPIGateway - RootResourceId Export: Name: SharedAPIGateway-rootResourceId
API авторизации
Это пример компонента API аутентификации, который может быть частью более крупного API. По сравнению с традиционной реализацией лямбда-выражений без сервера основное отличие заключается в передаче RestApiId
и RootResourceId
внутри провайдера. Это делается с помощью параметра apiGateway
.
service: shared-api-gateway-auth provider: name: aws runtime: nodejs16.x region: us-east-1 apiGateway: restApiId: "Fn::ImportValue": SharedAPIGateway-restApiId restApiRootResourceId: "Fn::ImportValue": SharedAPIGateway-rootResourceId httpApi: cors: true disableDefaultEndpoint: true functions: signUp: handler: authHandler.signUp events: - http: path: auth/sign-up method: post signIn: handler: authHandler.signIn events: - http: path: auth/sign-in method: post confirmEmail: handler: authHandler.confirmEmail events: - http: path: auth/confirm-email method: post
Пользовательский API
Подобно API аутентификации, это пример компонента для пользовательского API, который может быть частью более крупного API. Эта реализация аналогична API аутентификации в отношении передачи RestApiId
и RootResourceId
внутри провайдера с использованием параметра apiGateway
.
service: shared-api-gateway-user provider: name: aws runtime: nodejs16.x region: us-east-1 apiGateway: restApiId: "Fn::ImportValue": SharedAPIGateway-restApiId restApiRootResourceId: "Fn::ImportValue": SharedAPIGateway-rootResourceId httpApi: cors: true disableDefaultEndpoint: true functions: getUser: handler: userHandler.getUser events: - http: path: user/get-user method: getDeploying the Sahred API Gateway
Развертывание общего шлюза API
Стандартное бессерверное развертывание может использоваться для развертывания общего шлюза API и других компонентов API. Сначала необходимо развернуть общий шлюз API. Однако для будущих развертываний необходимо развернуть только измененный компонент.
Разверните с помощью следующей бессерверной команды serverless deploy
в соответствующем каталоге развертываемого API (общий шлюз или компоненты).
В предоставленном репозитории сценарий развертывания развернет общий шлюз вместе с компонентами аутентификации и пользователя.
Заключение
Шлюзы общих API — отличный способ разбить большие API на более мелкие компоненты и упростить разработку и обслуживание.
Я надеюсь, что эта статья была хорошим введением в преимущества и возможности, предоставляемые шлюзами общего API. Как уже упоминалось, полный код этой реализации можно найти ниже.
Следите за новостями, чтобы не пропустить новые статьи о реализации безопасности в общих шлюзах API.