k6 (と Playwright)で負荷試験を刷新する
atama plus株式会社 / arpena1pay
SRE / エンジニア組織: 11名〜50名
利用プラン | 利用機能 | ツールの利用規模 | ツールの利用開始時期 | 事業形態 |
---|---|---|---|---|
Open Source | パフォーマンステスト機能 | 10名以下 | 2023年 | B to B B to C |
利用プラン | Open Source |
---|---|
利用機能 | パフォーマンステスト機能 |
ツールの利用規模 | 10名以下 |
ツールの利用開始時期 | 2023年 |
事業形態 | B to B B to C |
アーキテクチャ
アーキテクチャの意図・工夫
※ Playwright から生成される HAR ファイルを k6 で利用することを前提としています
CI 環境で k6 を実行
k6 の負荷試験の容態を定義する config ファイルと、HAR → k6シナリオ変換を行う内製スクリプト等を一つのリポジトリにまとめています。これを CI 環境にチェックアウトし、HAR ファイルのダウンロードと k6 シナリオへの自動変換、k6 による負荷試験を一連で定期実行しています。
負荷試験成否の通知
プロダクトコードの変更に伴って負荷シナリオが実行失敗するケースもあるため、試験の成否をSlackに通知します。
Datadog へのメトリクス送信
CI 環境で実行される k6 のメトリクスも、エージェントを CI で用いることで Datadog に送信できます。この設定についてのドキュメントや、CircleCI Orbs も端的に情報がまとめられていました。
導入の背景・解決したかった問題
導入背景
導入前の状況
負荷試験の仕組みはすでに構築されていました。
以下のような流れで、アベレージロードテストを毎日定時に自動実行していました。
- 変更の加わったコードを試験用サーバー環境にデプロイ
- 負荷をかける側の環境をAWS CDKで自動構築
- Locust のシナリオを動かしてサーバーのAPIのエンドポイントに対して負荷がけ
- 主要なAPIのレイテンシが悪化していないかを確認
社内で主に使われる Python でコーディングができるという理由で Locust を利用していました。
SREチームがテストシナリオコードのメンテナでした。
ツール導入前の課題
課題①:インフラ運用コストへの対処
当時、インフラのコード管理を Terraform メインで行う中、負荷試験実行環境だけAWS CDK管理で認知負荷になっていました。(現在、別で AWS CDK を利用しているサービスもありますが...)
CDK バージョン更新も後回しとなり、その実施に大きなコスト発生が見込まれていました。 また、事業状況の変化に伴い負荷試験環境を変更・構築することが少なくなり、負荷試験のインフラをコード管理することのメリットは小さくなっていました。
課題②:シナリオ運用コストへの対処
負荷試験構築のときの想定よりここに割けるチームのリソースに乏しく、シナリオの運用まで手が回らず、テストシナリオがプロダクトの進化に同期的に追従できていませんでした。
どのような状態を目指していたか
健全な負荷試験の運用(主にシナリオ・インフラのメンテナンス)にかかるコスト最適化が目的でした。
比較検討したサービス
- Locust (当時利用中)
- Apache JMeter
- Gatling
- vegeta
- Artillery
比較した軸
実行環境の移行可能性 (vs 課題①:インフラ運用コストへの対処)
CDK によるインフラ管理、CDK そのもののメンテナンスを脱却するのに併せて、負荷試験環境構築・運用になるべく手がかからなくなることが要件でした。
想定としては、既存の CI 環境への組み込みか、マネージドなクラウドサービスの利用を考えていました。
HAR との互換性 (vs 課題②:シナリオ運用コストへの対処)
Playwright の実行で生成される HAR 形式のファイルを用いて、シナリオ実装を機械化して運用コストを下げることが刷新の狙いのひとつでした。そのため、HAR からツールで用いるシナリオ定義を生成できる周辺ライブラリが存在することを必須要件としていました。
負荷シナリオ定義の自由度
単一の HTTP リクエスト量産ではなく、一連のユーザー体験を再現したときの負荷をモニタリングしたく、ある程度は独自にシナリオ定義できる必要がありました。
その他、SREを加味した観点
シナリオ定義で用いる言語と社内利用言語の親和性
SREチーム以外の開発者にも積極的に負荷試験へ関与してもらえるよう、利用言語の差による無用な学習コストを発生させないことも考えていました。従来の Locust の選定でも考慮していた点でした。
将来的な拡張性
事業拡大に伴うプロダクトの変化により、大規模かつマネージドなクラウド環境からの負荷実行が必要になったり、HTTP以外のプロトコルへの移行が発生したり、という将来的な拡張性もある程度は考慮しました。 必須の要件とはしなかったのもの、対応できそうであればベターというスタンスでした。
選定理由
インフラのコスト・保守性が改善する見込みがある (vs 課題①)
k6 は低スペックのマシンでも一定負荷をかける試験が実行可能で、既存の CI パイプラインに負荷試験実行環境を構築できる見込みがたちました。当時利用していた Locust も CI 実行は不可能ではなかったはずですが、マシンスペック水準に加えて k6 の方が CI 環境のライブラリ・ドキュメントも充実している印象を受けました。
シナリオ自動生成の実現可能性が高い (vs 課題②)
Playwright のシナリオから HAR を経由して機械的にシナリオ生成できることを検証できました。 Locust にも同様の変換ライブラリはあったものの、メンテナンスは外部コミュニティ(例えば個人の公開リポジトリ)に依存しており、Grafana Labs が主導してリポジトリを公開・運用している k6 のエコシステムとは差があると捉えました。
その他の要件
- シナリオ定義の自由度 & 社内利用言語との親和性:JavaScript とほとんど同じ書き方ができる
- 拡張性:GraphQL/gRPC などの対応、k8s の利用、Grafana Cloud k6 の存在、etc...
導入の成果
改善したかった課題はどれくらい解決されたか
AWS CDK によるインフラ管理 → 運用コスト減
CI 環境で実行されるようになり、CDK のコード管理はなくなりました。 管理対象は CI 設定用の yaml に代替され、インフラの運用は定期的に他のサービスで行われる CI 環境バージョンアップ等の一連のメンテナンスに吸収されました。
負荷試験シナリオコードの運用 → ある程度まで自動化
Playwright の運用状況に依存しているため、シナリオ生成・更新・追加を完全に自動化できたとはまだ言えません。 ただ、今後 Playwright との連携を高めていき、従来できていなかった運用ができるようになっていくと見込んでいます。
どのような成果が得られたか
上記の課題解決の度合いが主な成果ではありますが、副次的に得られた点を付記しておきます。
Datadog との連携
かつては負荷をかけられる側のインフラのメトリクスのみ監視していました。 今回の k6 導入により、エージェントから Datadog に負荷をかける攻撃側のメトリクスも送信できるようになりました。シナリオ実行時の監視対象が増えてトラブルシューティングに役立っています。
導入時の苦労・悩み
Open Source 版のみの利用であり、k6 そのものの導入で苦労した点は特にありませんでした。 自社の特殊なユースケースで発生した点で一般に役立つか怪しいですが、念のため記載しておきます。
Playwright からの負荷試験シナリオ自動生成の接続
あるリクエストに対して返却されたレスポンスのデータを用いて、次のリクエストのデータを構成するのはよくある流れです。このレスポンスデータがリクエスト毎に変化し再利用できない値だと、Playwright で生成される HAR ファイルのデータは、そのままでは k6 でシナリオ再現できないものになってしまいます。
ログインのセッション保持など一部は k6 のライブラリで対応できますが、プロダクトでは同様の処理を行うもののライブラリのみで対応できない箇所が複数ありました。公式の har-to-k6 も調査時には未対応でした。
そのような箇所に対応するため、Jinja のテンプレートエンジンを挟んで k6 シナリオ(JavaScript)コードに変換するようにしました。
導入に向けた社内への説明
上長・チームへの説明
当時の状況と課題認識はチーム全員で共有できていたので、基本的に運用コストが下がるのであればOKという状態でした。
そのため、ツールを比較する際の軸・基準の決め方を重点的に議論しました。
トラブル等で負荷試験環境のメンテナンスが発生した過去の対応チケットを参照し、また事業計画を鑑みて将来的に見込まれる運用拡大も考慮しました。今後数年スパンで発生するであろう運用コストを選定候補のツールごとに見積りました。
チームには見積りの妥当性をレビューしてもらい、指摘に応じて修正しました。
チームメンバーからは、k6 について、主にCIで実行できると見込まれる点(インフラ運用コスト減)やクラウド版も含めた将来的な拡張性が評価されました。
最終的に、瞬間的な移行作業で発生するコストを近い将来に回収し、その後さらなる効果を得られる選択として、「ツール・環境を移行する」「k6 を使うこと」の2点をチームで合意しました。
活用方法
- 日次で k6 の負荷試験を実行
- 定期更新される HAR ファイルをベースに k6 シナリオコードを自動再生成
よく使う機能
パフォーマンステスト機能
Open Source 版を利用しています
ツールの良い点
- 低スペック環境での実行パフォーマンス
- JavaScript でのシナリオ記述
- Grafana Labs による周辺ライブラリの安定運用と充実度
- ドキュメントの多さ
ツールの課題点
- ドキュメントは日本語対応していない
- HAR ファイルの動的な値を再利用する変換には一手間必要(k6 そのものの問題ではないです)
ツールを検討されている方へ
このレビューは、Playwright の E2E テストシナリオがある程度実装され、それを負荷試験にも活用する前提のもと、ツールを比較しています。特定のエンドポイントに対して瞬間的な負荷をかけたいなど、一般的に考えられるシンプルな負荷試験のケースにおける比較ではないことにご留意ください。
その前提を踏まえ、記述してきた良い点を利とする状況下では k6 を検討に含める価値はあると思います。
atama plus株式会社 / arpena1pay
SRE / エンジニア組織: 11名〜50名
よく見られているレビュー
atama plus株式会社 / arpena1pay
SRE / エンジニア組織: 11名〜50名
レビューしているツール
目次
- アーキテクチャ
- 導入の背景・解決したかった問題
- 活用方法