AWS AppSync Lambda 授权方
AWS AppSync Lambda Authorizer
我刚刚在 AWS AppSync 中实施了 lambda 解析器。 lambda 和 AppSync 存在于不同的项目中;提供函数的模板将函数 ARN 写入 SSM,构建 AppSync 的模板拉下该 SSM 参数并将该 ARN 分配给 AdditionalAuthenticationProvider
.
部署过程同步有序进行; Lambda(创建 auth 函数,将 ARN 设置为 SSM 参数)-> AppSync(创建 API,检索 SSM 参数并分配给授权提供程序)。
当我检查控制台时,我可以看到正确的函数 ARN 被分配为 AppSync 的身份验证提供程序。
问题:当我发出请求时,lambda 从未被调用,我可以检查 CloudWatch 并验证没有调用 - 我刚收到响应。
{
"errors" : [ {
"errorType" : "BadRequestException"
} ]
}
如果我不为 authorization
header 提供值,我会得到一个 401
- 这是 lambda 授权指令的预期行为,拒绝任何没有在继续该功能之前 header 中的值。
所以看起来有些东西没有正确探测,一些东西丢失了,我在文档中找不到允许调用的东西。
陷阱:如果我进入控制台并手动分配相同的函数 ARN,一切正常 并保持正常工作。看起来,也许控制台正在幕后做一些我的部署没有做的事情,但我似乎无法正确识别缺少的东西。
我一直在关注此文档 https://docs.aws.amazon.com/appsync/latest/devguide/security-authz.html#aws-lambda-authorization 并且有一个注释让我停下来 - 我已经设置了这些信任权限,AFAIK。
Lambda functions used for authorization require a principal policy for appsync.amazonaws.com to be applied on them to allow AWS AppSync to call them. This action is done automatically in the AWS AppSync console
这是 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
希望这对某人有用!
我刚刚在 AWS AppSync 中实施了 lambda 解析器。 lambda 和 AppSync 存在于不同的项目中;提供函数的模板将函数 ARN 写入 SSM,构建 AppSync 的模板拉下该 SSM 参数并将该 ARN 分配给 AdditionalAuthenticationProvider
.
部署过程同步有序进行; Lambda(创建 auth 函数,将 ARN 设置为 SSM 参数)-> AppSync(创建 API,检索 SSM 参数并分配给授权提供程序)。 当我检查控制台时,我可以看到正确的函数 ARN 被分配为 AppSync 的身份验证提供程序。
问题:当我发出请求时,lambda 从未被调用,我可以检查 CloudWatch 并验证没有调用 - 我刚收到响应。
{
"errors" : [ {
"errorType" : "BadRequestException"
} ]
}
如果我不为 authorization
header 提供值,我会得到一个 401
- 这是 lambda 授权指令的预期行为,拒绝任何没有在继续该功能之前 header 中的值。
所以看起来有些东西没有正确探测,一些东西丢失了,我在文档中找不到允许调用的东西。
陷阱:如果我进入控制台并手动分配相同的函数 ARN,一切正常 并保持正常工作。看起来,也许控制台正在幕后做一些我的部署没有做的事情,但我似乎无法正确识别缺少的东西。
我一直在关注此文档 https://docs.aws.amazon.com/appsync/latest/devguide/security-authz.html#aws-lambda-authorization 并且有一个注释让我停下来 - 我已经设置了这些信任权限,AFAIK。
Lambda functions used for authorization require a principal policy for appsync.amazonaws.com to be applied on them to allow AWS AppSync to call them. This action is done automatically in the AWS AppSync console
这是 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
希望这对某人有用!