无服务器框架 Lambda AppSync 错误
Posted
技术标签:
【中文标题】无服务器框架 Lambda AppSync 错误【英文标题】:Serverless framework Lambda AppSync error 【发布时间】:2018-09-17 08:45:43 【问题描述】:我正在使用无服务器框架上传 AWS Lambda 函数以用作 AppSync 中的数据源。我拥有的serverless.yml
非常基础:
service: mongoose-lambda-srvrls
provider:
name: aws
runtime: nodejs6.10
region: us-west-2
functions:
mongoose:
handler: index.handler
当我运行 AppSync GraphQL 查询时出现错误:
"data":
"getPost": null
,
"errors": [
"path": [
"getPost"
],
"data": null,
"errorType": "Lambda:AWSLambdaException",
"errorInfo": null,
"locations": [
"line": 43,
"column": 2
],
"message": "User: arn:aws:sts::433333333335:assumed-role/appsync-datasource-lam-kkzuep-mongoose-lambda-srvr/APPSYNC_ASSUME_ROLE is not authorized to perform: lambda:InvokeFunction on resource: arn:aws:lambda:us-west-2:43333333333335:function:mongoose-lambda-srvrls-dev-mongoose (Service: AWSLambda; Status Code: 403; Error Code: AccessDeniedException; Request ID: 9fa82eb9-3a64-11e8-88a1-09c4e639fc45)"
]
我很确定我需要充实我的 YML,以便这个 lambda 堆栈可以很好地与 AppSync 配合使用,但我不太确定该怎么做。
更多信息。查看 Lambda 的 CloudFormation 中的资源时,我看到:
IamRoleLambdaExecution mongoose-lambda-srvrls-dev-us-west-2-lambdaRole AWS::IAM::Role
MongooseLambdaFunction mongoose-lambda-srvrls-dev-mongoose AWS::Lambda::Function
MongooseLambdaVersionwCQ1... arn:aws:lambda:us-west-2:4542242445:function:mongoose-lambda-srvrls-dev-mongoose:4 AWS::Lambda::Version
MongooseLogGroup /aws/lambda/mongoose-lambda-srvrls-dev-mongoose AWS::Logs::LogGroup
ServerlessDeploymentBucket mongoose-lambda-srvrls-d-serverlessdeploymentbuck-qwp8sdfgjr AWS::S3::Bucket
而在我使用 AppSync 文档 (AWS CLI) 制作的 Lambda 中具有以下 CloudFormation 资源:
AppSyncLambdaInvokePolicy Fulls-AppS-15SHASDFSADZ03N AWS::IAM::Policy
AppSyncServiceRole Fullstack-Lamba-AppSyncServiceRole-DK8QHASDFE5R AWS::IAM::Role
LambdaExecutionRole Fullstack-Lamba-LambdaExecutionRole-OJHASDF3AHG1 AWS::IAM::Role
LambdaFunction fullstack-lambda AWS::Lambda::Function
【问题讨论】:
我认为 AWS 在他们的文档中犯了一个简单的错字,请参阅 ***.com/a/50984496/1480391 【参考方案1】:您赋予 AppSync 以运行 lambda 函数的角色似乎没有调用该特定 lambda 的权限。
您需要创建或修改一个角色,使其具有以下权限。
IAM 角色应该有一个政策,允许任何承担它的人运行/调用您的 lambda 函数:
"Version": "2012-10-17",
"Statement": [
"Effect": "Allow",
"Action": [
"lambda:Invoke"
],
"Resource": "arn:aws:lambda:REGION:ACCOUNTNUMBER:function/LAMBDA_FUNCTION"
]
角色还应该有一个信任策略。此信任策略将允许 AppSync 代表您担任该角色。这就是 AppSync 在收到 graphQL 请求时调用您的 lambda 的方式。
"Version": "2012-10-17",
"Statement": [
"Effect": "Allow",
"Principal":
"Service": "appsync.amazonaws.com"
,
"Action": "sts:AssumeRole"
]
一旦您拥有具有必要权限的 IAM 角色,您将需要确保它与 AppSync 中的 lambda 数据源相关联。您可以在 AppSync 控制台的 Data Sources
部分选择角色,或使用 AppSync CLI 更新 lambda 数据源并使其使用您的角色。
有关创建与 AppSync 配合使用的 lambda 函数的更多信息,请参阅以下文档:https://docs.aws.amazon.com/appsync/latest/devguide/tutorial-lambda-resolvers.html#configure-data-source-for-aws-lambda
【讨论】:
我试过了,发现appsync只能在同一个区域调用lambda函数,否则会收到err:The role defined for the function can be taken by Lambda. (服务:AWSLambda;状态代码:403;错误代码:AccessDeniedException;请求 ID:3f9fad95-4e8b-11e8-823c-854fa1d72c56)。我有什么需要做的吗? 尝试几次后等待几分钟。配置没什么问题,耐心等一会或者新建一个函数再配置一遍 嘿@michael-willingham 我认为您在政策文件中犯了一个错误,请参阅***.com/a/50984496/1480391【参考方案2】:我认为他们在 https://docs.aws.amazon.com/appsync/latest/devguide/tutorial-lambda-resolvers.html#configure-data-source-for-aws-lambda 文档中犯了一个错误。
允许的操作应该是 lambda:InvokeFunction
而不是 lambda:Invoke
这是有效的:
"Version" : "2012-10-17",
"Statement" : [
"Effect" : "Allow",
"Action" : "lambda:InvokeFunction",
"Resource" : "arn:aws:lambda:REGION:ACCOUNTNUMBER:function/LAMBDA_FUNCTION"
]
【讨论】:
以上是关于无服务器框架 Lambda AppSync 错误的主要内容,如果未能解决你的问题,请参考以下文章
如何使用无服务器框架从另一个 lambda 异步调用 lambda
从 Lambda 调用 AWS AppSync graphql API