今回は コマンドライン(CUI)で、ELB(ロードバランサー)を設定してみます。
手順としては以下の通り。
前準備の手順なんて見たくない人は テキトーに読み飛ばして、ELB関連のコマンド部分だけ確認ください。
・セキュリティグループを作る
WEBという名前のセキュリティグループを作成し、外部から port80とport22へのアクセスを許可します。既に、相当するセキュリティグループがある場合は、ソチラを利用してもらっても構いません。
・テンプレートとなるEC2インスタンス作成
ここでは、 innerkey という鍵ペアが存在することを前提としています。もし存在しないようなら ec2-add-keypair コマンドで作成するか、別の鍵ペアを使用してください。
作成するEC2インスタンスは、ami-20ad1221 (UbuntuOS) で、32bit マイクロ としておきます。テンプレートはAMI作成後に すぐ破棄してしまうので、TerminationProtection は利用しません。
・WEBサーバの中身を設定
作成した Ubuntu な EC2インスタンスにssh接続します。
後で必要になるので、ここで kernel-d を取得しておきます。
最後に、Ubuntu 側から exit しておきます。
・テンプレートWEBサーバからSnapshotを作成
念のため、テンプレートWEBサーバであるEC2インスタンスを停止しておきます。
ちなみに AWS Management Console だと Completed になってます……謎すぎる。
...
しばらく放置したら、ec2-describe-snapshots ダケでも completed になりました。何かキャッシュされているんでしょうかね???
・SnapshotからAMI(AmazonMachineImage)を作成
Snapshot から AMI を作成するには ec2-register コマンドを使用します。
・不要になった テンプレート用WEBサーバを削除
テンプレートWEBサーバは既にSTOPさせてあるので、TERMINATE させます。
EBS Volume も同時に消されているはずですが、もし残っていたら ec2-delete-volumes で削除しておいてください。
・AMIから複数台のWEBサーバを作成
作成済みの AMI (ami-c15fdbc0) を使って、EC2インスタンスを二つ起動します。
・ELBを設定し、WEBサーバを配下に加える
ELB(ロードバランサー)を作成するのは elb-create-lb というコマンドを使用します。
ちなみに、elb-* 系コマンドは 以前設定した環境変数の EC2_URL を参照してくれないので、コマンドラインで指定する必要があります。環境変数で指定したい場合は EC2_REGION 環境変数を設定しておいてください。
ここでは httpbalancer という名前の ELB を作成します。
次にELBのヘルスチェック(死活監視)を設定します。
ELBの配下に、先に用意した二台のWEBサーバ(EC2インスタンス)を加えます。
次に作成されたロードバランサーの状態を確認してみます。
そして、ロードバランサーの配下に組み込まれたWEBサーバの状態(と言うか、ロードバランサーがWEBサーバを死活確認しているのでその結果)を表示してみます。
・ELBの動作確認
curlコマンドを使って、ロードバランサー経由で配下のWEBサーバにアクセスしてみます。
ロードバランサーのFQDNは elb-describe-lbs コマンドで入手したものを使用します。
もし、アクセスが届かない場合、FQDNの先頭に ipv6. とか dualstack. とかを付けてみると良いかもしれません。前者は IPv6 のホスト名で、後者は IPv4,IPv6共用らしいです。
これで動作確認は終わり!!! (動いてることを確認しただけですが ^^;)
・ELBの削除
作成したのとは逆の手順でロードバランサーを破棄します。
まず最初にロードバランサー配下からEC2インスタンスを排除し、その後、ロードバランサーであるELBを消去します。
ELBの配下からEC2を排除するには elb-deregister-instances-from-lb コマンドを使用します。とりあえず、ECを1台だけ排除してみます。
最後に、ELB本体を削除します。
最後の elb-describe-lbs コマンドに対して、何も結果が表示されないので、ELBは消えたということになります。
これで、ELBの消去作業は終了。
・後始末
不要になった AMI、Snapshot、EC2インスタンスを削除しておいてください。
AMI削除はec2-deregister、Snapshot削除は ec2-delete-snapshots、EC2インスタンス削除は ec2-stop-instances、ec2-terminate-instances です。
EC2のTerminationProtectionを使用しているなら「ec2-modify-instance-attribute INSTANCE_ID --disable-api-termination false 」で解除できます。
今回はここまで。
続きを読む
手順としては以下の通り。
- WEB用のセキュリティグループを作成
- テンプレートとなるWEBサーバを作成
- WEBサーバの中身を設定
- テンプレートWEBサーバからSnapshotを作成
- SnapshotからAMI(AmazonMachineImage)を作成
- 不要になった テンプレート用WEBサーバを削除
- AMIから複数台のWEBサーバを作成
- ELBを設定し、WEBサーバを配下に加える
- AMIから複数台のWEBサーバを作成
- ELBを設定し、WEBサーバを配下に加える
- ELBの動作確認
- ELBの削除
- 後始末
前準備の手順なんて見たくない人は テキトーに読み飛ばして、ELB関連のコマンド部分だけ確認ください。
・セキュリティグループを作る
WEBという名前のセキュリティグループを作成し、外部から port80とport22へのアクセスを許可します。既に、相当するセキュリティグループがある場合は、ソチラを利用してもらっても構いません。
$ ec2-add-group \port22 の設定の際 cidr 指定で「AWS内部からだけ」というのが設定出来ればよいのですが…。やり方が良く分かりません...。まぁ、そのように設定したとしても、他人が作成したAWSインスタンスからアクセスできてしまうわけですが…。
web \
--description 'web server'
GROUP sg-33bace32 web web server
$ ec2-authorize \
web \
--protocol tcp \
--port-range 80-80 \
--cidr '0.0.0.0/0'
GROUP web
PERMISSION web ALLOWS tcp 80 80 FROM CIDR 0.0.0.0/0 ingress
$ ec2-authorize \
web \
--protocol tcp \
--port-range 22-22 \
--cidr '0.0.0.0/0'
GROUP web
PERMISSION web ALLOWS tcp 22 22 FROM CIDR 0.0.0.0/0 ingress
・テンプレートとなるEC2インスタンス作成
ここでは、 innerkey という鍵ペアが存在することを前提としています。もし存在しないようなら ec2-add-keypair コマンドで作成するか、別の鍵ペアを使用してください。
作成するEC2インスタンスは、ami-20ad1221 (UbuntuOS) で、32bit マイクロ としておきます。テンプレートはAMI作成後に すぐ破棄してしまうので、TerminationProtection は利用しません。
$ ec2-run-instances \
ami-20ad1221 \
--group web \
--key innerkey \
--instance-count 1 \
--instance-type t1.micro \
--availability-zone ap-northeast-1a \
--instance-initiated-shutdown-behavior stop
RESERVATION r-31e56b32 488224276535 web
INSTANCE i-11b39412 ami-20ad1221 pending innerkey 0 t1.micro 2013-02-07T12:20:40+0000 ap-northeast-1a aki-ec5df7ed monitoring-disabled ebs paravirtual xen sg-33bace32 default false
$ ec2-describe-instances i-11b39412
RESERVATION r-31e56b32 488224276535 web
INSTANCE i-11b39412 ami-20ad1221 ec2-46-51-232-99.ap-northeast-1.compute.amazonaws.com ip-10-132-100-230.ap-northeast-1.compute.internal pending innerkey 0 t1.micro 2013-02-07T12:20:40+0000 ap-northeast-1a aki-ec5df7ed monitoring-disabled 46.51.232.99 10.132.100.230 ebs paravirtual xen sg-33bace32 default false
BLOCKDEVICE /dev/sda1 vol-4245c660 2013-02-07T12:20:43.000Z true
$ ec2-describe-instance-status i-11b39412
※未だec2-run-instancesによるECインスンタンス起動処理前なので、応答が無い
$ ec2-describe-instance-status i-11b39412
INSTANCE i-11b39412 ap-northeast-1a running 16 initializing initializing active
SYSTEMSTATUS reachability initializing
INSTANCESTATUS reachability initializing
$ ec2-describe-instance-status i-11b39412
INSTANCE i-11b39412 ap-northeast-1a running 16 ok ok active
SYSTEMSTATUS reachability passed
INSTANCESTATUS reachability passed
・WEBサーバの中身を設定
作成した Ubuntu な EC2インスタンスにssh接続します。
$ ssh \Ubuntu 側は「WEBサーバ」となるので、Apache2 + php5 をインストールします。念のため、最初に パッケージのアップデートも実施しておきます。
-i ~/.ssh/innerkey.pem \
-l ubuntu \
ec2-46-51-232-99.ap-northeast-1.compute.amazonaws.com
ubuntu$ sudo apt-get update設定出来たら、apacheが動作しているかどうか確認してみます。
ubuntu$ sudo apt-get install apache2
ubuntu$ sudo apt-get install libapache2-mod-php5
ubuntu$ curl 'http://localhost/'WEBサーバとしての動作が確認できたら、簡単なコンテンツプログラム(php)を配備します。/var/www/ec2meta.php に以下のようなファイルを作成します。vi で作成するなら、sudo vi /var/www/ec2meta.phpですね…。
<html><body><h1>It works!</h1>
<p>This is the default web page for this server.</p>
<p>The web server software is running but no content has been added, yet.</p>
</body></html>
<?phpファイルを配備したら、動作確認してみます。
$url = 'http://169.254.169.254';
$data = array(
'pattern' => 'htmlspe',
'show' => 'quickref',
);
$options = array(
'http' => array( 'method' => 'POST', 'content' => http_build_query($data) )
);
$pathinfo = $_SERVER['PATH_INFO'];
if (!empty($pathinfo)) { $url .= $pathinfo; }
$contents = file_get_contents( $url, false, stream_context_create( $options ) );
if ($contents !== FALSE) { echo $contents; }
else { header( 'HTTP/1.0 502 http://169.254.169.254/ does not respond.' ); }
// END of PHP //
ubuntu$ curl 'http://localhost/ec2meta.php' ; echo -en "\n"日付が並んだ後に latest が表示されればOKです。
1.0
2007-01-19
2007-03-01
2007-08-29
2007-10-10
2007-12-15
2008-02-01
2008-09-01
2009-04-04
2011-01-01
2011-05-01
2012-01-12
latest
後で必要になるので、ここで kernel-d を取得しておきます。
$ curl 'http://localhost/ec2meta.php/latest/meta-data/kernel-id' ; echo -en "\n"AWSコマンドラインプログラムがインストールされているなら、curl コマンドを使わないで 「ec2-metadata --kernel-id」というコマンドを使ってもOKです。
aki-ec5df7ed
最後に、Ubuntu 側から exit しておきます。
ubuntu$ exit
・テンプレートWEBサーバからSnapshotを作成
念のため、テンプレートWEBサーバであるEC2インスタンスを停止しておきます。
$ ec2-stop-instances i-11b39412EC2の停止を確認したら、EBSからスナップショットをとります。
INSTANCE i-11b39412 running stopping
$ ec2-describe-instance-status \
--include-all-instances \
i-11b39412
INSTANCE i-11b39412 ap-northeast-1a stopped 80 not-applicable not-applicable active
$ ec2-create-snapshot \パラメータ無しの ec2-describe-snapshots ダケだと pending のままですが、確認対象の snapshot-id を与えると、ちゃんと completed になります。不思議な挙動…。
vol-4245c660 \
--description 'template web Ubuntu'
SNAPSHOT snap-c2a043e1 vol-4245c660 pending 2013-02-07T12:44:43+0000 488224276535 8 template web Ubuntu
$ ec2-describe-snapshots
SNAPSHOT snap-c2a043e1 vol-4245c660 pending 2013-02-07T12:44:43+0000 488224276535 8 template web Ubuntu
$ ec2-describe-snapshots snap-c2a043e1
SNAPSHOT snap-c2a043e1 vol-4245c660 completed 2013-02-07T12:44:43+0000 100% 488224276535 8 template web Ubuntu
$ ec2-describe-snapshots
SNAPSHOT snap-c2a043e1 vol-4245c660 pending 2013-02-07T12:44:43+0000 488224276535 8 template web Ubuntu
ちなみに AWS Management Console だと Completed になってます……謎すぎる。
...
しばらく放置したら、ec2-describe-snapshots ダケでも completed になりました。何かキャッシュされているんでしょうかね???
・SnapshotからAMI(AmazonMachineImage)を作成
Snapshot から AMI を作成するには ec2-register コマンドを使用します。
$ ec2-register \AMI の出来上がり。
--snapshot snap-c2a043e1 \
--kernel aki-ec5df7ed \
--name 'web_template' \
--description 'web template Ubuntu'
IMAGE ami-3d76f23c
$ ec2-describe-images
IMAGE ami-3d76f23c 488224276535/web_template 488224276535 available private i386 machine aki-ec5df7ed ebs paravirtual xen
BLOCKDEVICEMAPPING /dev/sda1 snap-c2a043e1 8 true standard
・不要になった テンプレート用WEBサーバを削除
テンプレートWEBサーバは既にSTOPさせてあるので、TERMINATE させます。
$ ec2-terminate-instances i-11b39412これで、テンプレートWEBのEC2インスタンスは削除されました。
INSTANCE i-11b39412 stopped terminated
EBS Volume も同時に消されているはずですが、もし残っていたら ec2-delete-volumes で削除しておいてください。
・AMIから複数台のWEBサーバを作成
作成済みの AMI (ami-c15fdbc0) を使って、EC2インスタンスを二つ起動します。
$ ec2-run-instances \実行開始コマンド入力した後、ec2-describe-instance-status で状況を確認します。
ami-3d76f23c \
--group web \
--key innerkey \
--instance-count 2 \
--instance-type t1.micro \
--availability-zone ap-northeast-1a \
--instance-initiated-shutdown-behavior stop
RESERVATION r-8bee6788 488224276535 web
INSTANCE i-437a5b40 ami-3d76f23c pending innerkey 0 t1.micro 2013-02-08T10:29:33+0000 ap-northeast-1a aki-ec5df7ed monitoring-disabled ebs paravirtual xen sg-33bace32 default false
INSTANCE i-417a5b42 ami-3d76f23c pending innerkey 1 t1.micro 2013-02-08T10:29:33+0000 ap-northeast-1a aki-ec5df7ed monitoring-disabled ebs paravirtual xen sg-33bace32 default false
$ ec2-describe-instance-status i-437a5b40 i-417a5b42kernel-id の指定が間違っていたり(あるいは指定忘れていたり)すると、status が impaired (傷んでる/壊れている...ぐらいの意味)になったり、passed にならないコトがあります。その場合は コマンドヒストリを見返す等して、再確認してみてください。
INSTANCE i-437a5b40 ap-northeast-1a running 16 ok ok active
SYSTEMSTATUS reachability passed
INSTANCESTATUS reachability passed
INSTANCE i-417a5b42 ap-northeast-1a running 16 ok ok active
SYSTEMSTATUS reachability passed
INSTANCESTATUS reachability passed
・ELBを設定し、WEBサーバを配下に加える
ELB(ロードバランサー)を作成するのは elb-create-lb というコマンドを使用します。
ちなみに、elb-* 系コマンドは 以前設定した環境変数の EC2_URL を参照してくれないので、コマンドラインで指定する必要があります。環境変数で指定したい場合は EC2_REGION 環境変数を設定しておいてください。
ここでは httpbalancer という名前の ELB を作成します。
$ elb-create-lb \(EC2_URL環境変数に頼っているつもりで) --region オプションを指定しないと、謎のエラーに悩まされるか、あるいは意図しない region にロードバランサーが作成されるので注意してください。
httpbalancer \
--scheme internet-facing \
--region ap-northeast-1 \
--availability-zones ap-northeast-1a \
--listener 'protocol=HTTP, lb-port=80, instance-port=80'
DNS_NAME httpbalancer-1887544794.ap-northeast-1.elb.amazonaws.com
次にELBのヘルスチェック(死活監視)を設定します。
$ elb-configure-healthcheck \チェック間隔は30秒、2回チェック失敗でunhealthy扱い、4回チェック成功でhealthyに戻す…という設定にします。
httpbalancer \
--region ap-northeast-1 \
--target 'http:80/' \
--interval 30 \
--timeout 5 \
--healthy-threshold 4 \
--unhealthy-threshold 2
HEALTH_CHECK http:80/ 30 5 4 2
ELBの配下に、先に用意した二台のWEBサーバ(EC2インスタンス)を加えます。
$ elb-register-instances-with-lb \--instances オプションに与える instance-id は(コマンの前後にも)空白を含めたりせず 繋げて指定してください。そうしないと謎のエラーに悩まされます…(x_x;
httpbalancer \
--region ap-northeast-1 \
--instances i-437a5b40,i-417a5b42
INSTANCE_ID i-417a5b42
INSTANCE_ID i-437a5b40
次に作成されたロードバランサーの状態を確認してみます。
$ elb-describe-lbs --region ap-northeast-1すごく普通…。
LOAD_BALANCER httpbalancer httpbalancer-1887544794.ap-northeast-1.elb.amazonaws.com 2013-02-08T11:07:45.180Z internet-facing
そして、ロードバランサーの配下に組み込まれたWEBサーバの状態(と言うか、ロードバランサーがWEBサーバを死活確認しているのでその結果)を表示してみます。
$ elb-describe-instance-health \二つ並んだ N/A が何を意味しているのか分かりませんが、とりあえず InService なので問題ないのでしょう。
httpbalancer \
--region ap-northeast-1
INSTANCE_ID i-417a5b42 OutOfService Instance registration is still in progress. ELB
INSTANCE_ID i-437a5b40 OutOfService Instance registration is still in progress. ELB
※↑ELB配下へEC2を登録している最中...という意味
$ elb-describe-instance-health \
httpbalancer \
--region ap-northeast-1
INSTANCE_ID i-417a5b42 InService N/A N/A
INSTANCE_ID i-437a5b40 InService N/A N/A
※↑ EC2のinstance-id を指定しないせず、配下のEC2インスタンスを全表示した結果。
$ elb-describe-instance-health \
httpbalancer \
--region ap-northeast-1 \
--instances i-437a5b40,i-417a5b42
INSTANCE_ID i-437a5b40 InService N/A N/A
INSTANCE_ID i-417a5b42 InService N/A N/A
※↑ EC2のinstance-id を指定して、2つだけ表示した結果。
・ELBの動作確認
curlコマンドを使って、ロードバランサー経由で配下のWEBサーバにアクセスしてみます。
ロードバランサーのFQDNは elb-describe-lbs コマンドで入手したものを使用します。
$ for R in $(seq 1 10) ; do \交互にアクセスが分散されていますね…。
curl 'http://httpbalancer-1887544794.ap-northeast-1.elb.amazonaws.com/ec2meta.php/latest/meta-data/instance-id/'; \
echo -en "\n" ; \
done
i-437a5b40
i-417a5b42
.....
i-437a5b40
i-417a5b42
もし、アクセスが届かない場合、FQDNの先頭に ipv6. とか dualstack. とかを付けてみると良いかもしれません。前者は IPv6 のホスト名で、後者は IPv4,IPv6共用らしいです。
これで動作確認は終わり!!! (動いてることを確認しただけですが ^^;)
・ELBの削除
作成したのとは逆の手順でロードバランサーを破棄します。
まず最初にロードバランサー配下からEC2インスタンスを排除し、その後、ロードバランサーであるELBを消去します。
ELBの配下からEC2を排除するには elb-deregister-instances-from-lb コマンドを使用します。とりあえず、ECを1台だけ排除してみます。
$ elb-deregister-instances-from-lb \指定したEC2(i-437a5b40)が排除されましたね…。残ったEC2も含めて排除してしまいましょう。
httpbalancer \
--region ap-northeast-1 \
--instances i-437a5b40
INSTANCE_ID i-417a5b42
$ elb-describe-instance-health \
httpbalancer \
--region ap-northeast-1 \
--instances i-437a5b40,i-417a5b42
INSTANCE_ID i-437a5b40 OutOfService Instance is not currently registered with the LoadBalancer. Instance
INSTANCE_ID i-417a5b42 InService N/A
$ elb-deregister-instances-from-lb \これで、ELBからEC2インスタンスがすべて排除されました。
httpbalancer \
--region ap-northeast-1 \
--instances i-437a5b40,i-417a5b42
No instances currently registered to LoadBalancer
$ elb-describe-instance-health \
httpbalancer \
--region ap-northeast-1 \
--instances i-437a5b40,i-417a5b42
INSTANCE_ID i-437a5b40 OutOfService Instance is not currently registered with the LoadBalancer. Instance
INSTANCE_ID i-417a5b42 OutOfService Instance is not currently registered with the LoadBalancer. Instance
$ elb-describe-instance-health \
httpbalancer \
--region ap-northeast-1
No instances currently registered to LoadBalancer
最後に、ELB本体を削除します。
$ elb-delete-lb \elb-delete-lb コマンドを使用すると、プロンプトが出て y か N で回答を求められます。y で削除できますが、めんどくさければ --force オプションで強制消去することもできます。
httpbalancer \
--region ap-northeast-1
Warning: Deleting a LoadBalancer can lead to service disruption to any
customers connected to the LoadBalancer. Are you sure you want to delete
this LoadBalancer? [Ny] y
OK-Deleting LoadBalancer
$ elb-describe-lbs --region ap-northeast-1
最後の elb-describe-lbs コマンドに対して、何も結果が表示されないので、ELBは消えたということになります。
これで、ELBの消去作業は終了。
・後始末
不要になった AMI、Snapshot、EC2インスタンスを削除しておいてください。
AMI削除はec2-deregister、Snapshot削除は ec2-delete-snapshots、EC2インスタンス削除は ec2-stop-instances、ec2-terminate-instances です。
EC2のTerminationProtectionを使用しているなら「ec2-modify-instance-attribute INSTANCE_ID --disable-api-termination false 」で解除できます。
今回はここまで。
続きを読む