【AWS Amplify ノウハウ】 6. Amplify DataStore の導入は慎重に!

2020.07.31

こんにちは!コンサル部のテウです。

AWS Amplify シリーズの 6番目の記事です。この記事では、比較的に最近リリースされた Amplify DataStore について簡単に紹介し、他の技術と同じく、Amplify DataStore も万能ではないことをお伝えしつつ、導入時に顧慮すべきところについても紹介します。

それでは、始めますー!

Amplify DataStore とは?

2019年12月に発表された Amplify Datastore はリリース後、優れた機能の紹介と共にその便利さで注目を集めました。

Introducing the Amplify DataStore, a persistent storage engine that synchronizes data between apps and the cloud

Amplify Datastoreの公式ドキュメントは、下のページをご覧ください。

また、今年の5月から Amplify DataStore を使ったレファレンスアーキテクチャも公開されていますので、下の記事と、Githubリポジトリをご参照ください。

上記の内容を直接キャッチアップするには忙しすぎる皆さんのために簡単に要約しますと、

  1. AppSync のオフライン Sync 機能を簡単に使えるようにし、オフライン状態でもアプリが利用でき、オンライン時に内部的に自動でデータのSyncを合わせてくれる。

  2. GraphQL について詳しく知らなくても Amplify を活用できるよう、save() / delete() / query() / observe() / clear() 等の ORM と似たような感じで使える。

ぐらいで要約できるかと思います。

上の図は、AWS が説明する Amplify DataStore の内部のアーキテクチャーですが、Storage Engine レイヤーにてローカルストレージとリモートストレージ(AppSync)に適切にデータが同期化させてくれるそうです。

const post = await DataStore.save(
  new Post({
    title: "My Post with comments",
    rating: 10,
    status: PostStatus.ACTIVE
  })
);

await DataStore.save(
  new Comment({
    content: "Loving Amplify DataStore!",
    postID: post.id
  })
);

const comments = (await DataStore.query(Comment)).filter(c => c.postID === "123");

const post = await DataStore.query(Post, "123");
const comments = (await DataStore.query(Comment)).filter(c => c.postID === post.id);

const toDelete = await DataStore.query(Post, "123");
DataStore.delete(toDelete);

データを操作する時も、上記のように GraphQL が分からなくても簡単に使えそうなコードです。

こんな良いものをどうして使わないの?!

革命的なレベルの便利さを持った Amplify DataStore ですが、結論から言いますと私が考えるには、まだ Amplify DataStore がぴったりするユーズケースは現時点では多くないと思っております。Amplify DataStore を初めて知り、これすげー!と思って、サイドプロジェクトなどで活用してみるのはとても素晴らしいと思いますが、もし、本番用 で Amplify DataStore を使おうとしていらっしゃる方は以下の制約についてもご検討して頂ければと思います。

1. Queryに制約が多い

はい、Amplify DataStore には Query の制約が多いです。実は、これは Amplify DataStore の問題よりは、DynamoDB をデータソースとして活用しているから生じた制約です。DynamoDB をデータソースとして活用する際に、どのような制約があるのかについては以下の記事をご参照ください。

あれ? Elasticsearch をデータソースとして使えば良いのでは?と考えるかもしれませんが、@searchable ディレクティブページの最初の Note で下のような項目が書かれております。

Note: @searchable is not compatible with DataStore but you can use it with the API category.

Amplify @searchable 説明

はい.. Amplify DataStore は、@searchable ディレクティブをサポートしません。つまり、Elasticsearch をサポートしていないという意味となります。せっかく開発を楽にしたいから Amplify DataStore を選択したのに、DynamoDB が提供する Query 機能の制約にぶつかってしまう可能性が高くなるのでしょう。なので、Elasticsearch を追加のデータソースとして活用したいとしたら、直接 DynamoDB Streams 経由の Elasticsearch のデータ同期化や indexing などをしなければならないし、Elasticsearch へのコネクションや Query 関連のコードも直接作成しないといけないですよね。

そうするよりかは、Amplify DataStore じゃなく、Amplify API を使った方がより便利でしょう。上記の全ての自動でやってくれる Amplify API で行けるのであれば、当然 Amplify API も良いと思います。

なので、Query あたりは、Amplify DataStore を検討されている方なら、必ず考慮すべき制約事項だと思います。

2. Amplify API より情報が少ない

これは多くの方が共感できると思いますが、Amplify DataStore は昨年の12月にリリースされた新しい機能ですので、まだまともなノウハウどころか、どのような Issue があるのかの情報すら探すことが難しいです。Amplify APIの場合、ある程度 Github Issue で活発に論議された討論をみて、先人たちの知恵とノウハウを比較的に簡単に習得できます。ですが、Amplify DataStore の場合、Amplify API よりも事例が足りてなく、開発時にぶち当たった壁について日本語でお話しできる相手を見つけることも難しいと思います。

なんですが、Amplify Discord #datastore-discussion チャンネル で "英語" では Amplify DataStore についての討論は盛り上がっていますので、英語でも良い方は是非この Discordを活用していただければと思います!:D

3. カスタマイズが難しい

最後に、Amplify DataStore の情報がなかなか手に入らないことから起因した内容の、カスタマイズが難しいを挙げたいです。Amplify DataStore は、Amplify API と比較したときに、より抽象化されたレベルのライブラリーを提供するので、直接カスタマイズすることがよりややこしくて難しいです。Amplify API を直接カスタマイズすることもそんなに簡単な作業ではないですが、Amplify DataStore の場合、そのカスタマイズのための情報を知っている人は、ほぼ AWS Amplify チームの内部の方しかいない場合もございます。

開発をしながら特定のライブラリーを依存するとしても、ある程度のカスタマイズは必須なケースがほとんどです。Amplify DataStore の場合も、直接 resolver を カスタマイズしたり、Sync エンジンやストレージエンジンをカスタマイズしたり、Amplify API と Amplify DataStore を一緒に使いたいなど、多数のカスタマイズの要件について予め把握しておかないと、それぞれの状況に遭遇したたびに、たくさんの時間の無駄が発生してしまいます。このような点から、カスタマイズが難しいことは事前に知っておくべき内容だと思います。

Amplify DataStore についての個人的な考え

上記のような制約があるにも関わらず、私は Amplify DataStore がこれからの開発方法に対してガイドを提示していると信じております。どんどんもっと複雑で多様な機能を当然と思っているユーザの期待値に呼応するアプリを、効果的、かつ、迅速に作るためには、AWS Amplify のオフライン機能のサポートと、ORM と似たような開発方法論が事実上ベストに近いのではないかと、個人的には遠慮がちに考えております。初期スタートアップなどで、迅速なMVPを作り出すに Amplify はすでに非常に効果的なツールだと思いますが、Amplify DataStore は、それよりもさらに、より効果的に開発できる未来を見せてくれていると思っています。

なので、今はまだ見守る段階だとは思うものの、近い未来に Amplify DataStore が広く使われる日が来ると信じております!

最後に

今回の記事では、Amplify DataStore の簡単な紹介、現時点での制約事項、そして Amplify DataStore について私の個人的な意見を書いてみました。 Amplify DataStore が一早く多様な機能をサポートし、広まることを願っています!

以上、コンサル部のキム・テウでした!:D