GraphQL の実行の複雑さ、クエリの深さ、イントロスペクションを AWS AppSyncで設定する - AWS AppSync

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

GraphQL の実行の複雑さ、クエリの深さ、イントロスペクションを AWS AppSyncで設定する

AWS AppSync では、イントロスペクション機能を有効または無効にし、1 つのクエリでネストされたレベルとリゾルバーの量に制限を設定できます。

イントロスペクション機能を使用する

ヒント

GraphQL のイントロスペクションの詳細については、GraphQL Foundation のウェブサイトにあるこちらの記事を参照してください。

GraphQL では、デフォルトでイントロスペクションを使用してスキーマ自体にクエリを実行し、その型、フィールド、クエリ、ミューテーション、サブスクリプションなどを検出できます。これは、GraphQL サービスによってデータがどのように形成され、処理されるかを学習するための重要な機能です。ただし、イントロスペクションを使用する際には、いくつか考慮すべき点があります。フィールド名が機密または非表示になっている場合や、完全なAPIスキーマがコンシューマーに文書化されないように意図されている場合など、イントロスペクションが無効になるユースケースがあります。このような場合、イントロスペクションを通じてスキーマデータを公開すると、意図的にプライベートデータが漏洩する可能性があります。

そのような事態を防ぐために、イントロスペクションを無効にすることができます。これにより、権限のない者がスキーマのイントロスペクションフィールドを使用するのを防ぐことができます。ただし、イントロスペクションは、開発チームにとってサービス内のデータがどのように処理されるかを知るのに役立つことに注意してください。内部的には、セキュリティーを強化するために本番稼働用コードでイントロスペクションを無効にしつつ、イントロスペクションを有効にしておくと役立つ場合があります。もう 1 つの対処方法は、認可方法を追加することです。これは AWS AppSync でも提供されています。詳細については、「認証」を参照してください。

AWS AppSync では、APIレベルでイントロスペクションを有効または無効にできます。イントロスペクションを有効または無効にするには、次の手順を実行します。

  1. にサインイン AWS Management Console し、AppSyncコンソール を開きます。

  2. APIs ページで、GraphQL の名前を選択しますAPI。

  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機能をより詳細に制御する必要がある場合があります。そのような制御の 1 つとして、クエリが処理できるネストレベルの数に制限を追加することが挙げられます。デフォルトでは、クエリはネストレベルを無制限に処理できます。クエリを指定された数のネストレベルに制限すると、プロジェクトのパフォーマンスと柔軟性に影響が出る可能性があります。次のようなクエリがあるとします。

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

プロジェクトでは、何らかの目的でクエリを L1 または L2 に制限することが求められる場合があります。デフォルトでは、L1 から L4 までのクエリ全体が処理され、それを制御する方法はありません。制限を設定することで、指定したレベルを超えるものにクエリがアクセスするのを防ぐことができます。

クエリの深さの制限を追加するには、次の手順を実行します。

  1. にサインイン AWS Management Console し、AppSyncコンソール を開きます。

  2. APIs ページで、GraphQL の名前を選択しますAPI。

  3. APIのホームページのナビゲーションペインで、設定 を選択します。

  4. API 設定 で、編集 を選択します。

  5. [クエリーの深さ] で、以下の操作を行います。

    1. [クエリーの深さを有効化] をオンまたはオフにします。

    2. [最大深度] で、深度の制限を設定します。これは 175 の範囲で指定できます。

  6. [Save] を選択します。

制限が設定されている場合、その上限を超えると QueryDepthLimitReached エラーが発生します。例えば、以下の画像は、深さ制限が 2 のクエリが制限を超えて 3 番目 (L3) と 4 番目 (L4) のレベルに達していることを示しています。

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

ただし、スキーマではフィールドを NULL 許容または NULL 非許容としてマークできることに注意してください。NULL 非許容フィールドが QueryDepthLimitReached エラーを受け取った場合、そのエラーは最初の NULL 許容の親フィールドにスローされます。

リゾルバー数の制限の設定

各クエリが処理できるリゾルバーの数を制御することもできます。クエリの深さと同様に、この量にも制限を設定することが可能です。3 つのリゾルバーを含む次のクエリを考えてみましょう。

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

デフォルトでは、各クエリは最大 10,000 個のリゾルバーを処理できます。上の例では、resolver1resolver2resolver3 が処理されます。ただし、プロジェクトでは、各クエリを合計 1 つまたは 2 つのリゾルバーの処理に制限するように求められる場合があります。制限を設定することで、1 つ目のリゾルバー (resolver1) や 2 つ目のリゾルバー (resolver2) など、特定の数を超えるリゾルバーを処理しないようにクエリに指示できます。

リゾルバー数の制限を追加するには、次の手順を実行します。

  1. にサインイン AWS Management Console し、AppSyncコンソール を開きます。

  2. APIs ページで、GraphQL の名前を選択しますAPI。

  3. APIのホームページのナビゲーションペインで、設定 を選択します。

  4. API 設定 で、編集 を選択します。

  5. [リゾルバー数の制限] で、以下の操作を行います。

    1. [リゾルバー数を有効化] をオンにします。

    2. [最大リゾルバー数] で、数の制限を設定します。これは 110000 の範囲で指定できます。

  6. [Save] を選択します。

クエリの深さの制限と同様、設定されてたリゾルバーの制限を超えると、他のリゾルバーでクエリが ResolverExecutionLimitReached エラーで終了します。以下の画像では、リゾルバー数の制限が 2 のクエリが 3 つのリゾルバーを処理しようとします。制限のため、3 番目のリゾルバーはエラーをスローし、実行されません。

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