首页 文章

无服务器框架lambda appsync错误

提问于
浏览
1

我正在使用无服务器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

2 回答

  • 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

    我认为他们在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"
      }]
    }
    

相关问题