使用Serverless Framework部署AppSync时遇配置错误求助
问题修复方案
核心错误原因
- 配置键名大小写不匹配:
serverless-appsync-plugin要求custom下的配置键必须是全小写的appsync,你用了驼峰式的appSync,导致插件无法识别配置结构,触发Invalid AppSync Configuration警告和后续的schema未定义错误。 - Provider参数拼写错误:
provider段里的memorize是笔误,正确参数名是memorySize,这个错误会导致Lambda资源配置异常。 - MappingTemplates格式错误:
request: false和response: false不符合插件规则,必须指定请求/响应模板的路径或内联模板代码,不能直接设为false。 - 缺少AppSync调用Lambda的IAM角色:你的配置里没有给AppSync分配调用Lambda的权限,部署时会出现权限错误。
修复后的完整配置
useDotenv: true service: ${env:SERVICE_NAME} frameworkVersion: '3' provider: name: AWS runtime: python3.7 memorySize: 512 # 修正拼写错误 timeout: 600 architecture: x86_64 stage: ${opt:stage, 'dev'} stackTags: product: soumilshah env: qa created-date: 2022-04-26 team: python-dev customer-impact: false terraform: false plugins: - serverless-appsync-plugin package: exclude: - '**/*' include: - '*.py' custom: appsync: # 改为全小写 name: "myApis" schema: - "schema.graphql" authenticationType: API_KEY mappingTemplates: - type: Query field: getUsers dataSource: ${env:LAMBDA_SOURCE} # 使用内联VTL模板,也可以换成模板文件路径 requestMappingTemplate: | { "version": "2017-02-28", "operation": "Invoke", "payload": $util.toJson($context.arguments) } responseMappingTemplate: | $util.toJson($context.result) dataSources: - type: AWS_LAMBDA name: ${env:LAMBDA_SOURCE} description: 'Lambda DataSource' config: lambdaFunctionArn: arn:aws:lambda:${env:REGION}:${env:ACCOUNT}:function:${env:SERVICE_NAME}-${opt:stage, 'dev'}-lambda serviceRoleArn: !GetAtt AppSyncLambdaServiceRole.Arn # 添加AppSync调用Lambda的IAM角色 resources: Resources: AppSyncLambdaServiceRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Principal: Service: appsync.amazonaws.com Action: sts:AssumeRole Policies: - PolicyName: AppSyncLambdaInvokePolicy PolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Action: lambda:InvokeFunction Resource: arn:aws:lambda:${env:REGION}:${env:ACCOUNT}:function:${env:SERVICE_NAME}-${opt:stage, 'dev'}-lambda functions: lambda: handler: lambda_function.getUsers
额外检查项
- 确认
.env文件中的ACCOUNT是12位完整的AWS账号ID(当前配置里的账号ID少1位,属于输入错误)。 - 若不想使用内联模板,可创建
mapping-templates目录,编写对应的VTL文件,然后在mappingTemplates中指定路径,例如:request: "mapping-templates/Query.getUsers.request.vtl"。 - 确保
serverless-appsync-plugin版本与Serverless Framework 3.x兼容,建议锁定版本为2.5.0及以上,可通过npm install serverless-appsync-plugin@2.5.0 --save-dev安装。
内容的提问来源于stack exchange,提问作者Shatya Kesarwani
相关产品推荐
相关产品推荐

