【问题标题】:AWS AppSync Lambda AuthorizerAWS AppSync Lambda 授权方
【发布时间】:2021-10-29 23:37:20
【问题描述】:

我刚刚在 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 授权指令的预期行为,在继续执行函数之前拒绝该标头中没有值的任何请求。 所以看起来有些东西没有正确探测,something 丢失了我无法在文档中找到以允许调用。

问题:如果我进入控制台并手动分配相同的功能 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

【问题讨论】:

    标签: amazon-web-services aws-lambda aws-appsync aws-sam


    【解决方案1】:

    也许输入我的问题正是我所需要的。我尝试的最后一件事,LambdaPermission 是关键 - 但操作不正确,需要InvokeFunction。 我还选择将 FunctionName 分配为 lambda ARN 而不是名称

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

    希望这对某人有用!

    【讨论】:

      猜你喜欢
      • 2018-07-04
      • 2022-11-08
      • 2017-11-12
      • 2021-10-13
      • 2021-07-28
      • 2019-03-11
      • 2020-12-02
      • 2019-12-12
      • 1970-01-01
      相关资源
      最近更新 更多