こんにちは。CSチームの坂本です。
今回は、前回の「Nginx + WordPress ELB篇」の構成にプラスして、日々の運用が少し楽になるようなカイゼンを、AWSのサービスを使っておこないたいと思います。
現状は、3台のWebサーバーがELBの配下で動いています。
通常の運用ですと、1台がダウンしてしまった場合は、手動でサーバーを立ち上げる必要がありますが、AWSのサービス「Auto Scaling」を利用すれば、Webサーバーがダウンしてしまったときに手動でサーバーを立ち上げる必要がなくなります。
目次 1. はじめに 今回利用するAWSのサービスは「Auto Scaling」というAWSのサービスです。このサービスを使うことで「自動」で「常に同じ構成を保って運用」をおこなうことが可能になります。 2. 今回の構成 前回までの構成に「Auto Scaling」が加わります。 3. Auto Scalingとは? 「Auto Scaling」は、文字通り設定した内容によってEC2インスタンスを「自動でスケーリング」してくれるサービスです。 「負荷によってサーバーを増減させる」というのが、このサービスのよく知られた利用方法ですが、実際は今回のように「Webサーバーを常に同じ構成で運用したい」という場合にも使えます。 このサービスを利用すると、「問題のあるインスタンスを自動で新しいインスタンスと交換」してくれるので、3台の内1台がダウンしてしまった場合でも手動で何もおこなうことなく同じ構成で運用が続けられます。 イメージを掴むために、どのように設定をおこなうのかを実際に確認してみたいと思います。 4. AWS SDK for PHP 2 「Auto Scaling」は、GUIの管理画面「AWS Management Console」で操作できないサービスです。 そのため、「Auto Scaling Command Line Tool」や「SDK」で操作する必要があります。 今回はPHP用のSDKの新しい方のバージョンである、「AWS SDK for PHP 2」を利用して設定したいと思います。 まずは、「AWS SDK for PHP 2」のインストールからおこないます。 今回は、PEARを利用して「Amazon Linux」にインストールします。
/home/ec2-user/create_launch_configration.php
※1 デフォルトはEC2のStatusチェックです。ELBのヘルスチェックを利用すれば、前回と同じくPHP-FPMの終了でもインスタンスを交換してくれるので、今回はELBのヘルスチェックを利用しています。
/home/ec2-user/create_auto_scaling_group.php
目次 1. はじめに 今回利用するAWSのサービスは「Auto Scaling」というAWSのサービスです。このサービスを使うことで「自動」で「常に同じ構成を保って運用」をおこなうことが可能になります。 2. 今回の構成 前回までの構成に「Auto Scaling」が加わります。 3. Auto Scalingとは? 「Auto Scaling」は、文字通り設定した内容によってEC2インスタンスを「自動でスケーリング」してくれるサービスです。 「負荷によってサーバーを増減させる」というのが、このサービスのよく知られた利用方法ですが、実際は今回のように「Webサーバーを常に同じ構成で運用したい」という場合にも使えます。 このサービスを利用すると、「問題のあるインスタンスを自動で新しいインスタンスと交換」してくれるので、3台の内1台がダウンしてしまった場合でも手動で何もおこなうことなく同じ構成で運用が続けられます。 イメージを掴むために、どのように設定をおこなうのかを実際に確認してみたいと思います。 4. AWS SDK for PHP 2 「Auto Scaling」は、GUIの管理画面「AWS Management Console」で操作できないサービスです。 そのため、「Auto Scaling Command Line Tool」や「SDK」で操作する必要があります。 今回はPHP用のSDKの新しい方のバージョンである、「AWS SDK for PHP 2」を利用して設定したいと思います。 まずは、「AWS SDK for PHP 2」のインストールからおこないます。 今回は、PEARを利用して「Amazon Linux」にインストールします。
sudo su yum update yum install php php-pear pear list -a pear channel-update pear.php.net pear upgrade-all pear channel-discover pear.amazonwebservices.com pear channel-discover guzzlephp.org/pear pear channel-discover pear.symfony.com pear install aws/sdk pear list -aインストールが完了したら、アクセスキー、シークレットキー、使用するリージョン、といった最低限必要な情報を以下のファイルを編集して「default_settings」の部分に設定しておきます。 /usr/share/pear/AWSSDKforPHP/Aws/Common/Resources/aws-config.php
'default_settings' => array( 'params' => array( 'key' => 'XXXXXXXXXXXXXXXXXXXX', // アクセスキー 'secret' => 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX', // シークレットキー 'region' => 'ap-northeast-1', // リージョン ), ),これで、「AWS SDK for PHP 2」を利用するための最低限の設定が完了しました。 5. Auto Scalingの設定 次は、Auto Scalingの設定です。Auto Scalingの設定は「Auto Scalingの薄い説明書を作ってみた」にもあるように複雑ですが、今回の要件を満たすための設定はそんなに難しくありません。今回は、「起動条件(Launch Configration)」と「Auto Scalingグループ」だけ設定すればOKです。 はじめに、「起動条件(Launch Configration)」を設定するファイルを作成します。 起動条件は以下の表の内容を配列で設定しています。今回作成したコードを以下に載せましたので、配列以外の内容はそちらを参考にしてみてください。
内容 | キー名 | 今回の値 |
---|---|---|
起動条件名 | LaunchConfigurationName | wordpress_launch_configration |
インスタンスの起動に利用するAMIの ID | ImageId | ami-xxxxxxxx |
起動するインスタンスの セキュリティグループ | SecurityGroups | array('sg-xxxxxxxx') ※配列で設定 |
使用するインスタンスタイプ | InstanceType | t1.micro |
require 'AWSSDKforPHP/aws.phar'; use AwsCommonAws; use AwsAutoScalingExceptionAutoScalingException; $aws = Aws::factory('/usr/share/pear/AWSSDKforPHP/Aws/Common/Resources/aws-config.php'); try { $autoscaling = $aws->get('autoscaling'); // 配列で設定。上の表と同じ内容 $launch_configration = array( 'LaunchConfigurationName' => 'wordpress_launch_configration', 'ImageId' => 'ami-xxxxxxxx', 'SecurityGroups' => array('sg-xxxxxxxx'), 'InstanceType' => 't1.micro' ); // 起動条件を作成 $autoscaling->createLaunchConfiguration($launch_configration); } catch (AutoScalingException $e) { echo 'NG'; }次に「Auto Scalingグループ」を設定するファイルを作成します。「Auto Scalingグループ」では以下の表の内容を配列で設定しています。
内容 | キー名 | 今回の値 |
---|---|---|
Auto Scalingグループ名 | AutoScalingGroupNam | wordpress_auto_scaling_group |
利用する起動条件名 | LaunchConfigurationName | wordpress_launch_configration |
起動するインスタンスの最小数 | MinSize | 3 |
起動するインスタンスの最大数 | MaxSize | 3 |
利用するアベイラビティゾーン | AvailabilityZones | array( 'ap-northeast-1a', 'ap-northeast-1b', 'ap-northeast-1c' ) ※配列で設定 |
利用するELB名 (このELBの配下で稼働させる) | LoadBalancerNames | array('wordpress') ※配列で設定 |
ELBのヘルスチェックを利用する場合 設定する※1 | HealthCheckType | ELB |
インスタンス起動後にELBが ヘルスチェックを開始するまでの秒数 | HealthCheckGracePeriod | 180 |
require 'AWSSDKforPHP/aws.phar'; use AwsCommonAws; use AwsAutoScalingExceptionAutoScalingException; $aws = Aws::factory('/usr/share/pear/AWSSDKforPHP/Aws/Common/Resources/aws-config.php'); try { $autoscaling = $aws->get('autoscaling'); // 配列で設定。上の表と同じ内容 $auto_scaling_group = array( 'AutoScalingGroupName' => 'wordpress_auto_scaling_group', 'LaunchConfigurationName' => 'wordpress_launch_configration', 'MinSize' => 3, 'MaxSize' => 3, 'AvailabilityZones' => array( 'ap-northeast-1a', 'ap-northeast-1b', 'ap-northeast-1c' ), 'LoadBalancerNames' => array('wordpress'), 'HealthCheckType' => 'ELB', 'HealthCheckGracePeriod' => 180 ); // Auto Scalingグループを作成 $autoscaling->createAutoScalingGroup($auto_scaling_group); } catch (AutoScalingException $e) { echo 'NG'; }この時、「起動インスタンスの最小数(MinSize)と最大数(MaxSize)を同じ」にすることで、常に同じ稼働台数を保つことができます。 6. 動作確認 では、実際に上記のファイルを順番に実行して3台のインスタンスが起動してくるかを確認してみましょう。
php /home/ec2-user/create_launch_configration.php php /home/ec2-user/create_auto_scaling_group.php実行後、「Management Console」で確認します。 起動してきました。 ※この設定は、いままで起動していたインスタンスに対して適用されるわけではありません。ですので、いままで使用していたインスタンスは終了しています。 「Management Console」の「Load Balancers」の「Instances」タブでELBの配下で動作しているかも確認しましょう。3台が「In Service」になっています。 ブラウザで問題なくアクセスできているかも念のため確認しておきます。 今度は1台がダウンした場合を想定して、1台のインスタンスのPHP-FPMを終了させてみます。
sudo /etc/init.d/php-fpm stop Stopping php-fpm: [ OK ]「Management Console」で確認します。PHP-FPMを終了させたインスタンスがターミネイトし、新しいインスタンスが起動してきたことを確認できました。 7. Auto Scalingの設定の消去方法 このまま運用を続けていく場合の手順は以上です。 ですが、今回のように検証で利用した場合は、Auto Scalingの設定をきちんと消去してください。 自動で起動させるために設定しているのであたりまえなのですが、ちゃんと設定を消去しておかないとインスタンスをターミネイトしてもまた起動してきてしまいます。ですので、Auto Scalingの設定を消去する方法についても触れておきたいと思います。 まず、「Auto Scalingグループ」の設定で「インスタンスの最小数(MinSize)と最大数(MaxSize)を0」に更新します。 次に、「Auto Scalingグループ」を削除し、最後に「起動条件(Launch Configration)」を削除します。この順番でおこなう必要がありますので注意しましょう。
1. 「Auto Scalingグループ」の更新
/home/ec2-user/update_auto_scaling_group.phprequire 'AWSSDKforPHP/aws.phar'; use AwsCommonAws; use AwsAutoScalingExceptionAutoScalingException; $aws = Aws::factory('/usr/share/pear/AWSSDKforPHP/Aws/Common/Resources/aws-config.php'); try { $autoscaling = $aws->get('autoscaling'); // 配列で設定。MinSizeとMaxSizeを0に更新 $auto_scaling_group = array( 'AutoScalingGroupName' => 'wordpress_auto_scaling_group', 'LaunchConfigurationName' => 'wordpress_launch_configration', 'MinSize' => 0, 'MaxSize' => 0, ); // Auto Scalingグループを更新 $autoscaling->updateAutoScalingGroup($auto_scaling_group); } catch (AutoScalingException $e) { echo 'NG'; }
2. 「Auto Scalingグループ」の削除
/home/ec2-user/delete_auto_scaling_group.phprequire 'AWSSDKforPHP/aws.phar'; use AwsCommonAws; use AwsAutoScalingExceptionAutoScalingException; $aws = Aws::factory('/usr/share/pear/AWSSDKforPHP/Aws/Common/Resources/aws-config.php'); try { $autoscaling = $aws->get('autoscaling'); // Auto Scalingグループを削除 $autoscaling->deleteAutoScalingGroup(array( 'AutoScalingGroupName' => 'wordpress_auto_scaling_group' )); } catch (AutoScalingException $e) { echo 'NG'; }
3. 「起動条件(Launch Configration)」の削除
/home/ec2-user/delete_launch_configration.phprequire 'AWSSDKforPHP/aws.phar'; use AwsCommonAws; use AwsAutoScalingExceptionAutoScalingException; $aws = Aws::factory('/usr/share/pear/AWSSDKforPHP/Aws/Common/Resources/aws-config.php'); try { $autoscaling = $aws->get('autoscaling'); // 起動条件を削除 $autoscaling->deleteLaunchConfiguration(array( 'LaunchConfigurationName' => 'wordpress_launch_configration' )); } catch (AutoScalingException $e) { echo 'NG'; }上のファイルから順番に実行します。
php /home/ec2-user/update_auto_scaling_group.php php /home/ec2-user/delete_auto_scaling_group.php php /home/ec2-user/delete_launch_configration.php8. まとめ これで「常に同じ構成で運用」ができるようになりました。 ここまで設定してあれば通常の運用ではほぼ問題のない設定ができていると思いますが、せっかくなので急なアクセス増加にも備えておきましょう。 次回は、負荷に応じてEC2インスタンスが増減するようにしたいと思います。