技術(tech)

達人が教えるwebパフォーマンスチューニングの実戦 – ハンズオン環境構築

「達人が教えるwebパフォーマンスチューニング」をハンズオンで進めようとした際の環境構築のために行ったことを紹介します。

お手元に書籍をご準備いただくと、コンテキストがより理解しやすくなります。

達人が教えるWebパフォーマンスチューニング ~ISUCONから学ぶ高速化の実践 [ 藤原 俊一郎 ]

created by Rinker

 

今回は、環境構築編です。
ISUCONの題材となっているチューニング対象のアプリケーションをAWSに立てます。
※ AWSの無料枠で利用可能なt系インスタンスを利用していないため、課金が発生します。

本記事を参考に環境構築を行い、課金が発生したとしても責任は取れません。

また、セキュリティの設定不備による、不正アクセス等の発生も同様です。
公開範囲には細心の注意を払ってください。

 

想定する読者

 

  • パフォーマンスチューニングを試したい人
  • ISUCONの環境構築をさくっと終わらせたい人

 

この記事で得られること

 

パフォーマンスチューニング対象となるアプリケーションの環境構築方法

 

前提

 

  • リポジトリ:https://github.com/catatsuy/private-isu
  • 節約のために、EC2インスタンスはスポットインスタンスを利用する
  • AWSアカウントは作成済
  • EC2インスタンスはデフォルトVPC上へ構築する
  • AWSはTokyoリージョン前提
    (他のリージョンだとISUCON用のAMIが見つからないかもです)

 

手順

環境構築手順を記載いたします。

完了条件

以下の動作確認が取れれば、本記事で紹介する環境構築は完了です。

  • スポットインスタンスでEC2インスタンスが起動していること
  • セッションマネージャーを使って、EC2インスタンスに接続できること
  • Public IPを叩いて、アプリケーション画面が表示されること

 

手順概要

ざっくりとした手順の概要は以下の通りです。

  • 事前準備
    • Elastic IPの作成(Public IPの取得)
      → ローカルPCからアプリにアクセスするため
    • IAMインスタンスプロフィールの作成
      → セッションマネージャーを使って、EC2インスタンスに接続するため
  • スポットインスタンスのリクエスト
    • 画面ぽちぽち
  • 動作確認
    • インスタンスの起動確認
    • セッションマネージャを使って接続
    • アプリ画面の表示確認

 

手順詳細

それでは手順の詳細に入っていきます。

事前準備

Elastic IPの作成(Public IPの取得)

参考:https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/elastic-ip-addresses-eip.html#working-with-eips

EC2 > ネットワーク & セキュリティ > Elastic IPから

EIPを割り当てておきます。

 

IAMインスタンスプロフィールの作成

参考

IAM > Role > ロールを作成

AmazonEC2RoleforSSMのポリシーを追加します。
Role名は何でもいいです。performanceTestRoleとかにしておきます。
これで事前準備はおしまいです。あとはEC2インスタンスを立てるだけなので楽。

スポットインスタンスのリクエスト

 

EC2 > スポットリクエスト > スポットインスタンスのリクエスト

基本はデフォルトのままで、変更するところだけ説明します。

競技者用のAMIを指定します。
リージョンが東京になっていないと、AMIが出てこないのでご注意を。
AMI:ami-08ece261e7317422f
参考:https://github.com/catatsuy/private-isu

追加の起動パラメータ  オプションを開いて、

先ほど作成したEIPを紐づけるために「有効化」を選択。
IAMインスタンスプロフィールには「PerformanceTestRole」を選択。

EIPを作成したばかりだと、「有効化」が選べない場合もあります。

その場合は、EC2インスタンスを作成後、EIPと紐付けます。

そしたら、インスタンスタイプを選びます。
書籍の中ではバーストタイプのt系は推奨されていませんでした。

2コアのC5.largeあたりが推奨されていました。
お試しで使うだけであれば、安いやつを選べばいいと思います。

諸々入力し終えたら、「作成」を押してスポットインスタンスをリクエストします。

