Безсерверные конфигурации шаблонов AWS с пользовательским API авторизации и отдыха - PullRequest
0 голосов
/ 01 ноября 2018

Я новичок в AWS Lambda Services. Я создал лямбда-метод без сервера и успешно развернул его в облаке AWS.

Затем я создал собственный авторизатор Lambda и настроил шлюз API для метода Lambda и собственного авторизатора.

Так же, мне нужно предоставить много других, менее серверных, лямбда-методов, поэтому я решил перенести свой лямбда-метод в безсерверный .Net API Project. Я могу развернуть этот api-проект в облаке AWS, а затем вручную настроить авторизатор на использование моего собственного метода Authorize lambda.

Трудная часть - , я хочу настроить все это через файл serverless.template.

Я изо всех сил пытаюсь получить RESTAPIID для моего пользовательского метода авторизации и как настроить авторизатор для моей лямбда-функции с помощью файла serverless.template. Ниже приведены конфигурации, которые я сделал. Также как получить AuthorizerUri ?

Я не хочу жестко кодировать что-либо.

    "Resources" : {
**//How I can create this serverless function to use my custom authorizer?**
    "Create" : {
      "Type" : "AWS::Serverless::Function",      
      "Properties": {
        "Handler": "Osn.Ott.Telco.Connector.UI.Web.Controllers.V10::Osn.Ott.Telco.Connector.UI.Web.Controllers.V10.SubscriptionController::Create",
        "Runtime": "dotnetcore2.1",
        "CodeUri": "",
        "MemorySize": 256,
        "Timeout": 30,
        "Role": null,
        "FunctionName" : "CreateCustomer",
        "Policies": [ "AWSLambdaBasicExecutionRole" ],
        "Events": {
          "PutResource": {
            "Type": "Api",
            "Properties": {
              "Path": "/create",
              "Method": "POST"
            }            
          }
        }
      }
    },
    "CustomAuthorizer" : {
        "Type" : "AWS::ApiGateway::Authorizer",
        "Properties" : {
            "AuthorizerUri" : {"Fn::GetAtt" : [ "Create", "Arn"]},
            "IdentitySource" : "method.request.header.Authorization,method.request.context.resourcePath, method.request.context.path",
            "Name"           : "CustomAuthorizer",
            "Type"           : "REQUEST",
**//How I can get this id?**
            "RestApiId" : {"Fn::GetAtt" : [ "ServerlessRespApi", ""]}
        }
    }
}

1 Ответ

0 голосов
/ 02 ноября 2018

AWS объявила о поддержке Модель безсерверных приложений AWS поддерживает авторизаторы Amazon API Gateway на прошлой неделе (это можно было сделать и раньше, но тогда нужно было использовать встроенный Swagger в шаблоне SAM).

Есть несколько примеров GitHub, связанных со страницей выше, и я думаю, что Lambda Request Authorizer наиболее близок к вашей проблеме. Код ниже скопирован из template.yaml . Также см. API Auth Object часть спецификации AWS SAM.

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: API Gateway with Lambda Token Authorizer
Resources:
  MyApi:
    Type: AWS::Serverless::Api
    Properties:
      StageName: Prod
      Auth:
        DefaultAuthorizer: MyLambdaRequestAuthorizer
        Authorizers:
          MyLambdaRequestAuthorizer:
            FunctionPayloadType: REQUEST
            FunctionArn: !GetAtt MyAuthFunction.Arn
            # FunctionInvokeRole: !Ref MyRole
            Identity:
              QueryStrings:
                - auth
              # NOTE: Additional options:
              # Headers:
              #   - Authorization
              # StageVariables:
              #   - AUTHORIZATION
              # Context:
              #   - authorization
              # ReauthorizeEvery: 100 # seconds

  MyFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: ./src
      Handler: index.handler
      Runtime: nodejs8.10
      Events:
        GetRoot:
          Type: Api
          Properties:
            RestApiId: !Ref MyApi
            Path: /
            Method: get
            Auth:
              Authorizer: NONE
        GetUsers:
          Type: Api
          Properties:
            RestApiId: !Ref MyApi
            Path: /users
            Method: get

  MyAuthFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: ./src
      Handler: authorizer.handler
      Runtime: nodejs8.10

Outputs:
  ApiURL:
    Description: "API URL"
    Value: !Sub 'https://${MyApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/'
...