AppSyncSDK の謎な disableOffline&fetchPolicy パラメーターについて解説!

AppSyncSDK の謎な disableOffline&fetchPolicy パラメーターについて解説!

こんにちは!

最近は AppSync によるバッチ処理の開発が多くなってきました。市場にだんだんと AppSync(というより GraphQL )が広まってきているのを感じます、本当に嬉しいですね。

今時のリーンスタートアップなプロジェクトには、GraphQL の作り替えのしやすさが大変相性が良いので、AppSync と GraphQL がどんどん広がっていけばいいなと考えています。

本記事では、AppSyncSDK をバックエンドリソース上からの使用する際に指定する謎パラメーター「 disableOffline 」「 fetchPolicy 」について触れていきたいと思います。

想定する読者

  • AppSync で開発を行っているヒト
  • AppSync を Lambda 上から実行しているヒト、したいヒト
  • AppSyncSDK を NodeJS で使用してみたいヒト

はじめに

Lambda の NodeJS から AppSync を使用する際の注意点

Lambda へ適切な IAM ロールを設定し、AppSyncSDK の認証モードをクレデンシャルに指定しましょう。

const client = new AWSAppSyncClient({
    ...
    auth: {
        type: type,
        credentials: credentials,
    }
    ...
});

AppSyncSDK は Apollo クライアントを拡張した GraphQL クライアントです

AppSyncSDK の仕様を調べると、Apollo のドキュメントにたどり着くことが多いと思います。それは、AppSyncSDK は Apollo クライアントを拡張したライブラリーだからです。

実は Apollo でも、AWS AppSync と通信することが可能ですが auth に Cognito を指定できないなどということが発生しますので、基本的には AppSyncSDK を利用しましょう。( AWS AppSync でわざわざ Apollo を使用するメリットはないように感じます)

disableOffline&fetchPolicy を有効にするユースケース

fetchPolicy: 'network-only'disableOffline: true パラメータを付与しない場合、SDK はオフライン機能を有効にします。

反対に、付与することでオフライン機能を無効化することができます。

付与するケースブラウザ以外で AppSyncSDK を用いている場合など
付与しないケースブラウザで AppSyncSDK を用いており、かつ、オフライン機能を利用したい場合

つまり、Lambda などで AppSyncSDK を実行する場合は付与しません!

AppSyncSDK のオフライン機能とは?

代表的な機能として、オフライン状態からオンライン状態へ復帰した際に接続を自動的に行う再試行機能です。

オフライン機能では、一部ローカルストレージと通信し処理を行う必要があるため、もしも Lambda などでオフライン機能を有効にした場合、 Not Found LocalStorage エラーが発生する可能性があります。

そのため、AppSyncSDK 利用時には、fetchPolicy: 'network-only‘ と disableOffline: true を付与しオフライン機能を無効にしておきましょう。

ApolloClient の fetchPolicy とは?

APIからデータを取得する際にキャッシュを使用するかどうかを選択できます

network-only常に GraphAPI から最新のデータを取得します。
cache-firstネットワークリクエストを送信する前に cache を参照、cache が存在しなければネットワークからデータのフェッチを行います。
cache-and-networkキャッシュデーターとサーバーのデータの一貫性を保つように最適化します。cache-first と挙動は似ていますが、違いとしてはキャッシュが存在してもネットワークリクエストを実行しキャッシュを更新することがあります。
cache-only常にキャッシュからデータを取得します。キャッシュが存在しない場合は throw されます。

まとめ

AppSyncSDK は、Apollo を拡張しているので非常にオプションが多く高機能です。Apollo 開発の経験者はすんなり扱えるのではないでしょうか?

AppSync と GraphQL を広めるために、今後も AppSyncSDK に関する情報を発信していきます。

AppSync に関する開発はお問い合わせください。