株式会社ヘンリーでSREなどをやってる戸田(id:eller)です。弊社サービスはBackend for FrontendとしてApollo Serverを採用しています。
先月まではApollo Server v3を利用していましたがEOLが今年の10月に迫っていたため、v4へのアップグレードを実施しました。この記事では移行時に実施したことをご紹介いたします。
なお公式ドキュメントに主な変更点がまとまっていますので、類似の作業を予定されている方はそちらをまずご確認ください。
GraphQL関係の依存を更新する
Apollo Server v4は graphql
16.7.0以降の利用を推奨しています。もしいま依存しているバージョンが古いなら、その更新から始めることをおすすめします。
弊社では graphql
に加えて @graphql-tools/load
と @graphql-tools/schema
も使っており、更新が必要でした。これらの変更はApollo Serverの更新とは独立して事前に行ない、動作確認をしています。幸いにも性能への悪影響は観測されませんでした。
@apollo/server
を導入する
v3のときは以下のように数多くの依存を package.json
に記述する必要がありました:
apollo-server
apollo-server-core
apollo-server-errors
apollo-server-express
apollo-server-plugin-base
apollo-server-types
しかしv4からは @apollo/server
ひとつで足りるようになっています。コンテナの大きさには変化はなかったものの、依存管理コストが下がってとても嬉しい変更です。
なお @apollo/server-plugin-landing-page-graphql-playground
に含まれる ApolloServerPluginLandingPageGraphQLPlayground
はマイグレーション用に提供されているだけだそうです。弊社ではドキュメントに従って ApolloServerPluginLandingPageLocalDefault
に置き換えました。
エラーの扱いを1本化する
v3では ApolloError
と GraphQLError
の2つのエラーが存在しましたが、v4では GraphQLError
に1本化されています。独自のエラー型を提供しなくなったわけですね。
弊社では ApolloError
をcatchしていたり AuthenticationError
を投げていたりしている箇所のコード書き換えを行っています。
ヘルスチェックを変更する
v3では/.well-known/apollo/server-health
を使ったHTTPレベルのヘルスチェックが提供されていましたが、v4ではこれがなくなりました。GraphQLレベルのヘルスチェックを使ったうえで apollo-require-preflight: true
HTTPヘッダを設定する必要があります。
弊社ではCloud Runのstartup probeないしliveness probe、ならびにUptime Checkで利用するURLを変更し、GraphQLレベルに加えてDBサーバへの接続性なども確認しています。
まとめ
Apollo Serverをv3からv4にアップグレードした際に実施したことを紹介しました。マイグレーションガイドが親切で、おおむね書いてある手順に従うだけで完了できました。性能上の問題も特に確認できておらず、更新後2週間近く経ちましたが安定して稼働できています。
この記事がApollo Server v3をご利用中の方の背中を押すきっかけになれれば幸いです。