RAKSUL TechBlog

ラクスルグループのエンジニアが技術トピックを発信するブログです

Goのバージョンをサクッとアップデートできた話

初めまして! ラクスル株式会社 SCM(Supply Chain Management)チームの Jang Junsu です。今年でラクスルに新卒入社して4年目に入りましたが、テックブロックの発信は始めてなのでドキドキしています。笑

今回は、SCMプロダクトで使用中のGoのバージョンをサクッとアップデートできた話をしたいと思います!

始める前に

本格的な話をする前に、Goのバージョンサポート期限とバージョンアップの背景を少しお話しします。

Goのリリースはとても早く、6ヶ月単位でメジャーリリースが行われます。ただ、「最新の2バージョン」だけがサポート対象となるため、大体1年ぐらいでサポートが切れてしまいます。 ラクスルではシステムをセキュリティを含め安全に稼働させるため、様々なプロダクトの環境や言語バージョンの管理を行っており、常に最新バーションの検証及び追従を奨励しています。

このような文化下で、我々SCMチームは「ラクスルの成長を支える発注基盤システム構築」をミッションにお客様へ高品質かつ安定的な体験を届けるため、言語バージョンやインフラ環境などプロダクトの健康状態に関わる所を常に意識しています。

バージョンアップの準備

このような懸念点が存在し、問題が発生した場合の原因究明が非常に難しいため、使用中の言語のメジャーバージョンアップは慎重に考慮する必要があります。

  1. アプリケーションコードのDeprecated
  2. 使用中のフレームワーク・ライブラリとの互換性
  3. 新しいコードスタイル
  4. 言語内部仕様変更によるパフォーマンス変化

実際に、以前他言語のバージョンアップで内部実装の変更によるパフォーマンス悪化の前例があり、今回は4番に特に気をつけていました。

リリースノートを読む

当たり前の話ですが、まず担当者がリリースノートを読み、内容と懸念点を整理します。不明な所がある場合はチームに相談して全員の合意を取ることが大事です。リリースノートのダブルチェックができればより安心です。

テストパターンの洗い出し

テストは単純なコード変更やDeprecatedのチェックからAPI通信などの通信チェックまで様々な側面が存在します。これは担当プロダクトの発展過程により異なるので、チーム全員でテストパターンを洗い出すことが大事なポイントです。

参考までに今回SCMチームで洗い出したパターンは以下となります。

  1. 社内用API 通信テスト
  2. 社外用API 通信テスト
  3. 社内管理画面及びコア機能の動作テスト
  4. 本番環境と同等のデータ量やトラフィックを想定したパフォーマンス測定
実行環境の確認

アプリケーションは使用中の言語バージョンを含めライブラリなど様々な依存関係を持ちます。実行環境の構成によっては依存関係の変化を同じく追従する作業が必要になるケースもあります。なので、プロダクトの実行環境の仕組みを把握してきちんと依存関係を同期させたり、依存関係に影響を受けない実行環境の構成を作る必要があります。

Goにはクロスコンパイル機能があり、実行環境毎にバイナリをビルドできるので、実行環境の影響を受けにくい言語です。実行環境のコンテナではこのバイナリを使うだけで、Goのバージョンやライブラリなど依存関係の変化による影響を最小化することができます。

実際SCMチームではこのようなGoの特徴とAWSサービスを組み合わせたデプロイ仕組みを導入しています。下記の図の通りデプロイの際にCodeBuildでプロダクトの依存関係を含めたバイナリーを生成し、コンテナイメージ化します。実行環境ではECRに保存されたバイナリーイメージを使うだけで依存関係の変化による影響を受けにくい構成をしています。

インフラ構成図

最後に

以上、Goのバージョンアップがサクッとできたお話でした。

SCMチームに来る前には依存関係の変更があった際に実行環境でも同じく依存関係のアップデートなどが求められるRubyやPHPを主に使っていたので、後方互換をちゃんと保っていてかつバイナリでコンパイルできるGo言語のバージョンアップは比較的楽でした。

今回Go言語の頼もしさと手順書の作成でバージョンアップからテストとリリースまで快適に完了できましたし、リリース後も問題が発生しなかったので今後のアップデートでも同じ手順で安全に行える自信が付きました。

言語のバージョンアップはつい身構えてしまうものですが、プロダクトの健康維持のためには必須の作業です。手順書作成や実行環境の整備などをしっかり行うことでより低コストかつメンテナンスが簡単な仕組みを作り、プロダクト作りに集中していけるとよいですね!