GatlingでCSVファイルからパラメータを取得して、APIサーバ経由でAuroraにデータ登録してみた

GatlingでCSVファイルからパラメータを取得して、APIサーバ経由でAuroraにデータ登録してみた

Clock Icon2024.10.07

こんにちは、ゲームソリューション部のsoraです。
今回は、GatlingでCSVファイルからパラメータを取得して、Auroraにデータ登録してみたことについて書いていきます。
主にGatling部分について書いていきます。

構成

簡易ですが構成は以下です。
EC2上のGatlingからECS(Fargate)上のAPIサーバを経由して、Aurora Serverlessへデータを登録します。
sr-gatling-feeder-arch

前提

APIサーバはECS(Fargate)で既に動作しているものとします。
APIサーバの構築については以下記事をご確認ください。
https://dev.classmethod.jp/articles/nodejs-orm-prisma-ecs-aurora/

Auroraでのテーブル作成

APIサーバからAurora Serverlessにデータを挿入するためのテーブルを作成します。
GatlingをインストールするインスタンスにMySQLクライアントをインストールして使用します。
使用するEC2インスタンスのOSはAmazon Linux 2023です。

# MySQLクライアントのインストール
sudo dnf -y localinstall  https://dev.mysql.com/get/mysql80-community-release-el9-1.noarch.rpm
sudo rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2023
sudo dnf -y install mysql mysql-community-client

# Auroraへの接続
mysql -h [Auroraエンドポイント] -P 3306 -u [ユーザ名] -p[パスワード]

# データベースの作成
CREATE DATABASE mydatabase;

# テーブルの作成
CREATE TABLE prefectures (
    id INT AUTO_INCREMENT PRIMARY KEY,
    prefecture VARCHAR(255),
    prefectural_capital VARCHAR(255)
);

Gatlingサーバの構築

EC2上にGatlingをインストールします。
私は元々あったインスタンスを使ったため3.11.5ですが最新は3.12.0でした。

wget https://repo1.maven.org/maven2/io/gatling/highcharts/gatling-charts-highcharts-bundle/3.11.5/gatling-charts-highcharts-bundle-3.11.5.zip
unzip gatling-charts-highcharts-bundle-3.11.5.zip
cp -r gatling-charts-highcharts-bundle-3.11.5 /home/ec2-user/gatling

作成したシナリオファイルは以下です。
Feederとシナリオは、読み取るCSVの数だけ書いています。
この辺りを配列やループを使って簡潔に書きたかったのですが、書き方が悪いのか上手くいかなかったため、一つずつ書いています。
queryParamにはCSVに記載している項目名を入れています。

/home/ec2-user/gatling/src/test/java/FeederSimulation.java
package simulation;

import io.gatling.javaapi.core.CoreDsl.*;
import io.gatling.javaapi.http.HttpDsl.*;
import io.gatling.javaapi.core.*;
import io.gatling.javaapi.http.*;
import java.time.Duration;

import static io.gatling.javaapi.core.CoreDsl.*;
import static io.gatling.javaapi.http.HttpDsl.*;

public class FeederSimulation extends Simulation {

    HttpProtocolBuilder httpProtocol = http
        .baseUrl("http://{APIサーバのIPアドレス}:3000")
        .acceptHeader("application/json");

    // 各CSVファイルをqueueモードで設定
    FeederBuilder.Batchable<String> feeder1 = csv("/home/ec2-user/gatling/src/test/java/csv/prefectures001.csv").queue();
    FeederBuilder.Batchable<String> feeder2 = csv("/home/ec2-user/gatling/src/test/java/csv/prefectures002.csv").queue();

    ScenarioBuilder scn1 = scenario("Scenario 1")
        .feed(feeder1)
        .exec(
            http("Request to API 1")
                .get("/feeder-test")
                .queryParam("prefecture", "#{prefecture}")
                .queryParam("prefectural_capital", "#{prefectural_capital}")
                .check(status().is(200))
        );

    ScenarioBuilder scn2 = scenario("Scenario 2")
        .feed(feeder2)
        .exec(
            http("Request to API 2")
                .get("/feeder-test")
                .queryParam("prefecture", "#{prefecture}")
                .queryParam("prefectural_capital", "#{prefectural_capital}")
                .check(status().is(200))
        );

    {
        setUp(
            scn1.injectOpen(constantUsersPerSec(1).during(Duration.ofSeconds(30))).andThen(
                scn2.injectOpen(constantUsersPerSec(1).during(Duration.ofSeconds(17)))
            )
        ).protocols(httpProtocol);
    }
}

feeder1feeder2は、queue()としているため、CSVを上から順に読み取って最後の行に行くと終了します。
そのため、それ以上の行を取得しようとするとエラーになります。
今回のコードではprefectures001.csvは30行分、prefectures002.csvは17行分のデータのみのため、その数に合わせて実行ユーザ数を調整しています。

        setUp(
            scn1.injectOpen(constantUsersPerSec(1).during(Duration.ofSeconds(30))).andThen(
                scn2.injectOpen(constantUsersPerSec(1).during(Duration.ofSeconds(17)))
            )
        ).protocols(httpProtocol);

queue()ではなく、circular()にすると最後の行まで行ったときに最初の行に戻る処理になります。

