AWS AppSync でイントロスペクション無効化ができるようになりました

2023.12.20

こんにちは、森田です。

以下のアップデートで AWS AppSync で GraphQL API をコントロールできる機能がいくつか追加されました。

追加された機能

追加された機能は以下の通りです。

  • Introspection(イントロスペクション) の有効化・無効化
  • クエリの深さの制限
  • リゾルバー数の制限

本記事では、この中のイントロスペクションの有効化・無効化について実際に検証を行ってみます。

イントロスペクションとは

API自体が提供するスキーマの詳細を問い合わせるための機能です。

この機能を使用すると、クライアント側でAPI構造の情報を取得することができます。

また、イントロスペクションクエリを実行することで、開発者はドキュメントを調べることなく、素早く利用可能なデータ型やクエリなどを取得できます。

一方で、セキュリティ上観点から、本番環境では、イントロスペクションを無効化したいというケースもあります。

今回のアップデートで、イントロスペクションの有効化・無効化の設定ができるようになります。

やってみた

前提条件

AppSync API は作成済みとします。

新規で作成される方は、以下を参考に作成してみてください。

イントロスペクションの有効化時でのクエリ

コンソール上からクエリを実行します。

スキーマ内で使用可能な型名を取得する以下のクエリを実行します。

query MyQuery {
  __schema{
    types{
      name
    }
  }
}

実行結果

{
  "data": {
    "__schema": {
      "types": [
        {
          "name": "Query"
        },
        {
          "name": "Users"
        },
        {
          "name": "String"
        },
        {
          "name": "UsersConnection"
        },
        {
          "name": "TableUsersFilterInput"
        },
        {
          "name": "TableStringFilterInput"
        },
        {
          "name": "Int"
        },
        {
          "name": "Mutation"
        },
        {
          "name": "CreateUsersInput"
        },
        {
          "name": "UpdateUsersInput"
        },
        {
          "name": "DeleteUsersInput"
        },
        {
          "name": "Subscription"
        },
        {
          "name": "TableIntFilterInput"
        },
        {
          "name": "TableBooleanFilterInput"
        },
        {
          "name": "Boolean"
        },
        {
          "name": "TableFloatFilterInput"
        },
        {
          "name": "Float"
        },
        {
          "name": "TableIDFilterInput"
        },
        {
          "name": "ID"
        },
        {
          "name": "__Schema"
        },
        {
          "name": "__Type"
        },
        {
          "name": "__TypeKind"
        },
        {
          "name": "__Field"
        },
        {
          "name": "__InputValue"
        },
        {
          "name": "__EnumValue"
        },
        {
          "name": "__Directive"
        },
        {
          "name": "__DirectiveLocation"
        }
      ]
    }
  }
}

イントロスペクションを無効化していないので取得することができています。

イントロスペクションの無効時でのクエリ

イントロスペクションの無効化

まずは、イントロスペクションの無効化設定を行います。

コンソールの設定を開き、API 設定から内観クエリをオフにします。

クエリの実行

先ほどと同じクエリを実行してみます。

実行結果

{
  "data": null,
  "errors": [
    {
      "path": null,
      "locations": [
        {
          "line": 3,
          "column": 5,
          "sourceName": null
        }
      ],
      "message": "Validation error of type FieldUndefined: Field 'types' in type '__Schema' is undefined @ '__schema/types'"
    }
  ]
}

上記のように、スキーマ内の型名を返却することはなく、エラーを返却しています。

さいごに

イントロスペクションは開発時には、非常に便利な機能ですが、API構造がわかってしまうため、本番環境では可能な限り無効にしたいです。

このアップデートでイントロスペクションの無効化が簡単にできるようになりましたので、AppSync を現在ご利用中の方はぜひ検討してみてください!