使用 Amazon AppSync配置 GraphQL 运行复杂度、查询深度和自省 - Amazon AppSync
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用 Amazon AppSync配置 GraphQL 运行复杂度、查询深度和自省

Amazon AppSync 允许您启用或禁用内省功能,并对单个查询中嵌套关卡和解析器的数量设置限制。

使用自省特征

提示

有关 GraphQL 中的自省的更多信息,请参阅 GraphQL 基金会网站上的这篇文章。

默认情况下,GraphQL 允许您使用自省来查询架构本身,以发现其类型、字段、查询、突变、订阅等。这是一项用于了解 GraphQL 服务如何塑造和处理数据的重要特征。然而,在处理自省时,有一些事情需要考虑。禁用内省可能会让你受益于禁用自省的用例,例如字段名可能敏感或隐藏,或者打算不为消费者记录完整API架构的情况。在这些情况下,通过自省发布架构数据可能会导致泄露特意保密的数据。

为了防止这种情况发生,您可以禁用自省。这将防止未经授权的各方在您的架构上使用自省字段。但值得注意的是,自省对于开发团队了解其服务中数据的处理方式非常有用。在内部将自省保持为启用状态,而在生产代码中将其禁用,这可能会有所帮助,可作为一层额外的安全措施。处理这个问题的另一种方法是添加一种授权方法,该方法 Amazon AppSync 还提供了。有关更多信息,请参阅 授权

Amazon AppSync 允许您在关卡上启用或禁用内API省。要启用或禁用自省,请执行以下操作:

  1. 登录 Amazon Web Services Management Console 并打开AppSync控制台

  2. APIs页面上,选择 Graph API QL 的名称。

  3. 在您的主页API的导航窗格中,选择设置

  4. API配置中,选择编辑

  5. 自省查询下,执行以下操作:

    1. 开启或关闭启用自省查询

  6. 选择保存

启用自省(默认行为)后,自省系统将正常工作。例如,下图显示了一个处理架构中所有可用类型的 __schema 字段:

GraphQL schema explorer showing query structure with types and name fields.

禁用此特征时,响应中将出现验证错误:

GraphQL query editor showing a validation error for undefined 'types' field in '_Schema'.

配置查询深度限制

有时候,您可能需要更精细地控制操作期间的API运作方式。一个此类控制措施是对查询可以处理的嵌套级别数量添加限制。默认情况下,查询能够处理不限数量的嵌套级别。将查询限制为指定数量的嵌套级别可能会影响项目的性能和灵活性。执行以下查询:

query MyQuery { L1: nextLayer { L2: nextLayer { L3: nextLayer { L4: value } } } }

您的项目可能出于某种目的而要求将查询限制为 L1L2。默认情况下,从 L1L4 的整个查询都将在无法控制的情况下进行处理。通过设置限制,可以防止查询访问超过指定级别的任何内容。

要添加查询深度限制,请执行以下操作:

  1. 登录 Amazon Web Services Management Console 并打开AppSync控制台

  2. APIs页面上,选择 Graph API QL 的名称。

  3. 在您的主页API的导航窗格中,选择设置

  4. API配置中,选择编辑

  5. 查询深度下,执行以下操作:

    1. 开启或关闭启用查询深度

    2. 最大深度中,设置深度限制。可以介于 175 之间。

  6. 选择保存

设置限制后,超过其上限将导致 QueryDepthLimitReached 错误。例如,下图显示了一个查询,其深度限制 2 超过第三级 (L3) 和第四级 (L4) 的限制:

Query structure with nested layers L1, L2, L3, and L4, showing depth limit exceeded.

请注意,在架构中,字段仍然可以标记为可为 null 或不可为 null。如果不可为 null 的字段收到 QueryDepthLimitReached 错误,则会对第一个可为 null 的父字段引发该错误。

配置解析器计数限制

您还可以控制每个查询可以处理多少个解析器。与查询深度一样,您可以为此数量设置限制。采用以下包含三个解析器的查询:

query MyQuery { resolver1: resolver resolver2: resolver resolver3: resolver }

默认情况下,每个查询最多可以处理 10000 个解析器。在上面的示例中,将处理 resolver1resolver2resolver3。但是,您的项目可能需要将每个查询限制为总共处理一个或两个解析器。通过设置限制,您可以告诉查询不要处理任何超过特定数量的解析器,比如第一个 (resolver1) 或第二个 (resolver2) 解析器。

要添加解析器计数限制,请执行以下操作:

  1. 登录 Amazon Web Services Management Console 并打开AppSync控制台

  2. APIs页面上,选择 Graph API QL 的名称。

  3. 在您的主页API的导航窗格中,选择设置

  4. API配置中,选择编辑

  5. 解析器计数限制下,执行以下操作:

    1. 开启启用解析器计数

    2. 最大解析器数量中,设置计数限制。可以介于 110000 之间。

  6. 选择保存

与查询深度限制一样,超过配置的解析器限制会导致查询在其它解析器上结束并出现 ResolverExecutionLimitReached 错误。在下图中,解析器计数限制为 2 的查询尝试处理三个解析器。由于限制,第三个解析器会引发错误并且不会运行。

Query with three resolvers, showing error on third resolver due to execution limit reached.