AWS AppSync選定を悩んでいる方必見!GraphqlエキスパートがAppSync導入をいろんな角度からまとめました😎

AWS AppSync選定を悩んでいる方必見!GraphqlエキスパートがAppSync導入をいろんな角度からまとめました😎

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

こんにちは!

最近のわたしたちの API 開発は、Graphql 開発がデファクトスタンダードになってきました。AWS で Graphql を扱う際は、ECS /Fargate などで Apollo Server を独自に構築するよりも、AWS AppSync の使用を考える人が多いのではないかと思います。

本記事では AWS AppSync 導入を悩んでいる方向けに、さまざまな角度から AWS AppSync についての解説 or まとめを提供します。

想定する読者

  • AWS で Graphql を構築したいヒト
  • AWS AppSync の利用を検討しているヒト

AWS AppSync とは?

GraphQL とは

まずは GraphQL API の基本的な考え方として、すべての API が単一のエンドポイント下で統一されたクエリ言語(GraphQL)を介して利用できるということです。RestAPI 風に言えば、一つのエンドポイントに POST リクエストし続けるようなイメージです。

フロントエンドの開発者は Graphql API 利用時、従来の RestAPI のように様々なエンドポイントへリクエストするのではなく、GraphQL API に単一のリクエストを実行することで、必要なすべてのデータを並列にすぐに取得できます。この構造は Web アプリケーションの複雑さを省くことができ、開発者は実装コストを大幅に削減することができます。

つまり GraphQL API は、アプリケーションから必要なすべてのデータを各所から一括収集し、結合された結果を API リクエスターに返す役割を果たします。

AppSyncとは

AWS AppSync は、AWS(アマゾンウェブサービス)によって開発されたフルマネージドサーバーレス GraphQL API サーバーです。GraphQL のリクエスト構文を解析し、各データを取得する場所を認識した上で、データをマージしてレスポンスを生成することが可能です。

AWS AppSync の大きな特徴 or メリットとして、Graphql リクエストを解析し AWS Lambda、DynamoDB および AuroraServerless(RDB データストア)、OpenSearch、HTTP API といった他 AWS サービスに接続することが可能な点です。例えば AWS AppSync に Graphql をデプロイしてちょっとした設定をするだけで、簡単に DynamoDB へのデータ出し入れが実現できます。

AWS AppSync はどのように機能するのか?

内部的には、AWS AppSync は GraphQL プロキシ(すべての GraphQL リクエストを受信して​​解析するサービス)と、特定の各リクエストタイプを処理するための複数のサブシステムで構成されています。

サポートされている Graphql リクエストタイプは

  • クエリ(データ取得)
  • ミューテーション(データ変更)
  • サブスクリプション( API からデータをストリーミングするための長期接続)

となります。

開発者は GraphQL API のスキーマを定義し、定義された各リクエストタイプにリゾルバー(リクエスト先の情報)をアタッチすることができます。

引用元: https://www.serverless.com/guides/aws-appsync#toc-0

デフォルトでサポートされるデータソース(リクエスト先)には、Amazon DynamoDB テーブル、RDS データベース、Amazon Opensearch ドメイン、AWS Lambda 関数、およびサードパーティの HTTP エンドポイントが含まれます。

引用元: https://www.serverless.com/guides/aws-appsync#toc-0

AWS AppSync インターフェースでは、ライブ GraphQL API を試すこともできるため、GraphQL スキーマとデータソースをすばやく動作検証(実際にパラメーターを設定しリクエスト)することができます。

引用元: https://www.serverless.com/guides/aws-appsync#toc-0

Amplify Framework

AWS AppSync の開発ツールとして AWS は Amplify Framework を提供します。これにより、GraphQL API を利用したモバイルおよび Web アプリケーションを簡単に構築できます。

Amplify は、対話型のインターフェースを提供しており、いくつかの設問に答えるだけで再利用可能なコンポーネントとユーティリティのライブラリを統合・設定し、CloudFormation を自動生成することができます。

ただし Amplify は開発規模が大きくなるにつれ制約との戦いが色濃くなるため、PoC やプロトタイピング開発での利用を強く推奨します。

AWS AppSync はサーバーレス環境の要となる

GraphQL API は、サーバーレスを利用した Web アプリケーションを構築する際によく使用される選択肢です。

特に、GraphQL API を提供する多くの AWS サーバーレスアプリケーションは、AWS AppSync に依存して API スキーマを管理し、リゾルバーとデータソースを調整します。

通常AWS AppSync を選択すると、従量制モデル、高い拡張性、および GraphQL API を構築する際の開発時間の短縮により、実装・運用コストが大幅に削減されます。

ECS /Fargate 等々を使用し自前で Graphql サーバーを立てるよりも、AWS AppSync 選定はプロジェクト全体で見て明らかにコスト効率が良いと言えるでしょう。

AWS AppSyncの認証

AWS AppSync は、多くの認証統合もサポートしています。

