Как разделить сервисы API Gateway на бессерверный проект - PullRequest
0 голосов
/ 18 апреля 2020

Я имею дело с ограничением CloudFormation 200 ресурсов на стек. Кажется, решение состоит в том, чтобы разделить мой сервис (файл serverless.yml) на несколько файлов. Я попробовал автоматизированные подходы и они не работают для меня . Итак, я изучаю ручные. Но я не знаю как.

У меня есть образец файла:

service:                        serverless-test

provider:
  name:                         aws
  runtime:                      nodejs12.x
  endpointType:                 REGIONAL

plugins:
- serverless-aws-alias

functions:
  authorizerFunc:
    handler:                    code.authorizer

  users:
    handler:                    code.users
    events:
      - http:
          path:                 /user
          integration:          lambda
          authorizer:           authorizerFunc
          method:               get
          cors:                 true
          request:
            passThrough:        WHEN_NO_TEMPLATES
            template:
              application/json: '{ "action": "list_users" }'
      - http:
          path:                 /user
          integration:          lambda
          authorizer:           authorizerFunc
          method:               post
          cors:                 true
          request:
            passThrough:        WHEN_NO_TEMPLATES
            template:
              application/json: '{ "action": "create_user", "payload": $input.body }'

  posts:
    handler:                    code.posts
    events:
      - http:
          path:                 /post
          integration:          lambda
          authorizer:           authorizerFunc
          method:               get
          cors:                 true
          request:
            passThrough:        WHEN_NO_TEMPLATES
            template:
              application/json: '{ "action": "list_posts" }'
      - http:
          path:                 /post
          integration:          lambda
          authorizer:           authorizerFunc
          method:               post
          cors:                 true
          request:
            passThrough:        WHEN_NO_TEMPLATES
            template:
              application/json: '{ "action": "create_post", "payload": $input.body }'

Может кто-нибудь помочь мне разбить этот файл на 2 или 3? Не стесняйтесь разделить его любым удобным для вас способом (при условии, что в полученных файлах будет меньше ресурсов по отдельности). Просто код JS должен остаться без изменений. Также, пожалуйста, обратите особое внимание на плагин serverless-aws-alias. Это важная часть моего служения. Разумеется, предполагается, что развертывание нескольких файлов должно быть идентичным развертыванию этого одного файла.

1 Ответ

1 голос
/ 19 апреля 2020

Насколько я понимаю, вы сможете справиться с этим, разделив шлюз.

Рекомендую сначала создать serverless.yml с развертыванием общих частей, API-шлюзом и авторизатором

* 1004. *

Оставшиеся части будут разделены в зависимости от количества ресурсов:

service: service-users

provider:
  name: aws
  runtime: nodejs12.x
  region: eu-west-2
  apiGateway:
    restApiId:
      'Fn::ImportValue': MyApiGateway-restApiId
    restApiRootResourceId:
      'Fn::ImportValue': MyApiGateway-rootResourceId
    websocketApiId:
      'Fn::ImportValue': MyApiGateway-websocketApiId

plugins:
  - serverless-aws-alias

functions:
  users:
    handler:                    handler.handler
    events:
      - http:
          path:                 /user
          integration:          lambda
          authorizer:
            arn: authorizerFuncARN
          method:               get
          cors:                 true
          request:
            passThrough:        WHEN_NO_TEMPLATES
            template:
              application/json: '{ "action": "list_users" }'
      - http:
          path:                 /user
          integration:          lambda
          authorizer:           
            arn: authorizerFuncARN
          method:               post
          cors:                 true
          request:
            passThrough:        WHEN_NO_TEMPLATES
            template:
              application/json: '{ "action": "create_user", "payload": $input.body }'

Здесь также есть объяснение: https://serverless.com/framework/docs/providers/aws/events/apigateway#easiest -and-cicd-friendly-example-of-use- shared-api-gateway-and-api-resources

Вам также следует рассмотреть возможность экспорта вашего авторизатора arn во что-то, что вы сможете позже использовать в других бессерверных yamls, может быть, ssm?

...