private-isuを動かす

[private-isu](https://github.com/catatsuy/private-isu)をEC2で立ち上げ、ベンチマークを動かすまでの手順です。
詰まった箇所が何箇所かあったので書いておきます！

## EC2インスタンスの起動

まずは、アプリケーションとベンチマーカーの実行環境の用意です。
private-isuの[README](https://github.com/catatsuy/private-isu?tab=readme-ov-file#ami)に書いてあるAMIを使うことで、簡単にEC2インスタンスを起動できます。

インスタンスは、以下の2つを起動します。
1. 競技者用インスタンス
1. ベンチマーカー用インスタンス

### 競技者用インスタンスの起動

READMEに書いてある、以下のAMIを使います。
![競技者用インスタンスのAMI](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80170/06417d48-2cf9-315d-1e35-c97d92aba6ec.png)
自分は x86_64 用のものを使いました。

`AMI ID`のリンクをクリックすると、AWSコンソールが開きます。
リージョンが`東京`になっていることを確認し、`AMIからインスタンスを起動`します。
![リージョンの確認と、AMIからインスタンスを起動ボタン](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80170/462c50b4-df60-22c3-7455-8c0813884e7f.png)

`Launch an instance` の画面が開き、インスタンスの設定を行えます。

- 名前とタグ
    - 自由に設定できる、インスタンス名の設定です
    - 自分は`private-isu`にしました
- アプリケーションおよび OS イメージ (Amazon マシンイメージ) 
    - すでに、AMIが設定されているはずです。変更不要です
- インスタンスタイプ
    - マシンスペックを選べます
    - デフォルトでは、無料枠のt2.microが選ばれています
    - 有料になってしまいますが、READMEでは`c7a.large`が推奨されています
    - 自分は、参考書籍[^1]で使用されていた、`c6i.large`にしました
- キーペア (ログイン) 
    - ログインするための鍵の設定です
    - 自分は新しくキーペアを作成しました
        - rsa形式で、pemファイルを選びました
        - キー名は自由ですが、そのままファイル名になるので、スペースや特殊文字は入れないことをおすすめします
        - 作成時にダウンロードされたpemファイルは、`~/.ssh/`に置くのがおすすめです
- ネットワーク設定 
    - 右上の`編集`を押すと、詳細まで編集できるようになります!
    - VPC、サブネット、パブリック IP の自動割り当て
        - デフォルトのままでOKです
    - ファイアウォール (セキュリティグループ)
        - 今回は新規作成することにしました
    - セキュリティグループ名
        - 自由に設定できます
        - 自分はとりあえず、`private-isu`にしました
    - インバウンドセキュリティグループのルール
        - ssh（ポート22）
            - 念の為、`ソースタイプ`から`自分のIP`を選んで、外部からのアクセスを防いでおきます
        - HTTP（ポート80）
            - デフォルトでは設定がないので、`セキュリティグループルールの追加`から追加してください
            - `タイプ`で`HTTP`を選択
            - READMEに書いてあるとおり競技者用インスタンスは公開する必要があるので、`ソースタイプ`は`任意の場所`にしてください
- ストレージを設定
    - デフォルトのままでOKです

以上で設定は終わりです！
右のメニューから、`インスタンスを起動`しましょう！!
![インスタンスを起動ボタン](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80170/be1e8d06-8cf3-396d-fbce-812427a04b95.png)


### ベンチマーカー用インスタンスの起動

READMEに書いてある、以下のAMIを使います。
![ベンチマーカー用インスタンスのAMI](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80170/93f1b4fd-0e8c-5535-d8d2-ca1a91c2f383.png)
自分は、競技者用インスタンスと合わせて、x86_64 用のものを使いました。

`AMI ID`のリンクを踏むと、AWSコンソールが開きます。
こちらも、リージョンが`東京`になっていることを確認し、`AMIからインスタンスを起動`します。
![リージョンの確認と、AMIからインスタンスを起動ボタン](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80170/462c50b4-df60-22c3-7455-8c0813884e7f.png)

`Launch an instance` の画面が開き、インスタンスの設定を行えます。

- 名前とタグ
    - 自由に設定できる、インスタンス名の設定です
    - 自分は`private-isu-benchmarker`にしました
- アプリケーションおよび OS イメージ (Amazon マシンイメージ) 
    - すでに、AMIが設定されているはずです。変更不要です
- インスタンスタイプ
    - マシンスペックを選べます
    - デフォルトでは、無料枠のt2.microが選ばれています
    - 有料になってしまいますが、READMEでは`c7a.xlarge`が推奨されています
    - 自分は、参考書籍[^1]で使用されていた、`c6i.xlarge`にしました
- キーペア (ログイン) 
    - ログインするための鍵の設定です
    - 自分は、競技者用インスタンスで使ったキーペアを選びました
- ネットワーク設定 
    - 右上の`編集`を押すと、詳細まで編集できるようになります!
    - VPC、サブネット、パブリック IP の自動割り当て
        - デフォルトのままでOKです
    - ファイアウォール (セキュリティグループ)
        - 今回は新規作成することにしました
    - セキュリティグループ名
        - 自由に設定できます
        - 自分はとりあえず、`private-isu-benchmarker`にしました
    - インバウンドセキュリティグループのルール
        - ssh（ポート22）
            - 念の為、`ソースタイプ`から`自分のIP`を選んで、外部からのアクセスを防いでおきます
        - ベンチマーカー用インスタンスでは、HTTP（ポート80）の設定は不要です
- ストレージを設定
    - デフォルトのままでOKです

以上で設定は終わりです！
右のメニューから、`インスタンスを起動`しましょう！!
![インスタンスを起動ボタン](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80170/be1e8d06-8cf3-396d-fbce-812427a04b95.png)

### 起動の確認

EC2のインスタンス一覧から、実行中のインスタンスを確認できます。
起動に数分時間がかかることもありますが、少し待てば、競技者用インスタンスとベンチマーカー用インスタンスが起動したことを確認できると思います！

![インスタンス一覧](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80170/da9a4f78-b040-925b-03de-66caf7dcbbee.jpeg)

## サービスの確認

立ち上がったwebサービスをブラウザで見てみましょう。

### IPアドレスの確認

EC2のインスタンス一覧から、競技用インスタンスの`インスタンス ID`をクリックすると、インスタンスの詳細が開けます。
詳細画面にある`パブリック IPv4 アドレス`をコピーしてください。
（アドレスの左にあるアイコンをクリックすれば、クリップボードにコピーされます）

### ブラウザでのサービス確認

確認したパブリックIPアドレスに、ブラウザでアクセスしてみましょう

```
http://<コピーしたパブリックIPv4アドレス>/
```

Iscogramと表示されたページが見られれば成功です！
![Iscogram](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80170/5d4ee665-1f22-608e-2247-22ff1d1b2fb2.png)


## SSH接続

立ち上がったEC2インスタンスに、SSHで入ってみましょう。

### .pemファイルを使ったSSH接続

ターミナルを開いて、SSH接続してみましょう！

コマンドは、以下のとおりです
```shell
ssh -i <.pemファイルのファイルパス> ubuntu@<競技用インスタンスのパブリックIPv4アドレス>
```

途中でfingerprintの確認で`Are you sure you want to continue connecting`と聞かれたら、`yes`と答えましょう。

自分の場合、以下のエラーでsshに失敗してしまいました。
```
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0644 for '/Users/<ユーザー名>/.ssh/<キーペア名>.pem' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "/Users/<ユーザー名>/.ssh/<キーペア名>.pem": bad permissions
```
このときは、以下のコマンドで.pemファイルのアクセス権を抑えておくとよいでしょう。
```shell
chmod 600 ~/.ssh/<キーペア名>.pem
```

これで、sshで入れたかと思います！

同じ手順で、ベンチマーカー用インスタンスにもsshできることを確認しておきましょう。


## ベンチマーカーを実行する

READMEに書いている手順で、ベンチマーカーを走らせてみましょう

```shell
sudo su - isucon
/home/isucon/private_isu.git/benchmarker/bin/benchmarker -u /home/isucon/private_isu.git/benchmarker/userdata -t http://<競技用インスタンスのパブリックIPv4アドレス>
```

表示の更新はないですが、実行が終わるまでしばらく待ちましょう。

自分はこの時点で、このような結果になりました。
```shell
$ /home/isucon/private_isu.git/benchmarker/bin/benchmarker -u /home/isucon/private_isu.git/benchmarker/userdata -t http://<競技用インスタンスのパブリックIPv4アドレス>
{"pass":true,"score":625,"success":567,"fail":2,"messages":["リクエストがタイムアウトしました (POST /login)"]}
```

初期時点でのスコアは`625`でした。
567のHTTPリクエストが成功し、2つのリクエストが失敗したようですね。
失敗の原因は、タイムアウトのようです。

以上で、ベンチマーカー実行まで行うことができました！
以降は、競技者用インスタンスで計測・改善を行うフェイズとなります！

## 参考文献

### private-isu リポジトリ
https://github.com/catatsuy/private-isu

起動の方法などが詳しくREADMEにかかれています。
また、sshログインの方法は[manual.md](https://github.com/catatsuy/private-isu/blob/master/manual.md)に説明があります。

### 達人が教えるWebパフォーマンスチューニング 〜ISUCONから学ぶ高速化の実践

https://amzn.asia/d/2OVw0So

起動方法の説明だけでなく、その後の計測・チューニングなどのテクニックが豊富に紹介されています。


[^1]:[達人が教えるWebパフォーマンスチューニング 〜ISUCONから学ぶ高速化の実践](https://amzn.asia/d/2OVw0So) 付録A章 private-isuの攻略実践 A-1 用意した競技環境