認証サービス補足
AWS Cognito ユーザープールCognitoUserPool の認証トークンによる API への認証制限。
ユーザープールグループを使用することできめ細かな制限を行うことが可能。
AWS IAMIAM のアクセストークンによる API への認証制限。
OpenID ConnectOpenIDConnect を提供する IDP の認証トークンによる API への認証制限。
API KEYAWS AppSync の管理する API KEY による API へのアクセス制限。
API KEY の有効期限に合わせて定期的に更新が必須。

AWS AppSync は Serverless Framework とどのように連携するのか?

Serverless Framework は、AWS AppSync の使用を簡単に開始できる AWS AppSync コンポーネント及びプラグインを提供しています。これらのモジュールは、利用可能なすべてのデータソースと認証方法をサポートすると同時に、AWS AppSync を使用する際に優れたコンポーネントを提供します。

また、AWS AppSync で管理される多くの API はデータソースとして AWS Lambda に依存しているケースが多いため、Serverless Framework の提供する各種機能(設計、デプロイ、モニタリング、デバッグ)を使用することで、Lambda 関数作成の複雑な点を省略し、実装コストを削減することができます。

AWS AppSync を使用する利点

フルマネージドサーバーレス GraphQL API サーバー

AWS AppSyncを使用すると、本来 Graphql サーバー構築に必要な作業(独自の GraphQL リゾルバーとデータソース接続の作成等々)をスキップできるため、新しい GraphQL API を立ち上げる際の時間を大幅に節約することができます。

またサーバーレスの側面から従量課金となるため、サービスイン時のコストも大幅に節約することができます。

リアルタイムサブスクリプションとオフライン機能の組み込み

AWS AppSync を使用すると、GraphQL サブスクリプションが可能になります。これは、データの最新の状態を常に提示するアプリケーションを構築するための優れた方法です。

AWS AppSync を Amplify フレームワークで使用する場合、サブスクリプションとオフライン機能を組み合わせることで追加の作業をあまり行わずに、不安定なモバイルネットワーク接続を正しく処理できる自動更新 Web および、モバイルアプリを高速に作成できます。

主要な AWS サービスとの統合

AWS AppSync は AWSLambda、RDS、DynamoDB と統合されているため、データベースに接続するためのカスタムコードを作成する必要がない場合があります。(接続を高度にカスタムする場合はパイプラインリゾルバーの利用が必要になることがあります。)

これにより、AWS AppSync を使用するチームの開発がスピードアップし、各種サービスへの接続設定でハマることなく、ビジネスロジックにより集中できるようになります。

AWS AppSync を使用する際に注意する点

AWS AppSync の使用にはいくつか注意事項があります。本番環境で AWS AppSync を使用する前に、次の点を慎重に検討する必要があります。

Graphql リクエスト方法の検討

AWS AppSync の便利な機能の多くは、Amplify フレームワークなどの AWS 製 GraphQL クライアントを使用している場合にのみ利用することができます。AWS 以外の外部ツールとして例えば Apollo クライアント、Axios などで Graphql リクエストを行う場合、リクエストは疎通しても MQTT 接続(サブスクリプション)やその他 AppSync の提供する便利機能を使用できないことがしばしば有ります。

パフォーマンスの透明性の欠如

AWS AppSync はマネージドサービスであるため、GraphQL API レイヤーのパフォーマンス設定にアクセスすることはできません。

API レイヤーが自社のプロダクトや大切な顧客の重要なインターフェースである場合、主要な API のパフォーマンス性能を制御できないと、深刻なリスク・問題が生じる可能性があります。

AWS AppSync は、API の応答時間にかなりの付帯的コスト(レイテンシー)を追加する可能性があり、特定の場合(たとえば、API でトレース情報の収集を構成していない場合)、増加したレイテンシーをデバッグするのに役立つデータがない場合があります。

一言で簡単に言えば、「パフォーマンス性能の調整が難しい」ということです。

すべてのデータソースがすぐにサポートされるわけではない

データストアが AWS の外部で実行されている場合、またはデフォルトで AWS AppSync でサポートされていないタイプのデータベースを使用している場合は、AWS AppSync でデータストアを使用できるようにするために AWS Lambda 関数を実装しなければいけません。

ただこれに対して言えることは、APIGateway を使用しても結果 Lambda を実装する必要はあるので、「AppSync は一部のデータストアーの接続を容易にしてくれる機能がある」という程度に捉えて頂ければと思います。

ベンダーロックイン

AWS AppSync は独自のソリューションであり、AWS AppSync から Graphql API を移行する場合は、互換性のあるGraphqlAPI サーバーの構築にかなりの時間を費やす必要があります。

AWS AppSync は何に適しているのか?

AWS AppSync は GraphQL API に重点を置いているため、当然、GraphQL API を提供することでメリットが得られるアプリケーションとサービスが AWS AppSync に適している可能性が高くなります。

では、REST API の代わりに GraphQL API を提供する必要があるのかという点ですが、どちらでも最終的に実現できることは変わりません。

