こんにちは。アプリケーションサービス部の河野です。
Amplify Studio の Data modeling を使えば、アプリケーションで使用する GraphQL のリソース群を GUI 上で簡単にプロビジョニングすることができます。
今回は Data modeling の使い方について、簡単に紹介したいと思います。
Amplify Studio を使用した全体の流れを知りたい方は以下のブログをご参照ください。
Data modeling
Amplify Stduio が提供している GUI で データモデリングができる機能です。 具体的には以下の機能追加および設定が可能です。
- GraphQL のスキーマ定義
- リレーションシップの設定
- 認可の設定
- スキーマに基づく、AppSync, DynamoDB のデプロイ
https://docs.amplify.aws/console/data/data-model/
実践
早速ですが、Data modeling 機能を使用して、データモデルを定義していきます。
今回は、 部署(DEPARTMENT)、EMPLOYEE(従業員)、プロジェクト(PROJECT)の例に実践します。
erDiagram DEPARTMENT ||--o{ EMPLOYEE : has EMPLOYEE ||--o{ PROJECT : works_on EMPLOYEE_PROJECT ||--o{ EMPLOYEE : assigns EMPLOYEE_PROJECT ||--o{ PROJECT : includes DEPARTMENT { int id string name datetime created_at datetime updated_at } EMPLOYEE { int id string name string position int department_id datetime created_at datetime updated_at } PROJECT { int id string name datetime created_at datetime updated_at } EMPLOYEE_PROJECT { int employee_id int project_id }
データモデルの定義
Amplify Studio の 左メニューから Set Up > Data を開きます。
「+ Add model 」からデータモデルを追加して、Add a field からエンティティを追加していきます。
まずは、Employee, Department, Project モデルを定義します。
※ department_id は リレーション定義から追加できるため、追加不要です。
リレーション定義
今回の例のリレーションは以下の通りです。
- 部署 - 従業員(1 対 多)
- 従業員 - プロジェクト(多 対 多)
部署 - 従業員(1 対 多)
Department モデルの Add a relationship からリレーションを追加します。 1 対 多 のため、「One Department to many Employee」を選択して、Save します。
以下の通り変更されています。
- Department モデルに Employees が追加
- Employee モデルに departmentID が追加
従業員 - プロジェクト(多 対 多)
Project モデルの Add a relationship からリレーションを追加します。 多 対 多 のため、「Many Project to many Employee」を選択して、Save します。
以下の通り変更されています。
- Project モデルに Employees が追加
- Employee モデルに Projects が追加(リレーションシップ名は 先頭大文字で統一したかったので、projects → Projects に変更してます)
GraphQL のスキーマ情報も右上の 「< > GraphQL Schema 」から確認できます。
デプロイ
スキーマの定義が完了後、「Save and Deploy 」からデプロイを実行します。
デプロイが開始されます。5 分以上かかるので、気長に待ちます。
デプロイが完了すると、以下の画面になります。「Done」ボタンを押すと、Data modeling の画面に戻ります。
デプロイされたリソースを確認する
AppSync
Amplify の「アプリ名 + ステージ名」でリソースが作成されています。 Data modeling で定義したスキーマを元に定義されていることがわかります。
DynamoDB
Data modeling で定義したモデルは 必ず @model ディレクティブがつきます。 そのため、各モデルごとの DynamoDB のテーブルが作成されます。
リソース名は 「モデル名 + ハッシュ値 + ステージ名」で作成されています。 EmployeeProject の中間テーブルも自動的に作成されていますね。
また、AmplifyDataStore の Prefix で DataStore 用の テーブルが作成されています。
DataStore は AppSync の Sync 機能をより簡単に利用できる機能で、save()
や delete()
等 GraphQL のクエリをより直感的にデータ操作を行えます。
詳細は以下をご確認ください。
https://docs.amplify.aws/lib/datastore/getting-started/q/platform/js/
DataStore が不要な場合は、GraphQL API Settings から、Conflict resolution & offline capabilities
を Disabled に変更します。
ただし、DetaStore を無効にした場合は、Deta Manager や UI Library でのコンポーネントの紐付けが使用できなくなるので、注意が必要です。
https://docs.amplify.aws/console/data/data-model/#limitations
※ 後で変更した場合は、AmplifyDataStore 用の DynamoDB のテーブルは削除されてませんでした。
Data Manger
Manage > Content から 各モデルで定義したテーブルにテストデータを追加することができます。
まずは、Department を作成します。リレーションがある Employees の欄から紐づける従業員を選択して追加することも可能です。
従業員を追加します。先ほど追加した部署も紐付けが可能です。
プロジェクトは、多対多の関係のため複数の従業員を追加することができます。
プロジェクトに追加すると、中間テーブルにも自動的にデータが追加されていることが分かります。
UI コンポーネントの紐付け(UI Library)
作成したモデルは、UI Library で データモデルと紐づけることができます。
以下は、Employee モデルをコンポーネントに紐づけて、name と label を紐付けてた図です。
ラベルが先ほど登録した kawano で表示されていることが分かります。
制限事項
Data modeling に対応していない ディレクティブが多数あります。
@default
directive@index
directive@function
directive@http
directive@predictions
directive@primaryKey
directive@searchable
directive@mapsTo
directive@auth
groupClaim
property@auth
groupsField
property@auth
customgroupClaim
@auth
customidentityClaim
@auth
field-level rules- OIDC and Function providers
- OwnerField as Array type
Query
typeMutation
typeSubscription
type
https://docs.amplify.aws/console/data/data-model/#limitations
対応していないディレクティブについては、ローカルからスキーマを直接変更してデプロイする必要があります。
試しに、Employee モデルに position で検索できるように @index ディレクティブ を追加してみます。
type Employee @model @auth(rules: [{allow: public}]) @searchable { id: ID! name: String position: String @index(name: "byPosition" queryField: "searchEmployeeByPosition") departmentID: ID! @index(name: "byDepartment") Projects: [Project] @manyToMany(relationName: "EmployeeProject") }
amplify push でデプロイします。
対応していない ディレクティブがスキーマにある場合は、DataModeling の ビジュアルエディターは使用できなくなります。
そのため、今後は 先ほどのように CLI 経由で変更してく必要があります。
ただし、DataManger や UI Builder のデータの紐付けは引き続き使用できます。
※ ドキュメントには、Data Manager も使用できなくなると記載がありますが、上記の場合は使えるようです。ディレクティブによっては DataManger も使用できなくなる場合があるため、ご注意ください。
さいごに
今回は、Data modeling の使い方について簡単に紹介しました。
今までは、amplify add api で API を追加後、手動でスキーマを変更していましたが、Data modeling を使えば簡単に構築できそうです。
Data Manger から、リレーションデータも簡単に追加できるのも便利でした。
今後も色々試していきたいと思います。