簡體   English   中英

AWS AppSync Lambda 授權方

[英]AWS AppSync Lambda Authorizer

我剛剛在 AWS AppSync 中實現了一個 lambda 解析器。 lambda 和 AppSync 存在於不同的項目中; 提供函數的模板將函數 ARN 寫入 SSM,構建 AppSync 的模板會拉取該 SSM 參數並將該 ARN 分配給AdditionalAuthenticationProvider

部署過程同步進行; Lambda(創建身份驗證函數,將 ARN 設置為 SSM 參數)-> AppSync(創建 API,檢索 SSM 參數並分配給授權提供程序)。 當我檢查控制台時,我可以看到正確的函數 ARN 被分配為 AppSync 的身份驗證提供程序。

問題:當我發出請求時,從未調用 lambda,我可以檢查 CloudWatch 並驗證沒有調用 - 我只是遇到了響應。

{
  "errors" : [ {
    "errorType" : "BadRequestException"
  } ]
}

如果我沒有為authorization標頭提供值,則會得到401 - 這是 lambda 授權指令的預期行為,在繼續執行該功能之前拒絕該標頭中沒有值的任何請求。 因此,它會出現一些不正確的管道連接,缺少的東西,我不能在一個文檔找到允許調用。

問題:如果我進入控制台並手動分配相同的功能 ARN,一切正常並保持正常工作。 似乎控制台在幕后做了一些我的部署沒有做的事情,但我似乎無法正確識別缺少的內容。

我一直在關注這個文檔https://docs.aws.amazon.com/appsync/latest/devguide/security-authz.html#aws-lambda-authorization一個注釋讓我停頓 - 我已經設置了這些信任權限, AFAIK。

用於授權的 Lambda 函數需要對它們應用 appsync.amazonaws.com 的委托人策略,以允許 AWS AppSync 調用它們。 此操作在 AWS AppSync 控制台中自動完成

這是 SAM 模板(沒有輸入參數)


Resources:
  ServiceRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Statement:
          - Effect: Allow
            Principal:
              Service: [ lambda.amazonaws.com, appsync.amazonaws.com ]
            Action: sts:AssumeRole
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole
        - arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
      Policies:
        - PolicyName: logs
          PolicyDocument:
            Version: 2012-10-17
            Statement:
              - Effect: Allow
                Action:
                  - logs:CreateLogGroup
                  - logs:CreateLogStream
                  - logs:PutLogEvents
                Resource: "*"
              - Effect: Allow
                Action:
                  - xray:*
                Resource: "*"
        - PolicyName: ssm
          PolicyDocument:
            Version: 2012-10-17
            Statement:
              - Effect: Allow
                Action: ssm:*
                Resource: "*"

  LambdaPermission:
    Type: AWS::Lambda::Permission
    Properties:
      FunctionName: !Ref AuthorizationFunction
      Action: lambda:Invoke
      Principal: appsync.amazonaws.com
      
  AuthorizationFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: <code-uri>
      Handler: app.lambda
      Runtime: nodejs14.x
      Role: !GetAtt ServiceRole.Arn
      Tracing: Active

  FunctionARNParameter:
    Type: AWS::SSM::Parameter
    Properties:
      Type: String
      Name: <name>
      Value: !GetAtt AuthorizationFunction.Arn

也許把它寫出來我的問題正是我所需要的。 我嘗試的最后一件事是, LambdaPermission是關鍵 - 但操作不正確,需要是InvokeFunction 我還選擇將FunctionName指定為 lambda ARN 而不是名稱

LambdaPermission:
    Type: AWS::Lambda::Permission
    Properties:
      FunctionName: !GetAtt PPSAuthorizationFunction.Arn 
      Action: lambda: InvokeFunction # <--
      Principal: appsync.amazonaws.com

希望這對某人有用!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM