🔴

【新機能】AWS AppSyncのMerged APIs を理解する。

2023/06/01に公開

元ネタ

https://aws.amazon.com/blogs/mobile/introducing-merged-apis-on-aws-appsync/

AWS AppSync

AppSyncとは

AWSのサーバレスなGraphQLサービスです。構築、管理、監視、セキュリティを容易に実装できます。またDynamoDBやLambda、EventBridgeなどの複数のデータソースとシームレスに統合することが可能です。一般的なHTTP APIもデータソースにできるので、拡張性も備えています。そしてAppSyncは単一の「スキーマ」と「データソース」「リゾルバー」「関数」で構成されます。

AppSyncの課題

①スキーマ変更時にバグが生まれやすい。

複数のマイクロサービスを束ねる単一のAPIエンドポイントとしてAppSyncを利用する場合、複数のチームが単一のスキーマを同時に修正する必要があります。しかし単一のスキーマ内にチームごとの適切なガードレール(アクセス権限)を設定することはできません。つまり「他チームのスキーマ定義を上書きしてしまった。。」という事態が発生する可能性がありました。

②肥大化した際のメンテナンス性が悪い。

AppSyncは単一のスキーマで動作します。スキーマが肥大化すると、グラフのバグ調査が困難になります。

Merge APIs on AWS AppSync

Merge APIsを利用すると、複数のAppSyncのAPIエンドポイントを容易&安全にマージできます。最大10個のAppSyncエンドポイントをマージ可能で、それぞれ独立したAppSync APIとして、作成、更新、テストができるようになります。

引用:https://aws.amazon.com/blogs/mobile/introducing-merged-apis-on-aws-appsync/
※以降、マージ先を「Merged API」、複数のマージ元を「Source API」と呼びます。

軽くやってみた。

事前にBlog APIとComment APIを作ってます。

Merged APIを構築する

①「Create API」を押下します。

②「Merged APIs」を選択して、「Next」を押下します。

③API名を入力後、「Next」を押下します。

④「Add Source APIs」を押下するとモーダルが出てきます。
マージするAPIを選択して追加後、「Next」を押下します。

⑤認証方式を選択できます。検証なので、API Keyのまま「Next」を押下します。

⑥最終確認ができたら、「Create API」を押下します。

⑦API一覧画面で作成されていればOKです。

Merged APIでクエリを実行してみる。

Blog API(Source)のクエリがちゃんと実行できています!🎉

新スキーマディレクティブ

Merged APIのスキーマで各Source APIの定義の競合が発生した場合、新しいディレクティブを利用することで解消することができます。
@canonical
Source API間で競合するタイプやフィールドが存在する場合、このディレクティブが付与されている方が優先されます。
@hidden
Merged APIにマージしたくない操作や型がある場合、このディレクティブを付与すると回避できます。
@renamed
Source API間で競合するタイプやフィールドが存在する場合、このディレクティブを使用することで名前をMerged API上で変更し、競合を解決できます。

Auto Merge

Merged APIには各Source APIが更新される度に、変更を検知して自動更新するオプションがあります。デフォルト設定は手動更新です。

他のアプローチとの比較

Merged APIはSource APIにAppSyncのみサポートしています。Apollo等で構築されたAPIと結合する必要がある場合は、run timeアプローチを利用しましょう。

build time アプローチ

AppSyncのMerged APIはこのアプローチを採用しています。
各Source APIを別のMerged APIに結合して利用する手法です。
リクエストはクライアント → Merged API → データソースという流れになります。
Merged APIとSource APIの両方を単一のリクエストが通過することはあり得ません。

run time アプローチ

各SubGraphの前段にルーティング用のAPIを用意する手法です。
リクエストはクライアント → Router → SubGraph → データソースという流れになります。
クライアントは簡易的なリクエストして、RouterがSubGraphに対して必要なリクエストを構築します。

まとめ

Merged APIsによって、マイクロサービスの運用がかなり楽になると思います。
本記事の元ネタになっているAWSブログではより具体的なデモが記載されていますので、興味がある方は是非ご覧になってみてください。
ではまた👋

Discussion