我正在使用无服务器frameowork上传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
答案 0 :(得分:4)
看起来你给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代表您担任该角色。这就是每当graphQL请求进入时AppSync调用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
答案 1 :(得分:1)
我认为他们在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"
}]
}