Случай для отдельных стеков

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.