private-isuを解くための環境構築

# はじめに

[private-isu](https://github.com/catatsuy/private-isu)を解くのに競技用インスタンスとベンチマークインスタンスを立ち上げて透過設定してとやることが色々あり、若干つまづいたので備忘録として残す。

# 競技用インスタンス

EC2を作成していく。

![スクリーンショット 2024-07-07 13.04.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299962/276cc06c-b6d7-2aea-3d3b-42d9c4f98a86.png)

[README](https://github.com/catatsuy/private-isu/)にある競技者用インスタンスのx86_64版のAMIを検索。

![スクリーンショット 2024-07-07 13.06.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299962/ca1fcf4e-292e-e617-1dd6-5a49d5c9efbf.png)

コミュニティAMIの欄にある(1)ので選択(2)。

![スクリーンショット 2024-07-07 13.08.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299962/42e39a42-1725-8ba3-2dec-1b4452afca48.png)

本にある通り、インスタンスタイプは `C6i.large` を選択。

![スクリーンショット 2024-07-07 13.13.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299962/1b657424-e511-ecc0-04af-f6b65022e235.png)

新しいキーペアを選択。

![スクリーンショット 2024-07-07 13.14.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299962/3f8099cf-46d6-c281-c8e2-b9a2f7df37d5.png)

こんな感じでキーペアを作成。

![スクリーンショット 2024-07-07 13.14.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299962/f88b3dd5-5fc8-8062-6fe7-92488bd92f53.png)

ネットワーク設定でSGを作成する。

![スクリーンショット 2024-07-07 13.15.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299962/7017ecb4-1cf9-4812-a0a2-90c2d224d024.png)

こんな感じで設定(他はデフォルトのまま)。

![スクリーンショット 2024-07-07 13.18.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299962/4d683af2-b9a6-300f-b967-c64fded74c0f.png)

インスタンスを起動。

![スクリーンショット 2024-07-07 13.20.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299962/265f7316-f3cf-5272-82a1-aa6b58de8599.png)

少し時間が経ってからパブリック IPv4 アドレスに **httpで** アクセス。

![スクリーンショット 2024-07-07 13.23.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299962/88b63127-b1c6-5373-c6d9-83b57aecca6e.png)

こんな感じのが表示されれば勝ち。

![スクリーンショット 2024-07-07 13.26.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299962/8a567e79-ac2e-0cb1-aefb-2fba6bc6a12f.png)

# ベンチマークインスタンス

競技用インスタンスと同じようにEC2を作成。
AMIは[README](https://github.com/catatsuy/private-isu)のベンチーマーカーのx86_64を選択。

![スクリーンショット 2024-07-07 13.32.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299962/043bb7b5-3eb6-019b-eb6f-e0dbb70b6976.png)

インスタンスタイプはこれまた本にある通り`C6i.xlarge`。

![スクリーンショット 2024-07-07 13.33.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299962/406f6cc2-ea3b-8ae4-b6f8-7fb2648e6f7c.png)

キーペアはさっきつくったやつ使い回す。

![スクリーンショット 2024-07-07 13.34.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299962/47748667-679f-95d6-a56b-a55af63dd371.png)

SGもさっき作ったやつ使い回す。

![スクリーンショット 2024-07-07 13.35.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299962/fa5f26af-4952-9468-33cd-c5b1a6742a01.png)

これでインスタンスを作成。

## SGの透過

ベンチマークインスタンスから競技用インスタンスにリクエストを投げるので、競技用インスタンスにベンチマークインスタンスからのリクエストを透過する設定を入れなければならない。

セキュリティグループを選択

![スクリーンショット 2024-07-07 13.37.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299962/07c3dc77-44ed-cd7c-e556-2e367337b0df.png)

さっきつくったSGのインバウンドルールを編集。

![スクリーンショット 2024-07-07 13.38.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299962/e685f9d5-8c50-24ae-76bb-31d28d832b53.png)

サブネットマスク32の **ベンチマークインスタンスの** IPをソースにしたHTTPを追加。

![スクリーンショット 2024-07-07 14.01.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299962/de319638-499b-70ec-8863-e0847f83b0f6.png)

# ベンチマークを走らせる

SSHが叩ける前提で記載。
作ったpemファイルに権限を付与。

```sh
chmod 400 /path/to/my-private-isu-key.pem
```

ベンチマークの方にSSH接続

`ec2-xxx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com`　はベンチマークインスタンスのパブリック IPv4 DNSを入れる。

![スクリーンショット 2024-07-07 13.47.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299962/5a83eb36-f681-1f0e-1ea3-761860633534.png)

```sh
ssh -i /path/to/my-private-isu-key.pem ubuntu@ec2-xxx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com
```

入れたら[README](https://github.com/catatsuy/private-isu)にある通り、下記の通りに叩く。

```sh
$ sudo su - isucon
$ /home/isucon/private_isu.git/benchmarker/bin/benchmarker -u /home/isucon/private_isu.git/benchmarker/userdata -t http://<競技用インスタンスのIP>
```

こんなのが出たら勝ち。

```json
{
  "pass":true,
  "score":664,
  "success":609,
  "fail":2,
  "messages":[
    "リクエストがタイムアウトしました (POST /login)",
    "リクエストがタイムアウトしました (POST /register)"
  ]
}
```

# 後片付け

依存関係があるので順番に消す。

1. EC2
    インスタンスの状態を「インスタンスを終了」にする
    - 競技用インスタンス
    - ベンチマーク用インスタンス
1. SG
1. キーペア

# 終わりに

画像が黒塗りだらけでSCPみたいになってる。

# 参考

- [ISUCON本で初めてのパフォーマンスチューニングに挑戦してみた](https://qiita.com/kaito_399/items/e1d8a383bacd534db641)
- [達人が教えるWebパフォーマンスチューニング](https://gihyo.jp/book/2022/978-4-297-12846-3)
- [tatsujin-web-performance](https://github.com/tatsujin-web-performance/tatsujin-web-performance)