
AWS CDK で Graviton EC2 に k6 負荷テスト環境を構築する
製造ビジネステクノロジー部の小林です。
負荷テストツールとして人気の k6 ですが、今回は AWS CDK を使って負荷テスト用の EC2 インスタンス環境を構築してみました。
UserData でシェルスクリプトを実装することで、EC2 起動時に k6 の実行環境が自動でセットアップされます。毎回手動でインストールするを省けて便利です。
前提条件
- インフラ構築:AWS CDK(TypeScript)
- OS:Amazon Linux 2023
- EC2 インスタンスタイプ:T4G.MEDIUM(ARM64)
- EC2 への接続:EC2 Instance Connect
やってみた
プロジェクト構成
今回のプロジェクト構成は以下のとおりです。
k6-test/
├── bin/
│ └── k6-test.ts
├── lib/
│ ├── k6-test-stack.ts # CDKスタック定義
│ └── init.sh # UserDataスクリプト
└── package.json
EC2 インスタンスの実装
Graviton プロセッサを搭載した EC2 インスタンスを作成します。
// init.shを読み込み
const userDataScript = fs.readFileSync(path.join(__dirname, "init.sh"), "utf8");
const userData = ec2.UserData.forLinux();
userData.addCommands(userDataScript);
// EC2インスタンスの作成
new ec2.Instance(this, "K6Instance", {
vpc,
vpcSubnets: {
subnetType: ec2.SubnetType.PRIVATE_WITH_EGRESS,
},
instanceType: ec2.InstanceType.of(
ec2.InstanceClass.T4G,
ec2.InstanceSize.MEDIUM
),
machineImage: ec2.MachineImage.latestAmazonLinux2023({
cpuType: ec2.AmazonLinuxCpuType.ARM_64,
}),
securityGroup: instanceSecurityGroup,
userData,
});
userData の実装
EC2 インスタンス起動時に実行される初期化スクリプトです。k6 と TypeScript 環境を自動でセットアップします。
#!/bin/bash
set -e
# ============================================
# k6のインストール (ARM64対応)
# ============================================
# k6の公式 RPM は x86_64 のみに対応しているため、ARM64 ではバイナリを直接ダウンロードする
K6_VERSION=$(curl -s https://api.github.com/repos/grafana/k6/releases/latest | grep -o '"tag_name": "[^"]*' | cut -d'"' -f4)
curl -L "https://github.com/grafana/k6/releases/download/${K6_VERSION}/k6-${K6_VERSION}-linux-arm64.tar.gz" -o /tmp/k6.tar.gz
tar -xzf /tmp/k6.tar.gz -C /tmp
mv /tmp/k6-${K6_VERSION}-linux-arm64/k6 /usr/local/bin/k6
chmod +x /usr/local/bin/k6
rm -rf /tmp/k6.tar.gz /tmp/k6-${K6_VERSION}-linux-arm64
# ============================================
# Node.jsのインストール
# ============================================
# TypeScript 環境を構築するために必要な Node.js と npm をインストール
dnf install -y nodejs npm
# ============================================
# プロジェクトのセットアップ
# ============================================
PROJECT_DIR="/home/ec2-user/k6-project"
mkdir -p "$PROJECT_DIR"
cd "$PROJECT_DIR"
# package.json のセットアップ
npm init -y
# TypeScript 開発に必要なライブラリをインストール
npm install --save-dev typescript @types/k6 esbuild
# ビルドスクリプトの設定
# esbuild を使って TypeScript を k6 で動く JavaScript (ES2015) に変換
npm pkg set scripts.build="esbuild *.ts --bundle --target=es2015 --platform=node --outdir=dist --external:k6 --external:k6/*"
# ============================================
# 権限修正
# ============================================
# UserDataはroot権限で実行されるため、ec2-userがアクセスできるように所有者を変更
chown -R ec2-user:ec2-user "$PROJECT_DIR"
ARM64 での k6 インストールについて
x86_64 環境であれば、k6 の公式 RPM リポジトリを使って簡単にインストールできます。
x86_64 の場合
dnf install -y https://dl.k6.io/rpm/repo.rpm
dnf install -y k6
しかし、今回使用している Graviton(ARM64)では、公式 RPM リポジトリが対応していないため、GitHub Releases から直接バイナリをダウンロードしてインストールする必要がありました。
TypeScript 環境について
k6 は JavaScript で動作しますが、TypeScript で書くことで型補完やエラーチェックの恩恵を受けられます。今回セットアップしたライブラリは以下のとおりです。
- typescript:TypeScript のコンパイラ
- @types/k6:k6 の型定義
- esbuild:TypeScript を k6 互換の ES2015 にトランスパイル
以上で準備が完了しました。以下のコマンドでデプロイします。
pnpx cdk deploy
動作確認
デプロイが完了したら、実際に k6 が正しくセットアップされているか確認していきます。
k6 のインストール確認
まず、EC2 インスタンスに接続し、k6 がインストールされていることを確認します。
$ k6 --version
k6 v1.5.0 (commit/7961cefa12, go1.25.5, linux/arm64)

linux/arm64 と表示されており、Graviton 環境で正しく動作していることが確認できました。
テストスクリプトの作成
続いて、TypeScript でテストスクリプトを作成し、実行してみます。
$ cd k6-project

test.ts を作成します。
$ vi test.ts
以下のように実装します。
import http from "k6/http";
import { check, sleep } from "k6";
export const options = {
vus: 10,
duration: "30s",
};
export default function () {
const res = http.get("https://test.k6.io");
check(res, {
"status is 200": (r) => r.status === 200,
});
sleep(1);
}

このスクリプトは、10 人の仮想ユーザーが 30 秒間、k6 のテストサイトにリクエストを送信するシンプルな負荷テストです。
ビルドの実行
実装したテストファイルをビルドします。
$ npm run build
> k6-project@1.0.0 build
> esbuild *.ts --bundle --target=es2015 --platform=node --outdir=dist --external:k6 --external:k6/*
dist/test.js 1.9kb
⚡ Done in 3ms

esbuild により、わずか 3ms でビルドが完了しました。
テストの実行
それでは、実際に k6 のテストを実行します。
k6 run dist/test.js
k6 が実行されました。

実行結果
テストが正常に完了しました!🎉
結果のサマリーから、リクエスト数やレスポンスタイムなどの詳細なメトリクスを確認できます。


おわりに
今回は AWS CDK を使って、Graviton(ARM64)ベースの k6 負荷テスト環境を構築しました。
UserData による自動セットアップを設定することで、EC2 起動時に k6 + TypeScript 環境が自動で構築されます。インスタンスに接続したらすぐにテストを書き始められるのは便利ですね!
この記事がどなたかの参考になれば幸いです。








