メール送信時やPushを送る直前にインスタンスを増やしたい時など、特典の条件下でAutoScalingのポリシーを実行する。定期処理だけでなく、不定期な処理時でも利用可能なようにカスタマイズ。
あらかじめ、awsのコンソールでインスタンスの起動用、削除用のポリシーを作成しておく。
AutoScalingを操作するためのクラスを作成
/app/lib/aws/AutoScaling.php
<?php namespace Lib\Aws;
use Aws\Common\Aws;
use Aws\Common\Enum\Region;
use Aws\Ec2\AutoScalingClient;
use Aws\Ec2\Exception\AutoScalingException;
class AutoScaling
{
private $obj = null;
/**
* AWS SDK for PHP
* auto-scaling instance
*/
private function getInstance()
{
if (is_null($this->obj))
{
$this->obj = Aws::factory([
'key' => XXXXXXXXXXXXXX,
'secret' => XXXXXXXXXXXXXXXXXXXX,
'region' => Region::XXXXXXX
])->get('AutoScaling');
}
return $this->obj;
}
/**
* AutoScalingのインスタンス状況取得
*/
public function describeAutoScalingInstances()
{
$res = $this->getInstance()->describeAutoScalingInstances();
$list = [];
foreach ($res['AutoScalingInstances'] as $instances)
{
$list[$instances['AutoScalingGroupName']][] = $instances;
}
return $list;
}
/**
* 指定したAutoScalingグループ名のもののみ
*/
public function getListByGroupName($name)
{
return empty($this->describeAutoScalingInstances()[$name]) ? [] : $this->describeAutoScalingInstances()[$name];
}
/**
* AutoScalingのポリシーを送信
* @param $group:実行したいポリシーが属するAutoScalingGroup
* @param $policy:実行したいポリシー
*/
public function excutePolicy($group, $policy)
{
try {
$res = $this->getInstance()->executePolicy([
'AutoScalingGroupName' => $group,
'PolicyName' => $policy,
'HonorCooldown' => false,
]);
} catch (AutoScalingException $e) {
// echo $e->getMessage();
return false;
}
return true;
}
}
AutoScaling::excutePolicyを実行するとAutoScalingにポリシーを送信することができるので、定期処理や管理画面から実行するトリガーを設定すれば、簡単に任意のタイミングでインスタンスの増減を実現することができる。
起動中のインスタンスを取得することもできるので、起動中のインスタンスがないことを確認してからインスタンスを起動する、というようなことも可能。
プログラム例
public function execAutoScaling()
{
// 起動中の該当のASのインスタンスを取得
$instances = AutoScaling::getListByGroupName('xxxxxx');
// インスタンスを起動する条件を設定
if (hoge)
{
// 起動しているASのインスタンスがなければ起動
if (empty($instances))
{
if (!AutoScaling::excutePolicy(_AUTO_SCALING_GROUP_BATCH, _AUTO_SCALING_POLICY_ADD_2))
{
$this->_error('Instance boot error.');
}
}
}
// インスタンスを停止する条件を設定
elseif (huga)
{
// 起動しているASのインスタンスがあれば停止
if (!empty($instances))
{
if (!AutoScaling::excutePolicy(_AUTO_SCALING_GROUP_BATCH, _AUTO_SCALING_POLICY_DEL_2))
{
$this->_error('Instance stop error.');
}
}
}
}