

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

# を使用した GraphQL 実行の複雑さ、クエリの深さ、およびイントロスペクションの設定 AWS AppSync
<a name="configuration-limits"></a>

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

## イントロスペクション機能を使用する
<a name="configuration-limits-introspection"></a>

**ヒント**  
GraphQL のイントロスペクションの詳細については、[GraphQL Foundation のウェブサイト](https://graphql.org/learn/introspection/)にあるこちらの記事を参照してください。

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

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

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

1. にサインイン AWS マネジメントコンソール し、[AppSync コンソール](https://console.aws.amazon.com/appsync/)を開きます。

1. **API**] ページで、GraphQL API の名前を選択します。

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

1. **[API 設定]** で **[編集]** を選択します。

1. **[内観クエリ]** で、以下の手順を実行します。

   1. **[内観クエリを有効化]** をオンまたはオフにします。

1. **[保存]** を選択します。

イントロスペクションが有効 (デフォルトの動作) になっている場合、イントロスペクションシステムの使用は正常に機能します。例えば、以下の画像は、スキーマ内で使用可能なすべての型を処理する `__schema` フィールドを示しています。

![クエリ、文字列、Int、スキーマ、タイプ、および TypeKind 型を返すスキーマイントロスペクションを持つ MyQuery を示す GraphQL クエリエディタ。](http://docs.aws.amazon.com/ja_jp/appsync/latest/devguide/images/introspection-enabled.png)


この機能を無効にすると、代わりに検証エラーがレスポンスに表示されます。

![スキーマの未定義のタイプフィールドの検証エラーを示す GraphQL クエリエディタ。](http://docs.aws.amazon.com/ja_jp/appsync/latest/devguide/images/introspection-disabled.png)


## クエリの深さの制限を設定する
<a name="configuration-limits-depth"></a>

操作中に API の機能をよりきめ細かく制御したい場合もあるでしょう。そのような制御の 1 つとして、クエリが処理できるネストレベルの数に制限を追加することが挙げられます。デフォルトでは、クエリはネストレベルを無制限に処理できます。クエリを指定された数のネストレベルに制限すると、プロジェクトのパフォーマンスと柔軟性に影響が出る可能性があります。次のようなクエリがあるとします。

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

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

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

1. にサインイン AWS マネジメントコンソール し、[AppSync コンソール](https://console.aws.amazon.com/appsync/)を開きます。

1. **API**] ページで、GraphQL API の名前を選択します。

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

1. **[API 設定]** で **[編集]** を選択します。

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

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

   1. **[最大深度]** で、深度の制限を設定します。これは `1` と `75` の範囲で指定できます。

1. **[保存]** を選択します。

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

![ネストされたクエリ構造が設定された制限の 2 を超えていることを示すクエリ深度制限エラー。](http://docs.aws.amazon.com/ja_jp/appsync/latest/devguide/images/query-depth-limit.jpg)


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

## リゾルバー数の制限の設定
<a name="configuration-limits-resolver-count"></a>

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

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

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

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

1. にサインイン AWS マネジメントコンソール し、[AppSync コンソール](https://console.aws.amazon.com/appsync/)を開きます。

1. **API**] ページで、GraphQL API の名前を選択します。

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

1. **[API 設定]** で **[編集]** を選択します。

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

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

   1. **［最大リゾルバー数]** で、数の制限を設定します。これは `1` と `10000` の範囲で指定できます。

1. **[保存]** を選択します。

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

![リゾルバー数の制限である 2 を超えたときにエラーを示す 3 つのリゾルバーを含む GraphQL クエリ。](http://docs.aws.amazon.com/ja_jp/appsync/latest/devguide/images/resolver-count-limit.jpg)
