はじめに
つい最近、apollo federation
で複数のバックエンドの graphql を統合対応したのですが、schema の統合 ( supergraph の生成 ) に苦労したので備忘録しておきます。
apollo 公式の手順をちゃんと理解・実践すれば問題ない話です 💦
何に困ったのか?
graphql code generator で schema を管理しているのですが、どうも apollo federation 用の schema を作成できませんでした。
Schema AST プラグインで schema を統合出力した際に、federation もうまく設定できないかと試したのですが、schema 自体は作れるのですが federation 対応ができませんでした。やり方を知っていたら教えてほしい... 😢
1# codegen.yml
2# 各エンドポイントもしくはスキーマファイルを単純に結合したファイルができてしまう
3dist/federation/schema.graphql:
4 schema:
5 # 同一のパッケージ内にあるローカルの schema ファイルを参照する
6 - src/cms/**/*.graphql
7 # 別エンドポイントの schema を参照する
8 - http://localhost:52224/graphql
9 plugins:
10 - schema-ast
そこで、apollo 公式が用意している apollo rover cli で schema を素直に統合することで対応しました 😓
tl; dr
まずは、rover cli をインストール
1npm i --save-dev @apollo/rover
2
3# or
4
5yarn add -D @apollo/rover
上述の codegen.yml
を rover で schema を統合する設定ファイルに直すと以下になります。
1# example.yml
2# ローカルホストのポートは適当です
3subgraphs:
4 cms:
5 routing_url: http://localhost:56000/graphql
6 schema:
7 file: dist/cms/schema.graphql
8 ownself:
9 schema:
10 subgraph_url: http://localhost:52224/graphql
1// schema出力用のコマンド例
2{
3 "scripts": {
4 "build:federation": "rover supergraph compose --config rover.yml > schema.graphql"
5 }
6}
build すると 以下のような schema ファイルが出力され、各バックエンドのエンドポイントが組み込まれます。
1# schema.graphql
2・
3・
4enum join__Graph {
5 CMS @join__graph(name: "cms", url: "http://localhost:56000/graphql")
6 OWNSELF @join__graph(name: "ownself", url: "http://localhost:52224/graphql")
7}
federation 用のバックエンドで以下のように読み込むことで、各バックエンドを叩けるようになります。
1// exmaple.ts
2const supergraphSdl = readFileSync("./schema.graphql").toString();
3
4const gateway = new ApolloGateway({
5 supergraphSdl,
6});
設定ファイルについて
詳しくはこちら公式を参照ください。
cms
やownself
は、各 graphql エンドポイント (subgraph
) の名前を任意に決めますrouting_url
は、各 graphql エンドポイントを入力schema.file
は、ローカル内にある schema ファイルを指定- 単一の schema ファイルを指定する必要があるため、graphql code generator で統合出力された schema ファイルを参照するようにしています
graphql code generator
で許される/**/*.graphql
のようなワイルドカードができないため、複数ファイルを指定する必要がある場合は、何らか統合してあげる必要がありそうです 💦
- 単一の schema ファイルを指定する必要があるため、graphql code generator で統合出力された schema ファイルを参照するようにしています
schema.subgraph_url
は、introspection 用に指定するため不要な場合もあるのですが、未入力だとエラーになるため指定しています
おわりに
graphql code generator
で federation に対応した schema を統合出力できないだろうか?
ちゃんと調べなさいですが、コントリビュートチャンスか!?と思ったり思わなかったり 😅