見出し画像

ライブラリのバージョンアップ対応について

こんにちは。ビズパのプロダクト開発チームの吉留です。

Webサービスの開発・運用・保守をしていると、使用しているライブラリのバージョンアップ対応を継続的に行う必要があります。
ビズパにおいても、ある程度の間隔で定期的にライブラリのバージョンアップ対応を行っています。

今回は、直近で行ったライブラリのバージョンアップ対応について書きたいと思います。

バージョンアップの目的

ライブラリのバージョンアップには大きく、「脆弱性への対応」と「新機能の利用」の
2つの目的があると考えています。

脆弱性への対応

脆弱性が発見された場合、修正パッチが配布されるケースが多いです。
その際、利用しているライブラリのバージョンが古い状態だと、修正パッチがすぐに当てられないというリスクを抱えてしまいます。

また、ライブラリのサポート期間についても把握しておく必要があります。

サポート対象から外れたバージョンでは、脆弱性が見つかったときに修正が行われないことが多く、セキュリティ的観点では良くありません。

そのため、サポート期限内のバージョンの利用を徹底することが大切だと考えています。

新機能の利用

特にメジャーバージョンが変わるような大きなリリースがある時は、新しい機能が追加されることが多いです。
新しい機能とは、より便利な機能が簡単に作れるようなものやパフォーマンスが向上するようなものなど様々です。

新しい機能は、ライブラリを使って開発する側からするとモチベーションが高くなるポイントでもあると考えています。

そのため、開発効率を高めるためにもできる限り新しいバージョンを使うことが望ましいと考えています。

バージョンアップ対応の流れ

ここでは、ビズパで実際に行っているバージョンアップ対応の流れについて書きたいと思います。

1. リリースノートを見る

ビズパではWebアプリケーションフレームワークとしてPython製の「Django」を採用しています。
Djangoでは、新しいバージョンのリリースに併せてリリースノートが公式サイトで見れます。

たとえば、今年の4月にLTSとしてリリースされたDjango 4.2のリリースノートは↓です。

まずは、リリースノートの中身を見て、自分たちが開発しているシステムに大きな影響がないかを調べていきます。

特に大切なのは、非推奨になったロジックの部分です。
非推奨になったクラスやメソッドは、今後のバージョンアップで完全に削除されるケースが多いです。
そのため、非推奨になったタイミングで推奨されている書き方に変更することが望ましいと考えています。

他のライブラリについても同様に、リリースノートがある場合はチェックして影響範囲を確認しています。

2. ローカル開発環境で実際にバージョンアップして動作確認する

ある程度影響範囲を把握した後に、非推奨ロジックなどの修正するべきポイントを修正し、動作確認を行います。

まずは、自分のPCで動作確認を行います。
ここである程度、動かなくなってしまった部分や想定外の挙動をする部分などを修正します。

特にWebアプリケーションフレームワークやフロントエンドのライブラリをバージョンアップする際は、影響を受ける部分が大きくなります。
そのため、時間をかけて動作確認をしています。

また、ローカル開発環境でのテストコードの実行も行います。
ライブラリのバージョンアップに伴いテストケースが壊れてしまうことがあります。
テストコードを実行することで、影響がある部分を把握することも可能です。
テストコードが壊れていた場合は、内容を確認し修正を行います。

テストコードによる品質の担保はバージョンアップの際にも力を発揮します。
変更に強いシステムを保つためにも、普段からテストコードを書いておくことが大切だと思います。

3. 本番環境と同じインフラ構成で検証する

ローカル開発環境でバージョンアップと修正が完了したら、本番環境と同じインフラ構成で検証を行います。

ビズパでは、AWSを利用しているため、AWS環境にデプロイして動作確認を行います。

ローカル開発環境では発生しなかった誤作動が本番環境のインフラ構成では発生することはよくあります。
そのため、必ず本番環境と同じインフラ構成でテストを行うようにしています。

ビズパでは、本番環境とローカル開発環境をできるだけ同じにしようと、ローカル開発環境ではDocker、本番環境ではFargateを採用していますが、それでもAWS環境でしか発生しないバグというのは発生します。

そのため、ローカル開発環境でのテストより本番環境と同じインフラ構成でのテストに重きを置いています。

4. 1-3の全ての動作確認で問題がなくなれば本番環境に反映します。

今回のバージョンアップ対応で起こった問題の例

次に今回のバージョンアップ対応をしていく中で実際に影響があり、修正した部分を2つご紹介します。

ローカル開発環境でhtmlの更新が反映されない

Djangoのバージョンアップをしたことでローカル開発環境でhtmlの変更が反映されなくなっていました。
原因としては、Djagnoのバージョン4.1より、デフォルトでテンプレートキャッシュが行われるようになっていたためでした。

これを受けてローカル開発環境ではテンプレートをキャッシュしないように修正が必要でした。

ビズパでは今回のバージョンアップ対応で、Djangoのバージョンは3.2から4.2に変更しているため、Djangoのリリースノートもその間の全てを参照する必要がありました。

サーバーエラーログにスタックトレースが出力されなくなっていた

次にサーバーエラー(HTTPステータスコード500系)のスタックトレースがログに出力されなくなっていました。

ビズパではサービス品質向上のため、常にサーバーエラーを監視しています。
サーバーエラーが発生すると、通知が来るように仕組みを整えておりサーバーエラーの原因とその対処を行っています。

また、Djangoではサーバーエラーが発生すると専用の画面を表示させる仕組みが提供されていますが、ビズパではその仕組みを拡張して利用しています。

今回のバージョンアップ対応に伴い、拡張している部分でサーバーエラー時のスタックトレースを揉み消してしまっており、ログに出力されないようになってしまっていました。
これを受けて、明示的にエラーログとしてスタックトレースを出力する修正が必要となりました。


このように、影響範囲の大きいライブラリのバージョンアップでは思わぬところで問題が発生する可能性があります。
そのため、多角的な視点から動作確認をすることは大切だと考えています。

最後に

今回はライブラリのバージョンアップ対応についてでした。

Webサービスを開発していく上で、外部のライブラリを使うケースは非常に多いと思います。
外部のライブラリを使う以上、バージョンアップは意識して行う必要があり、しっかりサポート期限内のバージョンに対応しておくことが、インシデントを減らすことにもつながってくると考えています。

2021年12月にLog4jの脆弱性が大きな話題になったことも記憶に新しいと思います。
このような脆弱性に対しても、使っているライブラリが最新バージョンになっていると修正パッチがすぐに当てられるので改めてバージョンアップ対応は大切だと感じます。

最後までお読みいただきありがとうございました!
ビズパにご興味のある方はぜひ以下のサイトもご覧ください。

▼Bizpaの創業ストーリーはこちら!

▼Bizpaのことをもっと知りたい方はこちら!


この記事が気に入ったらサポートをしてみませんか?