「達人が教えるwebパフォーマンスチューニング」をハンズオンで進めようとした際の環境構築のために行ったことを紹介します。
お手元に書籍をご準備いただくと、コンテキストがより理解しやすくなります。
今回は、環境構築編です。
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の取得)
- スポットインスタンスのリクエスト
- 画面ぽちぽち
- 動作確認
- インスタンスの起動確認
- セッションマネージャを使って接続
- アプリ画面の表示確認
手順詳細
それでは手順の詳細に入っていきます。
事前準備
Elastic IPの作成(Public IPの取得)
EC2 > ネットワーク & セキュリティ > Elastic IPから
EIPを割り当てておきます。
IAMインスタンスプロフィールの作成
参考
- https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/systems-manager-setting-up.html
- https://dev.classmethod.jp/articles/ssm-session-manager-from-ec2-console-01/(公式ではないものの分かりやすいです)
IAM > Role > ロールを作成
スポットインスタンスのリクエスト
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パフォーマンスチューニングの実戦に沿って、アプリの環境構築をしました。
続きの設定が知りたい方は、以下をご覧ください。
終わったら、EC2インスタンス等は削除しましょう。
ここまで見ていただきありがとうございました。