使用 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. API 页面上,选择一个 GraphQL API 的名称。

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

  4. API 配置中,选择编辑

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

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

  6. 选择 Save(保存)。

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

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

配置查询深度限制

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

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

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

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

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

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

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

  4. API 配置中,选择编辑

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

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

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

  6. 选择 Save(保存)。

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

请注意,在架构中,字段仍然可以标记为可为 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. API 页面上,选择一个 GraphQL API 的名称。

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

  4. API 配置中,选择编辑

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

    1. 开启启用解析器计数

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

  6. 选择 Save(保存)。

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