Шаблон SAM - API Authorizor для использования существующего пула пользователей Cognito - PullRequest
0 голосов
/ 03 февраля 2020

ОБНОВЛЕНИЕ: Спасибо за помощь!

Я обновил файл template.yml, добавив в него Authorizer, но все равно получаю сообщение об ошибке:

  HelloWorldApi:
    Type: AWS::Serverless::Api
    Properties:
      StageName: Prod
      Cors: "'*'"
      # Auth:
      #   DefaultAuthorizer: MyCognitoAuthorizer
      #   Authorizers:
      #     MyCognitoAuthorizer:
      #       UserPoolArn: arn:aws:cognito-idp:us-east-1:719235216593:userpool/my-user-pool-id



  HelloWorldFunction:
    Properties:
      CodeUri: hello-world/
      Handler: app.lambdaHandler
      Runtime: nodejs10.x
      Events:
        HelloWorld:
          Type: Api 
          Properties:
            RestApiId: !Ref HelloWorldApi
            Path: /hello
            Method: get

  MyCognitoAuthorizer: 
    Type: AWS::ApiGateway::Authorizer
    Properties:
      Name: MyAuthorizer
      Type: COGNITO_USER_POOLS
      RestApiId: !Ref HelloWorldApi
      ProviderARNs:
        - arn:aws:cognito-idp:us-east-1:719235216593:userpool/my-user-pool-id

Однако я Теперь при попытке создания стека получаются следующие данные:

Не удалось создать следующие ресурсы: [MyCognitoAuthorizer, HelloWorldApiDeploymentbc8438953d, HelloWorldFunctionHelloWorldPermissionProd]. , Откат запрошен пользователем.

Я не указал откат и не могу определить, что не так в моем авторизаторе?


ОРИГИНАЛ

Я построил несколько лямбд, каждая из которых имеет свой собственный шлюз Api. Я использую SAM CLI, чтобы сделать это, и каждая лямбда является собственным проектом и имеет собственный файл Template.yml, описывающий инфраструктуру.

Ниже приведен пример templay.yml:

AWSTemplateFormatVersion: '2011-09-09'
Transform: AWS::Serverless-2016-10-31

Resources:
    # Avoid 'implicit API' creation via SAM by explicitly defining one
    HelloWorldApi:
        Type: AWS::Serverless::Api
        Properties:
          StageName: Prod
          Cors: "'*'"


    HelloWorldFunction:
        Type: AWS::Serverless::Function 
        Properties:
          CodeUri: hello-world/
          Handler: app.lambdaHandler
          Runtime: nodejs10.x
          Events:
            HelloWorld:
              Type: Api 
              Properties:
                RestApiId: !Ref HelloWorldApi # reference defined API
                Path: /hello
                Method: get

Теперь я хотел бы предоставить аутентификацию для каждой лямбды. Однако я бы хотел, чтобы все лямбды использовали один и тот же пул Cognito User . Я видел много примеров, которые создают связанный пул пользователей с лямбдой, но в этом случае я получу новый пул пользователей для каждой лямбды.

Есть ли способ, которым я могу указать в template.yml ARN существующего пула пользователей, который я создал с помощью консоли AWS?

Примечание: я не очень знаком с синтаксисом CloudFormation, поэтому желательно, чтобы это было возможно с синтаксисом шаблона CLI SAM.

1 Ответ

1 голос
/ 03 февраля 2020

На существующие ресурсы, созданные вне CloudFormation, можно ссылаться в шаблонах, просто жестко закодировав нужный идентификатор (в данном случае ARN):

    Authorizer:
      Type: AWS::ApiGateway::Authorizer
      Properties:
        Type: COGNITO_USER_POOLS
        RestApiId: !Ref HelloWorldApi
        ProviderARNs:
          - # hardcoded Cognito User Pool ARN

AWS::ApiGateway::Authorizer документация

Cognito User Pool ARN format


Вы сможете найти ARN своего пула пользователей Cognito на консоли Cognito

...