サイトアイコン

toLog

apollo federationのためのschemaファイルをroverで用意する

  • 更新日:
  • 投稿日:
サムネイル

この記事は最終更新日から2年以上が経過しています。

はじめに

つい最近、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
234enum 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});

設定ファイルについて

詳しくはこちら公式を参照ください。

  • cmsownself は、各 graphql エンドポイント ( subgraph ) の名前を任意に決めます
  • routing_url は、各 graphql エンドポイントを入力
  • schema.file は、ローカル内にある schema ファイルを指定
    • 単一の schema ファイルを指定する必要があるため、graphql code generator で統合出力された schema ファイルを参照するようにしています
      • graphql code generator で許される /**/*.graphql のようなワイルドカードができないため、複数ファイルを指定する必要がある場合は、何らか統合してあげる必要がありそうです 💦
  • schema.subgraph_url は、introspection 用に指定するため不要な場合もあるのですが、未入力だとエラーになるため指定しています

おわりに

graphql code generator で federation に対応した schema を統合出力できないだろうか?

ちゃんと調べなさいですが、コントリビュートチャンスか!?と思ったり思わなかったり 😅


プロフィール画像

canji

とにかく私的にサービスを作りたい発作を起こしている。お腹はペコペコ。

  • toLog Tools icon
  • dots icon