こんにちは!
最近のわたしたちの API 開発は、Graphql 開発がデファクトスタンダードになってきました。AWS で Graphql を扱う際は、ECS /Fargate などで Apollo Server を独自に構築するよりも、AWS AppSync の使用を考える人が多いのではないかと思います。
本記事では AWS AppSync 導入を悩んでいる方向けに、さまざまな角度から AWS AppSync についての解説 or まとめを提供します。
まずは GraphQL API の基本的な考え方として、すべての API が単一のエンドポイント下で統一されたクエリ言語(GraphQL)を介して利用できるということです。RestAPI 風に言えば、一つのエンドポイントに POST リクエストし続けるようなイメージです。
フロントエンドの開発者は Graphql API 利用時、従来の RestAPI のように様々なエンドポイントへリクエストするのではなく、GraphQL API に単一のリクエストを実行することで、必要なすべてのデータを並列にすぐに取得できます。この構造は Web アプリケーションの複雑さを省くことができ、開発者は実装コストを大幅に削減することができます。
つまり GraphQL API は、アプリケーションから必要なすべてのデータを各所から一括収集し、結合された結果を API リクエスターに返す役割を果たします。
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 は GraphQL プロキシ(すべての GraphQL リクエストを受信して解析するサービス)と、特定の各リクエストタイプを処理するための複数のサブシステムで構成されています。
サポートされている Graphql リクエストタイプは
となります。
開発者は GraphQL API のスキーマを定義し、定義された各リクエストタイプにリゾルバー(リクエスト先の情報)をアタッチすることができます。
デフォルトでサポートされるデータソース(リクエスト先)には、Amazon DynamoDB テーブル、RDS データベース、Amazon Opensearch ドメイン、AWS Lambda 関数、およびサードパーティの HTTP エンドポイントが含まれます。
AWS AppSync インターフェースでは、ライブ GraphQL API を試すこともできるため、GraphQL スキーマとデータソースをすばやく動作検証(実際にパラメーターを設定しリクエスト)することができます。
AWS AppSync の開発ツールとして AWS は Amplify Framework を提供します。これにより、GraphQL API を利用したモバイルおよび Web アプリケーションを簡単に構築できます。
Amplify は、対話型のインターフェースを提供しており、いくつかの設問に答えるだけで再利用可能なコンポーネントとユーティリティのライブラリを統合・設定し、CloudFormation を自動生成することができます。
ただし Amplify は開発規模が大きくなるにつれ制約との戦いが色濃くなるため、PoC やプロトタイピング開発での利用を強く推奨します。
GraphQL API は、サーバーレスを利用した Web アプリケーションを構築する際によく使用される選択肢です。
特に、GraphQL API を提供する多くの AWS サーバーレスアプリケーションは、AWS AppSync に依存して API スキーマを管理し、リゾルバーとデータソースを調整します。
通常AWS AppSync を選択すると、従量制モデル、高い拡張性、および GraphQL API を構築する際の開発時間の短縮により、実装・運用コストが大幅に削減されます。
ECS /Fargate 等々を使用し自前で Graphql サーバーを立てるよりも、AWS AppSync 選定はプロジェクト全体で見て明らかにコスト効率が良いと言えるでしょう。
AWS AppSync は、多くの認証統合もサポートしています。
認証サービス | 補足 |
AWS Cognito ユーザープール | CognitoUserPool の認証トークンによる API への認証制限。 ユーザープールグループを使用することできめ細かな制限を行うことが可能。 |
AWS IAM | IAM のアクセストークンによる API への認証制限。 |
OpenID Connect | OpenIDConnect を提供する IDP の認証トークンによる API への認証制限。 |
API KEY | AWS AppSync の管理する API KEY による API へのアクセス制限。 API KEY の有効期限に合わせて定期的に更新が必須。 |
Serverless Framework は、AWS AppSync の使用を簡単に開始できる AWS AppSync コンポーネント及びプラグインを提供しています。これらのモジュールは、利用可能なすべてのデータソースと認証方法をサポートすると同時に、AWS AppSync を使用する際に優れたコンポーネントを提供します。
また、AWS AppSync で管理される多くの API はデータソースとして AWS Lambda に依存しているケースが多いため、Serverless Framework の提供する各種機能(設計、デプロイ、モニタリング、デバッグ)を使用することで、Lambda 関数作成の複雑な点を省略し、実装コストを削減することができます。
AWS AppSyncを使用すると、本来 Graphql サーバー構築に必要な作業(独自の GraphQL リゾルバーとデータソース接続の作成等々)をスキップできるため、新しい GraphQL API を立ち上げる際の時間を大幅に節約することができます。
またサーバーレスの側面から従量課金となるため、サービスイン時のコストも大幅に節約することができます。
AWS AppSync を使用すると、GraphQL サブスクリプションが可能になります。これは、データの最新の状態を常に提示するアプリケーションを構築するための優れた方法です。
AWS AppSync を Amplify フレームワークで使用する場合、サブスクリプションとオフライン機能を組み合わせることで追加の作業をあまり行わずに、不安定なモバイルネットワーク接続を正しく処理できる自動更新 Web および、モバイルアプリを高速に作成できます。
AWS AppSync は AWSLambda、RDS、DynamoDB と統合されているため、データベースに接続するためのカスタムコードを作成する必要がない場合があります。(接続を高度にカスタムする場合はパイプラインリゾルバーの利用が必要になることがあります。)
これにより、AWS AppSync を使用するチームの開発がスピードアップし、各種サービスへの接続設定でハマることなく、ビジネスロジックにより集中できるようになります。
AWS AppSync の使用にはいくつか注意事項があります。本番環境で AWS AppSync を使用する前に、次の点を慎重に検討する必要があります。
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 は GraphQL API に重点を置いているため、当然、GraphQL API を提供することでメリットが得られるアプリケーションとサービスが AWS AppSync に適している可能性が高くなります。
では、REST API の代わりに GraphQL API を提供する必要があるのかという点ですが、どちらでも最終的に実現できることは変わりません。
私たちは Graphql を推奨したいですが、チーム内の技術スキル(特に AWS への知見)を確実に把握し、学習コストを前提に導入を考える必要があるかとは思います。RestAPI に慣れている技術者からすると、Graphql は初見では少し馴染みにくいインターフェースになっているのではと思います。
フロントエンドから大量の API に対してアクセスが必要なデータ取得に複雑さを持つアプリケーション、レイテンシーを抑えたい場合には GraphQL が適しています。
同時に、GraphQL は RestAPI モデルとはまったく異なるので、先述の通り採用を慎重に行う必要があります。(GraphQL がプロジェクトに適しているかどうかを判断するために、チームと時間をかけて話し合うことをお勧めします)
デフォルトでは、各 AWS アカウントには25の AWS AppSync GraphQL API の制限があり、GraphQL APIごとに1秒あたり1,000のクエリの制限があります。
これらの制限は、AWS サポートセンターでサポートチケットを開くことで引き上げることができます。
ただし、引き上げることができない制限がいくつかあります。
AWS AppSync によって管理される GraphQL API にアクセスする50人以上の異なるユーザーが必要な場合は、AWS IAM を使用するか、AWS Cognito Identity Pools を使用するか、OpenID プロバイダーを統合することによってアクセスを認証付きにすることもできます。
非常に大きなレスポンスを行う API がある場合、AppSync からレスポンスができない場合があります。その場合は部分的に Kinesis を使用しストリーミング形式でのダウンロードにする、S3 へファイルを PUT しフロントエンドから PreSigned URL で取得するなどの対応が必要となります。
API が目的のデータを返すのに30秒以上かかる場合は残念ながら、クエリは30秒の時点でやむを得ずタイムアウトになります。
一般的に、これらすべてが適切に設計された GraphQL API の場合、問題になることはほとんどありません。
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 で管理されているという事実です。
GraphQL API のセットアップにかかる時間を節約し、Graphql 標準の構造をすぐに使用でき、バックエンドサービスに接続するために必要なコードの量を減らすことができます。
ただし、API のパフォーマンス特性を微調整して管理する必要があると思われる場合、またはデフォルトで AWS AppSync でサポートされていないリソースに接続する必要がある場合は、代わりにセルフホストソリューションを選択することをお勧めします。
AWS AppSync の代わりに使用できる Graphql API サーバーソリューションは複数あります。自前で Graphql サーバー構築を検討している場合は参考にしてみてください。
これはオープンソースの GraphQL サーバーであり、それを作成した会社は、サービスに基づいたマネージド GraphQL サービスレイヤーも提供しています。
こちらも、マネージドバージョンや他の多くの便利なツールを備えたオープンソースソリューションでもあります。
これは、PostgreSQL と緊密に統合されたオープンソースの GraphQL サーバーです。
AWS AppSync についていろんな角度で開発者目線で情報を整理してみました。
Graphql に取り組みたいけど何から手をつけて良いかわからない、という方はまず AWS AppSync の利用を検討してみてください。とても手軽にデータストアーへ接続することができますよ。
Graphql の専門開発サービスを展開していますので、開発相談はお気軽にお問い合わせください。
スモールスタート開発支援、サーバーレス・NoSQLのことなら
ラーゲイトまでご相談ください
低コスト、サーバーレスの
モダナイズ開発をご検討なら
下請け対応可能
Sler企業様からの依頼も歓迎