Используя Serverless, как настроить авторизатор лямбда-функции для Cognito User Pool из ресурсов? - PullRequest
0 голосов
/ 03 мая 2018

В моем serverless.yml у меня есть функция Lambda, и я хочу установить для ее авторизатора пул Cognito, который я объявил в разделе ресурсов ниже. Я видел примеры, когда авторизатор установлен на aws_iam, но это кажется неправильным Любая помощь была бы удивительной:)

Я думаю, мне нужно установить ARN авторизатора на ARN пула, но как мне его получить? Или это даже правильно?

Ответы [ 2 ]

0 голосов
/ 10 июня 2018

Как отмечено в другом ответе, жесткое кодирование ARN работает. Таким образом, вы можете подумать, что что-то вроде этого сработает:

    authorizer:
      arn: 
        Fn::GetAtt: [UserPool, Arn]

К сожалению, это не так. Похоже, что Без сервера наталкивает ваш arn на пару регулярных выражений, чтобы определить, указываете ли вы на лямбда или пул пользователей. Этот подход, кажется, не очень хорошо подходит для подходов, использующих такие вещи, как Ref, Fn::Join или Fn::GetAtt


По состоянию на Безсерверный 1.27.3 (который был выпущен после того, как был задан этот вопрос), существует своего рода обходной путь .

По сути, вы объявляете свой Authorizer в своем разделе resources, вместо того, чтобы Serverless автоматически создавал его для вас. Затем вы используете новый ключ authorizerId в разделе functions, чтобы указать на этого авторизатора. Минимальный пример:

service: sls-cognitotest

provider:
  name: aws
  runtime: nodejs6.10
functions:
  hello:
    handler: handler.hello
    events:
      - http:
          method: any
          path: /api/{proxy+}
          integration: lambda
          authorizer: 
            type: COGNITO_USER_POOLS
            authorizerId: { Ref: MyApiGatewayAuthorizer }
resources:
  Resources:
    CognitoUserPoolGeneral:
      Type: AWS::Cognito::UserPool
      Properties:
        UserPoolName: general
    MyApiGatewayAuthorizer: 
      Type: AWS::ApiGateway::Authorizer
      Properties: 
        AuthorizerResultTtlInSeconds: 10
        IdentitySource: method.request.header.Authorization
        Name: MyCognitoAuthorizer
        RestApiId: 
          Ref: ApiGatewayRestApi
        Type: COGNITO_USER_POOLS
        ProviderARNs: 
          - {"Fn::Join": ["", ["arn:aws:cognito-idp:", {Ref: "AWS::Region"}, ":", {Ref: "AWS::AccountId"}, ":userpool/", Ref: CognitoUserPoolGeneral]]} 

Это не здорово, но это лучше, чем жестко кодировать ARN пула пользователей в свой шаблон.

0 голосов
/ 03 мая 2018

Это то, что вы ищете? https://serverless.com/framework/docs/providers/aws/events/apigateway#http-endpoints-with-custom-authorizers

Пример:

AFunctionName:
  handler: src/index.handler
  description: desc
  environment: ${file(environment.yml)}
  events:
    - http:
        method: any
        path: /api/{proxy+}
        authorizer:
          arn: arn:aws:cognito-idp:eu-west-1:123456:userpool/eu-west-1_123456
...