AWSでJmeter分散負荷試験環境構築めも

# AWSでJmeter分散負荷試験環境構築

## 目的： 
汎用的なJmeter負荷試験環境
AWSのAutoscale機能を利用し、試験必要なときのみJmeterSlaveサーバを自動作成し、Masterへの登録も自動化させる。

## 構成：
コントローラ  ：　Windows2012 R2 64bit 1台（m3.medium以上）
Slaveサーバ：  AmazonLinux 64bit    Autoscaleグループで自動作成（m3.medium以上）

## 手順：
###１、Slaveサーバ作成用AMI構築

①AmazonLinux最新版
②Javas64ビット最新版
③Jmeter最新版ダウンロードし、/opt/opt/apache-jmeter配下配置
④システムパラメータチューニング
/etc/security/limits.conf
<pre><code>
root soft nofile 65535
root hard nofile 65535
</code></pre>
⑤Jmeter起動パラメータチューニング
 HEAP="-Xms2048m -Xmx2048m"  <-インスタンスタイプによる調整
 以下の行をコメントアウト
 DUMP="-XX:+HeapDumpOnOutOfMemoryError"
⑥jmeterブート時自動起動
/etc/rc.localに以下を設定：
<pre><code>
 #rmiサーバ設定（java.rmi.server.hostname＝自身のPrivateIP)
 PIV_IP=$(curl http://169.254.169.254/latest/meta-data/local-ipv4/)
 sed -i -e "s/^RMI_HOST_DEF=-Djava.rmi.server.hostname=.*/RMI_HOST_DEF=-Djava.rmi.server.hostname=${PIV_IP}/" /opt/apache-jmeter/bin/jmeter-server
/bin/bash -l /opt/apache-jmeter/bin/jmeter-server &
</code></pre>

⑦AMI作成（略）

## ２、Autoscaleグループ作成
AWSコンソールで作成(略)
例：asg01-jmeter-common

## ３、Jmeterマスタの構築
 Windwos2012 R2 64bit
* AutoscaleのDescribe権限、EC2のDescribe権限、Slaveサーバをマスタで自動作成する場合、Autoscaleのupdate権限をIAMRoleで付与

 ①AWSCLIダウンロードしインストール
  https://s3.amazonaws.com/aws-cli/AWSCLI64.msi
 ②jqのインストール
　ダウンロードしてからWindowsのシステムディレクトリに配置 
 ③Javaのインストール（64bit, Slaveと同じバージョン）
 ④Jmeterのダウンロード＆配置（Slaveと同じバージョン）
　Jmeterのインストール先：
　UserProfile配下の\Documents\apache-jmeter
 ⑤Jmeterパラメータチューニング

Powershellスクリプト作成し配置：
AWSCLIを利用してJmeterSlaveサーバのIP一覧を取得し、Jmeterの設定ファイルに自動設定

https://github.com/wanghm/orchestration_code/tree/master/utils

<pre><code>
Param ([string] $strRegion = "ap-northeast-1", `
	[string] $strJmeterAsgGroupName = "asg01-jmeter", `
	[int] $intInstanceCount = 2, `
	[string] $strJmeterConfig)


#default values of parameters
$strJmeterConfig = [environment]::getenvironmentvariable("userprofile") + "\Documents\apache-jmeter\bin\jmeter.properties"
$LOG_ENCODE = "Ascii"


# create jmeter slaves (update autoscale group)
function func_CreateSlaves()
{
	try {
	    aws autoscaling update-auto-scaling-group --auto-scaling-group-name $strJmeterAsgGroupName  `
	        --min-size $intInstanceCount --desired-capacity $intInstanceCount --region $strRegion
	} catch [Exception] {
	    $strErr = "Failed to create jmeter slaves"
		throw $strErr
	}
}

# set ip of jmeter slvaes into config file of jmeter
function func_UpdataSlaveIP()
{
    try {
     	# get ip list of jmeter slvaes
		$items = @(aws ec2 describe-instances --filters `
		"Name=tag:aws:autoscaling:groupName,Values=$strJmeterAsgGroupName" "Name=instance-state-name,Values=running"  --region $strRegion `
		| jq '.Reservations[].Instances[].PrivateIpAddress')

		$strIPList = ""
		foreach($item in $items)
		{
		    if($strIPList.CompareTo("") -eq 0) {
		        $strIPList  += $item
		    } else {
		        $strIPList  += "," + $item
		    }
		}

		$strIPList = $strIPList -replace "`"", ""
		$date = get-date -format yyyyMMdd
		$time = get-date -format HHmmss

		$strJmeterConfigBackup = $strJmeterConfig + $date + $time
		# backup the config file
		copy $strJmeterConfig $strJmeterConfigBackup

		# replace ips of slave server (^remote_hosts=.* -> remote_hosts=$strIPList)
		$strContent = $(Get-Content $strJmeterConfigBackup) -replace "^remote_hosts=.*","remote_hosts=$strIPList"
		Set-Content -path $strJmeterConfig -value $strContent -encoding String

	} catch [Exception] {
	    $strErr = "Failed to update jmeter config"
		throw $strErr
	}
}


#func_CreateSlaves
func_UpdataSlaveIP

</code></pre>