私たちは Graphql を推奨したいですが、チーム内の技術スキル(特に AWS への知見)を確実に把握し、学習コストを前提に導入を考える必要があるかとは思います。RestAPI に慣れている技術者からすると、Graphql は初見では少し馴染みにくいインターフェースになっているのではと思います。

複雑なデータ取得が必要なアプリケーションに最適

フロントエンドから大量の API に対してアクセスが必要なデータ取得に複雑さを持つアプリケーション、レイテンシーを抑えたい場合には GraphQL が適しています。

同時に、GraphQL は RestAPI モデルとはまったく異なるので、先述の通り採用を慎重に行う必要があります。(GraphQL がプロジェクトに適しているかどうかを判断するために、チームと時間をかけて話し合うことをお勧めします)

AWS AppSync の制限

デフォルトでは、各 AWS アカウントには25の AWS AppSync GraphQL API の制限があり、GraphQL APIごとに1秒あたり1,000のクエリの制限があります。

これらの制限は、AWS サポートセンターでサポートチケットを開くことで引き上げることができます。

ただし、引き上げることができない制限がいくつかあります。

GraphQL API ごとの API キーの最大数は50に固定されています

AWS AppSync によって管理される GraphQL API にアクセスする50人以上の異なるユーザーが必要な場合は、AWS IAM を使用するか、AWS Cognito Identity Pools を使用するか、OpenID プロバイダーを統合することによってアクセスを認証付きにすることもできます。

スキーマドキュメントの最大サイズは 1MB です

非常に大きなレスポンスを行う API がある場合、AppSync からレスポンスができない場合があります。その場合は部分的に Kinesis を使用しストリーミング形式でのダウンロードにする、S3 へファイルを PUT しフロントエンドから PreSigned URL で取得するなどの対応が必要となります。

GraphQL クエリの最大実行タイムアウトは30秒です

API が目的のデータを返すのに30秒以上かかる場合は残念ながら、クエリは30秒の時点でやむを得ずタイムアウトになります。

一般的に、これらすべてが適切に設計された GraphQL API の場合、問題になることはほとんどありません。

AWS AppSync の価格設定

AWS の無料利用枠には、250,000の GraphQL クエリまたはデータの変更に加えて、AWS アカウントが作成されてから最初の12か月間の250,000のリアルタイム更新と600,000の接続分が含まれます。

無料枠を超えた場合、AWS AppSync の価格は次のとおりです。

課金項目費用(Pay as you go)
クエリとデータ変更リクエスト$4.00 / 1 million
API 応答のデータ転送$0.09 / GB(データ量が増えるとお得に)
リアルタイムの更新$2.00 / 1 million
分当たりの接続$0.08 / 1 million

価格設定の例

10,000ユーザー用の GraphQL API を構築していて、各ユーザーが平均して100個の GraphQL API リクエストを作成するとします。

各リクエストは、平均 5KB のサイズのレスポンスを返します。このような API の場合、月額料金は次のようになります。

API リクエスト:10,000ユーザー100リクエスト/ユーザーおよび日30日/月$4.00/百万リクエスト=3000万リクエスト/月$4.00/百万リクエスト=$120/月

データ転送:3000万リクエスト5KB/リクエスト$0.09 / GB = 143 GB * $ 0.09 / GB = $12.87/月

AWS AppSync の合計料金:$ 120 + $12.87 = $132.87/月

これらの計算にはバックエンドサービスの料金が含まれていないことに注意してください。そのため、GraphQL API が DynamoDB テーブルまたは一連の AWS Lambda 関数に依存している場合、それらは個別に課金されます。

セルフホスト対 AWS AppSync

AWS AppSync を使用することの重要な利点は、サービスが完全に AWS で管理されているという事実です。

GraphQL API のセットアップにかかる時間を節約し、Graphql 標準の構造をすぐに使用でき、バックエンドサービスに接続するために必要なコードの量を減らすことができます。

ただし、API のパフォーマンス特性を微調整して管理する必要があると思われる場合、またはデフォルトで AWS AppSync でサポートされていないリソースに接続する必要がある場合は、代わりにセルフホストソリューションを選択することをお勧めします。

AWS AppSync の代替

AWS AppSync の代わりに使用できる Graphql API サーバーソリューションは複数あります。自前で Graphql サーバー構築を検討している場合は参考にしてみてください。

Apollo Server

これはオープンソースの GraphQL サーバーであり、それを作成した会社は、サービスに基づいたマネージド GraphQL サービスレイヤーも提供しています。

Prisma

こちらも、マネージドバージョンや他の多くの便利なツールを備えたオープンソースソリューションでもあります。

Hasura GraphQL Engine

これは、PostgreSQL と緊密に統合されたオープンソースの GraphQL サーバーです。

まとめ

AWS AppSync についていろんな角度で開発者目線で情報を整理してみました。

Graphql に取り組みたいけど何から手をつけて良いかわからない、という方はまず AWS AppSync の利用を検討してみてください。とても手軽にデータストアーへ接続することができますよ。

Graphql の専門開発サービスを展開していますので、開発相談はお気軽にお問い合わせください。

Graphql 開発サービスはこちら