スキーマの設計 - AWS AppSync

スキーマの設計

空のスキーマの作成

スキーマファイルはテキストファイルであり、通常は schema.graphql という名前です。CLI を使用するか、またはコンソールの [スキーマ] ページで、以下のコードを追加することで、スキーマファイルを作成して AWS AppSync に送信できます。

schema { }

すべてのスキーマには、処理のためにこのルートがあります。これは、ルートクエリ型を追加するまでは処理に失敗します。

ルートクエリ型の追加

この例では、Todo アプリケーションを作成します。GraphQL スキーマにはルートクエリ型が必要であるため、Query オブジェクトが含まれている一覧を返す単一の getTodos フィールドを持つ Todo という名前のルート型を追加します。次のコードを schema.graphql ファイルに追加します。

schema { query:Query } type Query { getTodos: [Todo] }

Todo オブジェクト型をまだ定義していないことに注目してください。では、それを定義しましょう。

Todo 型の定義

ここで、Todo オブジェクトのデータが保存される型を作成します。

schema { query:Query } type Query { getTodos: [Todo] } type Todo { id: ID! name: String description: String priority: Int }

Todo オブジェクト型スカラー型 (文字列、整数など) のフィールドが含まれていることに注目してください。また、AWS AppSync には、スキーマで使用できる基本 GraphQL スカラーに加え、拡張された AWS AppSync のスカラー型も含まれています。名前が感嘆符で終わっているフィールドは必須フィールドです。ID スカラー型は、String または Int のいずれかである一意の識別子です。これらのフィールドは、リゾルバーのマッピングテンプレートで自動割り当てを制御できます。これについては、後で説明します。

Query 型と Todo 型は類似しています。GraphQL では、ルート型 (つまり、QueryMutationSubscription) は、ユーザー定義の型と同様ですが、API のエントリポイントとしてスキーマから公開される点が異なります。詳細については、「The Query and Mutation types」を参照してください。

ミューテーション型の追加

オブジェクト型を定義して、データをクエリできるので、API を介してデータを追加、更新、または削除する場合は、スキーマにミューテーション型を追加しておく必要があります。この Todo の例では、ミューテーション型に addTodo という名前のフィールドとして追加します。

schema { query:Query mutation: Mutation } type Query { getTodos: [Todo] } type Mutation { addTodo(id: ID!, name: String, description: String, priority: Int): Todo } type Todo { id: ID! name: String description: String priority: Int }

ミューテーションはルート型であるため、このスキーマにも追加していることに注意してください。

ステータスを使用した Todo の例の変更

この時点で、GraphQL API は、構造的には Todo オブジェクトの読み書きは機能します (データソースがありませんが、それについては次のセクションで説明します)。Todo へのステータス (ENUM として定義された一連の値を持つ) の追加などの、より高度な機能を使用してこの API を変更できます。

schema { query:Query mutation: Mutation } type Query { getTodos: [Todo] } type Mutation { addTodo(id: ID!, name: String, description: String, priority: Int, status: TodoStatus): Todo } type Todo { id: ID! name: String description: String priority: Int status: TodoStatus } enum TodoStatus { done pending }

[Save Schema] を選択します。

ENUM は文字列に類似していますが、一連の値のいずれかを取ります。この例では、この型を追加し、Todo を変更し、この機能を持つ Todo フィールドを追加しています。

注意: 直接「データソースをアタッチする」に進み、データソースへのスキーマの接続を開始するか、続きを読んでスキーマをページ分割とリレーショナル構造で変更することができます。

サブスクリプション

AWS AppSync のサブスクリプションはミューテーションに対する応答として呼び出されます。サブスクリプションは、Subscription 型と @aws_subscribe() ディレクティブを使用してスキーマで設定して、どのミューテーションが 1 つまたは複数のサブスクリプションを呼び出すかを示します。サブスクリプションの設定については、「リアルタイムデータ」を参照してください。

詳細情報

詳細については、「GraphQL type system」を参照してください。

高度な機能 - リレーションとページ分割

百万個の todos があるとします。それらのすべてを毎回取得することは望ましくないため、代わりにそれらをページ分割します。スキーマを次のように変更します。

  • getTodos フィールドに limitnextToken の 2 つの入力引数を追加します。

  • todos フィールドと nextToken フィールドを持つ新しい TodoConnection 型を追加します。

  • getTodos を変更し、TodoConnection (Todo のリストではない) を返すようにします。

schema { query:Query mutation: Mutation } type Query { getTodos(limit: Int, nextToken: String): TodoConnection } type Mutation { addTodo(id: ID!, name: String, description: String, priority: Int, status: TodoStatus): Todo } type Todo { id: ID! name: String description: String priority: Int status: TodoStatus } type TodoConnection { todos: [Todo] nextToken: String } enum TodoStatus { done pending }

TodoConnection 型により、todos のリストと、次の nextToken のバッチを取得するための todos を返すことができるようになります。これは 1 つの TodoConnection であり、接続のリストではないことに注意してください。接続内は、ページ分割トークンで返される todo 項目 ([Todo]) のリストです。AWS AppSync では、これはマッピングテンプレートを使用して Amazon DynamoDB に接続され、暗号化されたトークンとして自動的に生成されます。マッピングテンプレートにより、limit 引数の値は maxResults パラメータに変換され、nextToken 引数の値は exclusiveStartKey パラメータに変換されます。マッピングテンプレートの例および AWS AppSync コンソールでの組み込みテンプレートサンプルについては、「リゾルバーのマッピングテンプレートリファレンス」を参照してください。

次に、Todo にコメントフィールドがあり、1 つの todo に対するすべてのコメントを返すクエリを実行することを考えます。これは、前のスキーマで作成した GraphQL connections を使用して処理されます。次のように、Comment 型を持つようにスキーマを変更し、comments 型に Todo フィールドを追加し、addComment 型に Mutation フィールドを追加します。

schema { query: Query mutation: Mutation } type Query { getTodos(limit: Int, nextToken: String): TodoConnection } type Mutation { addTodo(id: ID!, name: String, description: String, priority: Int, status: TodoStatus): Todo addComment(todoid: ID!, content: String): Comment } type Comment { todoid: ID! commentid: String! content: String } type Todo { id: ID! name: String description: String priority: Int status: TodoStatus comments: [Comment] } type TodoConnection { todos: [Todo] nextToken: String } enum TodoStatus { done pending }

[Save Schema] を選択します。

Comment 型に、関連付けられた todoidcommentid、および content が含まれていることに注意してください。これは、後で作成する Amazon DynamoDB テーブルのプライマリキーとソートキーの組み合わせに対応します。

AWS AppSync で既存のデータソースの上部にあるアプリケーショングラフを使用すると、1 回の GraphQL クエリで 2 つの異なるデータソースからのデータを返すことができます。この例では、Todo テーブルと Comment テーブルの両方が存在すると仮定しています。これを行う方法は、「データソースをアタッチする」および「リゾルバーの設定」で示します。