aws cdk appsync Schema Creation Status is FAILED with details: 保存架构时发生内部故障

Posted

技术标签:

【中文标题】aws cdk appsync Schema Creation Status is FAILED with details: 保存架构时发生内部故障【英文标题】:aws cdk appsync Schema Creation Status is FAILED with details: Internal Failure while saving the schema 【发布时间】:2020-08-16 19:57:52 【问题描述】:

给定以下 graphql 架构

# graphql/schema.graphql
type AppUser 
  userId: String
  fullName: String


type Query 
  getUser(userId: String): AppUser
  getUsers(): [AppUser]


type Mutation 
  addUser(user: AppUser!): AppUser

以及在 lib/mystack.ts 中定义的以下 cdk 代码:


    const graphql = new appsync.GraphQLApi(this, 'GraphQLApi', 
      name: 'metrolens-graphql-api',
      logConfig: 
        fieldLogLevel: appsync.FieldLogLevel.ALL,
      ,
      authorizationConfig: 
        defaultAuthorization: 
          // userPool,
          defaultAction: appsync.UserPoolDefaultAction.ALLOW,
        ,
        // additionalAuthorizationModes: [ apiKeyDesc: 'My API Key' ],
      ,
      schemaDefinitionFile: props?.schemaDirectory,
    )

    const lambdaRegister = new nodejs.NodejsFunction(this, 'register', 
      functionName: 'register',
      runtime: lambda.Runtime.NODEJS_12_X,
      timeout: cdk.Duration.seconds(10),
      entry: './lambda/register/register-0.ts',
      handler: 'handler',
      layers: [layer],
      description: 'Register a user.',
    )

    const lambdaLogin = new nodejs.NodejsFunction(this, 'login', 
      functionName: 'login',
      runtime: lambda.Runtime.NODEJS_12_X,
      timeout: cdk.Duration.seconds(10),
      entry: './lambda/login/login-0.ts',
      handler: 'handler',
      layers: [layer],
      description: 'Login a user.',
    )

    const lambdaRegisterDataSource = graphql.addLambdaDataSource(
      'lambdaRegister',
      'Register lambda triggered by appsync',
      lambdaRegister
    )
    lambdaRegisterDataSource.createResolver(
      typeName: 'Mutation',
      fieldName: 'addUser',
      requestMappingTemplate: appsync.MappingTemplate.lambdaRequest(),
      responseMappingTemplate: appsync.MappingTemplate.lambdaResult(),
    )

    const lambdaLoginDataSource = graphql.addLambdaDataSource(
      'lambdaLogin',
      'Login lambda triggered by appsync',
      lambdaLogin
    )

    lambdaLoginDataSource.createResolver(
      typeName: 'Query',
      fieldName: 'getUsers',
      requestMappingTemplate: appsync.MappingTemplate.lambdaRequest(),
      responseMappingTemplate: appsync.MappingTemplate.lambdaResult(),
    )

我在AWS::AppSync::GraphQLSchema 部署阶段收到以下错误消息:

GraphQLApi/Schema (GraphQLApiSchema5937B126) 架构创建状态失败,详细信息:保存架构时发生内部故障。

以前有人遇到过这个错误吗?我怀疑我的 graphql 模式有问题,但我不知道它是什么。另一个回答提到https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ReservedWords.html的DynamoDB保留字可能会导致冲突,即使你不使用DynamoDB,所以我将User类型重命名为AppSync。但是,看起来Query 也是一个保留字,但据我了解,这也是graphql 定义所必需的。请帮忙。 AWS CDK 很烂。

【问题讨论】:

【参考方案1】:

getUsers(): [AppUser] 更新为getUsers: [AppUser]

我遇到了同样的错误,并通过将我的架构插入验证器找到了它。

输入你的一个给


  "error": "Syntax error while parsing GraphQL query. Invalid input \"\\n  getUser(userId: String): AppUser\\n  getUsers()\", expected ImplementsInterfaces, Directives, FieldDefinition or Comments (line 6, column 12):\ntype Query \n           ^"

【讨论】:

【参考方案2】:

问题是我的架构不正确。 AppUser 是一种类型,但我用作 addUser 突变的输入。您可以使用特殊的 input 关键字定义查询和突变的输入。我最终将AppUser 复制为:

input AppUserInput 
  userId: String
  fullName: String

这样就解决了问题。

【讨论】:

谢谢,帮了我很多。该错误不是真正的描述性。 添加注释 - 在控制台中使用 AppSync 模式编辑器 - 我遇到了同样的错误 - 结果 AppSync 无法识别大多数验证器允许的三引号 cmets。

以上是关于aws cdk appsync Schema Creation Status is FAILED with details: 保存架构时发生内部故障的主要内容,如果未能解决你的问题,请参考以下文章

AWS-CDK Appsync Codefirst 输入类型

在将 aws cdk 与 appsync 一起使用时,如何将突变添加到 graphql 架构并防止部署失败?

如何在 Appsync Lambda Resolver 中检索 cognito 识别数据(使用 cdk)

AWS Appsync 架构错误(资源不在 stackUpdateComplete 状态)

如何将枚举类型字段从反应发送到 GraphQL/AWS appsync

如果我不使用放大,如何从 AppSync GraphQL 架构生成 Typescript 定义?