🐊

k6をFargateで動かす選択肢

2025/02/10に公開

はじめに

Rehab for JAPANのSREの鈴木です。
皆さんは負荷試験はどのような環境で行っていますか

弊社では、昨今嬉しいことにユーザー数の増加によりサービスが成長しています。
嬉しい反面、1つの障害がユーザーやビジネスに与える影響がこれまでより大きくなってきています。
サービスの信頼性を保つために、通常のテストでは発見できない高負荷時に発見できるシステム課題を事前に検出・改善し、サービスの品質を維持することが重要なフェーズとなっています。
そこで、弊社は負荷試験ツールとしてk6を採用し、Fargate上で運用しています。
本記事では、k6をFargateで利用することにした理由・導入時の課題・効果についてご紹介します。

ターゲット

  • k6で負荷試験をやろうとしている方
  • テスト時にスクリプトの負荷条件を色々調整しながらテストを実行したい方
  • k8sまでの規模までは構築しないが、k6をコンテナで動かしたい方

要約

この記事では、k6をFargate上で動作させるメリットとその具体的な実装方法について詳しく解説します。
特に、柔軟なスクリプト修正が可能な点、そして運用負荷の低減について掘り下げます。

なぜk6の実行環境にFargateを選んだのか

k6の実行環境として考えられる選択肢には、k8s、Lambda、そしてECS/Fargateがありました。
それぞれにメリット・デメリットがありますが、以下の理由からFargateを選択しました。

k8s: 大規模テストに最適ですが、弊社の現在の規模やコスト面で過剰
Lambda: 軽量テストには向くものの、結果集計・ダッシュボードの自作が必要
Fargate (ECS): 小規模から中規模のテストに柔軟に対応。結果集計・ダッシュボード(ビルトイン有り)の自作は不要。コンテナ内で自由に負荷条件やスクリプトの変更をしながらテストが可能

構築時の課題と対応

課題

k6のコンテナはスクリプト実行後に停止する仕様です。また、ALB(Application Load Balancer)のHealthCheckで疎通できる常時解放されているポートが存在しません。
このため、HealthCheckを通過させることができず、コンテナがすぐに停止してしまう課題がありました。

対応

k6コンテナがすぐに停止する問題

k6のDockerfileに ENTRYPOINT ["/bin/sh"] を追加。これにより、コンテナが終了せず常駐する状態にする。

HealthCheckに利用できるポートが無い問題

k6コンテナ自体には受信ポートがないため、ALBのHealthCheckを直接受けられません。そこで、同じECSタスク内でNginxコンテナを起動し、NginxがHealthCheckのリクエストを受け付けるように設定しました。これにより、ALBからのHealthCheckが通り、タスクの健全性を保ちます。(Datadogコンテナに置き換えることも可)
k6自体が正常に起動しているかは、k6自身のヘルスチェックで担保しています。

環境構成図

k6への接続

ECS Execの活用

ECS Execを利用して、稼働中のコンテナ内に直接入り、必要な操作(負荷条件、スクリプトの修正、エラーログ確認など)が可能となります。
また、こちらの接続で一工夫していまして、通常ECS Execでの接続は[接続対象の情報を調べる]→[コマンドを作成]→[実行]という流れで実施します。
慣れている方では数分、慣れていない方だと数十分かかります。
この作業を自作したツールを利用し30秒ほどでECSに接続することができるようにしました。
ちなみに、一部の開発メンバーからは「神ツール」と言われています。

使ってみてよかった点

迅速なスクリプト修正

通常、負荷試験のスクリプト修正は「コード修正 → PR作成 → マージ → イメージ作成 → ECS更新」といった一連の工程が必要です。
しかし、Fargate上で稼働するコンテナに直接アクセスすることで、vi や他のエディタを使ってその場で修正が可能となります。
これにより、パラメーター変更・スクリプト修正などの工数を削減し、実施者のストレスを下げた負荷試験を実施することができました。

詳細なエラーログの取得

コンテナ内で直接ログを確認できるため、スクリプト実行中に発生したエラーを詳しく調査できます。

運用負荷の低減

Fargateは全開発チームで利用しており、ナレッジもある状態でしたので、学習コストを下げて負荷試験ツールを導入することができました。

まとめ

今回は、k6をFargateで動かす理由・導入時の課題・効果について紹介させていただきました。
弊社の規模感と負荷試験で想定するエンジニアの動きを考慮し、環境を構築しました。
負荷試験環境は今後も開発者が触りやすいようにブラッシュアップしていきます。

ここまで記事を読んでいただきありがとうございます。
最後に、一言だけ弊社の紹介をさせてください。
弊社は「歳を重ねることが 楽しみになる 社会の創造」を目指しているスタートアップです。
それを実現するために様々なサービスをリリース中です。
https://rehabforjapan.com/

Rehab Tech Blog

Discussion