数分待てば、インスタンスが起動し始めます。
(都合のいいインスタンスが存在しない場合、起動しませんが…)

動作確認

 

インスタンスの起動確認

EC2のコンソールから起動を確認します。

セッションマネージャを使って接続

 

EC2 > インスタンス > インスタンスに接続

セッションマネージャーを選択。「接続」を押して、プロンプト画面が開けばOKです。

 

アプリ画面の表示確認

作成したEC2インスタンスのパブリック IPv4 アドレスを確認します。

ブラウザで叩いてみます。
Iscogramの画面が開けば完了です。

セキュリティグループのインバウンドの設定上、外のIPからの通信を許可していない場合、
上記画面が表示されません。

EC2インスタンスに紐づいているセキュリティグループの設定を変更しましょう。
自宅のIPアドレスのみ、HTTP通信(80番Port)を許可する設定にするなりして、穴を開けてください。(全てのIPからの通信を許可する設定にはしないこと)

ここまででアプリケーションの初期設定は完了です。
(ベンチマーカーの設定などもありますが、まずはここまで)

 

おまけ

上記の設定を、毎回ぽちぽちして、使い終わったら削除するのも面倒です。

Terraformからリソースを作成、削除できるようにすると楽です。

サンプルのコードとしては以下の通り。

provider "aws" {
  region = "ap-northeast-1"
}

resource "aws_iam_role" "performance_test_role" {
  name = "performance_test_role"
  path = "/"

  assume_role_policy = <<EOF
{
  "Version": "2012-10-17",
  "Statement": [
      {
          "Action": "sts:AssumeRole",
          "Effect": "Allow",
          "Principal": {
            "Service": "ec2.amazonaws.com"
          }
      }
  ]
}
EOF
}

resource "aws_iam_role_policy_attachment" "performance_test_attach" {
  role       = aws_iam_role.performance_test_role.name
  policy_arn = "arn:aws:iam::aws:policy/service-role/AmazonEC2RoleforSSM"
}

resource "aws_iam_instance_profile" "performance_test_profile" {
  name = "performance_test_profile"
  role = aws_iam_role.performance_test_role.name
}

resource "aws_spot_instance_request" "performance_test_instance" {
  ami = "ami-06c39e451ff9930db" // https://github.com/catatsuy/private-isu
  instance_type = "c5.large"
  spot_price    = "0.036"
  // スポット価格から外れても、インスタンスが削除ではなく、停止するようにしておく(後から再度起動できるように)
  instance_interruption_behavior = "stop"
  spot_type = "persistent"

  iam_instance_profile = aws_iam_instance_profile.performance_test_profile.name

  tags = {
    Name = "performance_test"
  }
}

resource "aws_eip" "performance_test_eip" {
  instance = aws_spot_instance_request.performance_test_instance.spot_instance_id
  vpc      = true

  depends_on = [aws_spot_instance_request.performance_test_instance]
}

output "performance_test_instance_id" {
  value = aws_spot_instance_request.performance_test_instance.id
}

output "performance_test_spot_instance_id" {
  value = aws_spot_instance_request.performance_test_instance.spot_instance_id
}

 

まとめ

今回は、達人が教えるwebパフォーマンスチューニングの実戦に沿って、アプリの環境構築をしました。

達人が教えるWebパフォーマンスチューニング ~ISUCONから学ぶ高速化の実践 [ 藤原 俊一郎 ]

created by Rinker

続きの設定が知りたい方は、以下をご覧ください。

Webパフォーマンスチューニングのために必要なログの設定やコマンド準備Webパフォーマンスチューニングの準備と環境構築を効率的に行うためのステップを提供。Linux EC2インスタンスの設定、Session Managerのシェル変更、Homebrewのインストール、必要なコマンドのインストール、ログの出力設定(nginxおよびMySQLの設定変更)など詳細な手順を説明。パフォーマンスチューニングに備えるための実践的なガイド。...

終わったら、EC2インスタンス等は削除しましょう。

ここまで見ていただきありがとうございました。