リクエストとして読み込ませるCSVは以下です。

prefectures001.csv
/home/ec2-user/gatling/src/test/java/csv/prefectures001.csv
prefecture,prefectural_capital,area
Hokkaido,Sapporo,Hokkaido
Aomori,Aomori,Tohoku
Iwate,Morioka,Tohoku
Miyagi,Sendai,Tohoku
Akita,Akita,Tohoku
Yamagata,Yamagata,Tohoku
Fukushima,Fukushima,Tohoku
Ibaraki,Mito,Kanto
Tochigi,Utsunomiya,Kanto
Gunma,Maebashi,Kanto
Saitama,Saitama,Kanto
Chiba,Chiba,Kanto
Tokyo,Tokyo,Kanto
Kanagawa,Yokohama,Kanto
Niigata,Niigata,Chubu
Toyama,Toyama,Chubu
Ishikawa,Kanazawa,Chubu
Fukui,Fukui,Chubu
Yamanashi,Kofu,Chubu
Nagano,Nagano,Chubu
Gifu,Gifu,Chubu
Shizuoka,Shizuoka,Chubu
Aichi,Nagoya,Chubu
Mie,Tsu,Kinki
Shiga,Otsu,Kinki
Kyoto,Kyoto,Kinki
Osaka,Osaka,Kinki
Hyogo,Kobe,Kinki
Nara,Nara,Kinki
Wakayama,Wakayama,Kinki
prefectures002.csv
/home/ec2-user/gatling/src/test/java/csv/prefectures002.csv
prefecture,prefectural_capital,area
Tottori,Tottori,Chugoku
Shimane,Matsue,Chugoku
Okayama,Okayama,Chugoku
Hiroshima,Hiroshima,Chugoku
Yamaguchi,Yamaguchi,Chugoku
Tokushima,Tokushima,Shikoku
Kagawa,Takamatsu,Shikoku
Ehime,Matsuyama,Shikoku
Kochi,Kochi,Shikoku
Fukuoka,Fukuoka,Kyushu
Saga,Saga,Kyushu
Nagasaki,Nagasaki,Kyushu
Kumamoto,Kumamoto,Kyushu
Oita,Oita,Kyushu
Miyazaki,Miyazaki,Kyushu
Kagoshima,Kagoshima,Kyushu
Okinawa,Naha,Kyushu

実行

準備したシナリオを実行します。

cd gatling
./mvnw gatling:test

実行後にAuroraにあるテーブルを確認してみると、データが登録されていることが確認できました。

mysql> SELECT * from prefectures;
+----+------------+---------------------+
| id | prefecture | prefectural_capital |
+----+------------+---------------------+
|  1 | Hokkaido   | Sapporo             |
|  2 | Aomori     | Aomori              |
|  3 | Iwate      | Morioka             |
|  4 | Miyagi     | Sendai              |
|  5 | Akita      | Akita               |
|  6 | Yamagata   | Yamagata            |
|  7 | Fukushima  | Fukushima           |
|  8 | Ibaraki    | Mito                |
|  9 | Tochigi    | Utsunomiya          |
| 10 | Gunma      | Maebashi            |
| 11 | Saitama    | Saitama             |
| 12 | Chiba      | Chiba               |
| 13 | Tokyo      | Tokyo               |
| 14 | Kanagawa   | Yokohama            |
| 15 | Niigata    | Niigata             |
| 16 | Toyama     | Toyama              |
| 17 | Ishikawa   | Kanazawa            |
| 18 | Fukui      | Fukui               |
| 19 | Yamanashi  | Kofu                |
| 20 | Nagano     | Nagano              |
| 21 | Gifu       | Gifu                |
| 22 | Shizuoka   | Shizuoka            |
| 23 | Aichi      | Nagoya              |
| 24 | Mie        | Tsu                 |
| 25 | Shiga      | Otsu                |
| 26 | Kyoto      | Kyoto               |
| 27 | Osaka      | Osaka               |
| 28 | Hyogo      | Kobe                |
| 29 | Nara       | Nara                |
| 30 | Wakayama   | Wakayama            |
| 31 | Tottori    | Tottori             |
| 32 | Shimane    | Matsue              |
| 33 | Okayama    | Okayama             |
| 34 | Hiroshima  | Hiroshima           |
| 35 | Yamaguchi  | Yamaguchi           |
| 36 | Tokushima  | Tokushima           |
| 37 | Kagawa     | Takamatsu           |
| 38 | Ehime      | Matsuyama           |
| 39 | Kochi      | Kochi               |
| 40 | Fukuoka    | Fukuoka             |
| 41 | Saga       | Saga                |
| 42 | Nagasaki   | Nagasaki            |
| 43 | Kumamoto   | Kumamoto            |
| 44 | Oita       | Oita                |
| 45 | Miyazaki   | Miyazaki            |
| 46 | Kagoshima  | Kagoshima           |
| 47 | Okinawa    | Naha                |
+----+------------+---------------------+
47 rows in set (0.00 sec)

最後に

今回は、GatlingでCSVファイルからパラメータを取得して、Auroraにデータ登録してみたことを記事にしました。
どなたかの参考になると幸いです。

この記事をシェアする

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.