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

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

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

AWS AppSync 允许您启用或禁用自省特征,并对单个查询中的嵌套级别和解析器数量设置限制。

使用自省特征

提示

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

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

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

AWS AppSync 允许您在 API 级别启用或禁用自省。要启用或禁用自省,请执行以下操作:

  1. 登录到 AWS Management Console,然后打开 AppSync 控制台

  2. API 页面上,选择一个 GraphQL API 的名称。

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

  4. API 配置中,选择编辑

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

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

  6. 选择 Save(保存)。

启用自省(默认行为)后,自省系统将正常工作。例如,下图显示了一个处理架构中所有可用类型的 __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. 登录到 AWS Management Console,然后打开 AppSync 控制台

  2. API 页面上,选择一个 GraphQL API 的名称。

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

  4. API 配置中,选择编辑

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

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

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

  6. 选择 Save(保存)。

设置限制后,超过其上限将导致 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. 登录到 AWS Management Console,然后打开 AppSync 控制台

  2. API 页面上,选择一个 GraphQL API 的名称。

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

  4. API 配置中,选择编辑

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

    1. 开启启用解析器计数

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

  6. 选择 Save(保存)。

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

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