【レポート】AWS AppSync と GraphQL によるデータドリブンなアプリケーション #reinvent #MBL402

2017.11.29

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

MBL402: NEW LAUNCH! Data Driven Apps with GraphQL: AWS AppSync Deep Dive

ラスベガスで開催中の re:Invent 2017 にて「MBL402: NEW LAUNCH! Data Driven Apps with GraphQL: AWS AppSync Deep Dive」を聴講してきたのでレポートします。

1

スピーカーは下記の 2 名です。

  • Rohan Deshpande
  • Michael Paris

AWS とモバイルアプリ

  • モバイルアプリに必要な機能
    • 認証と認可
      • ユーザーと ID プロバイダの管理
    • 効率的なネットワーク使用
      • 接続状態が悪い時でも高速なデータアクセス
    • データ同期
      • ユーザーの設定や状態をデバイス間で同期
    • 多くのデバイスとプラットフォームへの対応
      • 顧客がどこへ行っても
    • ビジネスロジック
      • サーバー管理不要でのステートレスなカスタムコードを実行
    • コンフリクト解消
      • クラウド内データコンフリクトの検知と処理
    • オフラインデータアクセス
      • ネットワーク接続無しのデータアクセス
    • 多くのデータストア
      • 複数のデータストアから異なるデータへのアクセス
    • データ共有
      • ユーザーデバイス間における NoSQL データの保存と照会
    • リアルタイムデータのストリーム
      • リアルタイムのクリックストリームログ収集とアクションの実行

2

どうやって実装する?

従来(REST API)

  • 必要な数だけエンドポイントを用意
  • 以下を対応させるのは大変
    • リレーション
    • 情報の削減
    • クエリのサポート
    • ソートとページング
    • データ変更通知

3

本当にそれでいいの?

GraphQL とは

  • API のクエリ言語
  • 既存のデータをフルフィリングなクエリで実行
  • クライアント、サーバーで同じスキーマを共有できる

クライアントアプリがデータをやり取りするための素晴らしい方法

  • API
    • リードデータのクエリ
    • データの変更
    • サブスクリプション
    • これだけで全てを実現

5

GraphQL はどうやって動くの?

  • データスキーマを定義
  • クエリの作成
    • クライアントが必要なデータだけを取り出せるようにする
  • 必要なデータだけを取得、余計なデータは取らない

6

AWS AppSync の機能

  • GraphQL のマネージドサービス
  • AWS アカウントのリソースに接続
  • オフラインの標準サポート
  • コンフリクト解消
  • エンタープライズレベルのセキュリティサポート
    • API キーでも IAM を使うことが可能
  • シンプルかつスケーラブルなリアルタイムデータ同期

9

AWS AppSync はどうやって動くの?

  • スキーマの作成とアップロード
    • 開発者はコンソールエディタを使用して GraphQL API を定義/デプロイできるので、アプリケーションは照会/データの変更/更新をリアルタイムで行える
  • データソースと接続する
    • AWS AppSync は自動的にデータソースやリソースをプロビジョニングし、それらを GraphQL API に接続する
  • リアルタイム及びオフラインでデータを同期
    • クライアントアプリケーションはデータをフェッチしたり、変更を加えたり、リアルタイムの変更をサブスクライブするために GraphQL API を呼び出す
    • オフラインユーザーは再接続した時にアプリケーションデータを変更し、更新を取得できる

10

データドリブンなアプリの構築

  • 一日に何百万件ものイベントを処理できる堅牢でスケーラブルなストレージ
  • 地理空間検索
  • モバイルとアプリのリアルタイム更新
  • モバイルと Web クライアント

アプリ名「MapTap」として紹介

11

デモ

位置情報をプロットするアプリ MapTap

16

データソース

  • Elasticsearch
  • DynamoDB
  • EC2

スキーマ

  • 取得するデータとクエリを定義する
  • フェッチにて変更したいデータを定義

マッピングテンプレート

  • operation key attributeValues を設定する
  • キーを指定する必要がある
  • 既成の共有プレートも利用可能
  • 変数が利用可能(${name} で記述)

17

クエリ

  • Mutation のモデルにセットして実行すると実際に書き込まれる
  • 変数が利用可能
    • 引数(リクエストパラメータ)は ${context.argument} から取得できる
  • レスポンスはデータストレージによる
    • これを Mapping Template で加工して返却する
    • API Gateway と同様、いくつかの関数が使える(for each など)
  • エディタが付いている
    • コード補完やエラーメッセージなどが表示される
    • スキーマに定義されていない項目はエラーが表示される
  • BatchInvoke の Lambda 発火で非同期書き込みが可能

13 18

クライアント

Web アプリとモバイルアプリの同期のデモ

  • Lambda を定期的に実行させランダムに座標を切り替える
  • モバイルアプリでサブスクライブしてリアルタイムで反映
  • Alexaに問いかけて座標を変えるデモもあり

AWS の構成

従来

  • 以下のサーバーを用意する必要がある
    • Web
    • WebSocket
    • PubSub
  • 取得したいリソースの数だけ API を用意しなければならない

12

AWS AppSync

  • サーバーの構築は不要
    • AWS AppSync が吸収
  • API はひとつだけ
    • GraphQL API なので取得したいリソースが返る
  • Alexa Skill も使えるよ!

14

AWS AppSync の利点

  • クライアントは要求するデータのみを受け取る
  • 1 回のリクエストで多くのデータソースから多くのリソースを取得できる
  • イントロスペクションによる自己文書化 API
  • 強い型システム
  • 強力な開発者ツール
  • より単純な API の進化

15

感想

AWS AppSync を利用することで必要な作業が削減され、開発者の負担がより少なくなりそうです。
私としては非常に興味のある GraphQL API は REST API を倒すことができるのでしょうか!?
これからどんどん試してみたいと思います。

リンク