2012年5月6日日曜日

EC2起動時にEIPプールから利用していないEIPを取得&関連付け

スズキです。

下記で、EC2起動時にEIPを自分自身に関連付ける方法を紹介しました。
Heartbeat(Pacemaker)でEIPの付け替え
しかし、この方法は固定されたEIPを(他のEC2から外して)関連付けるだけでした。

今回は、EIP群の中から利用されていない(EC2に関連付けられていない)
EIPを取得して、起動時に関連付けるPHPスクリプトを作成してみました。

これは外部サービスなどを利用するために接続するIPアドレスを固定する
必要がある場合に有効です。(特に"Auto Scaling"を利用するとき)

例えば、あらかじめEIPをいくつか取得し、 外部サービスに登録し、
EC2起動時に、これらのEIPから利用されていないものを関連付け、
自動で外部サービスを利用することができるようになります。

図にすると、こんな感じでしょうか?


実際のスクリプトは下記のとおりです。

#!/usr/bin/php
<?php

// 初期設定
require_once("/opt/aws/php/default/sdk.class.php");
$ec2 = new AmazonEC2(array(
  "key"    => "ACCESS KEY",
  "secret" => "SECRET KEY"
));
$ec2->set_region(AmazonEC2::REGION_APAC_NE1);

// EIP群の指定
$eip_list = array(
    "xxx.xxx.xxx.xxx",
    "yyy.yyy.yyy.yyy",
    "zzz.zzz.zzz.zzz"
);

// EIPの取得
$response = $ec2->describe_addresses(array(
    "PublicIp" => $eip_list
));
if(!$response->isOK()) {
  error_log("[" . $response->body->Errors->Error->Code . "] " . $response->body->Errors->Error->Message);
}

// 関連付けされていないEIPの取得
foreach($response->body->addressesSet->item as $item) {
    if($item->instanceId == "") {
        $eip = $item->publicIp;
        break;
    }
}

// EIPの関連付け
$response = $ec2->associate_address(
  file_get_contents("http://169.254.169.254/latest/meta-data/instance-id"),
  $eip
);
if(!$response->isOK()) {
  error_log("[" . $response->body->Errors->Error->Code . "] " . $response->body->Errors->Error->Message);
  exit(1);
}

exit(0);
?>

上記を下記に出てくる起動スクリプト(/etc/init.d/eip)から呼び出すことで、
Heartbeat(Pacemaker)でEIPの付け替え
起動時にEIPプールからまだ関連付けされていないEIPを自分自身(EC2)に
関連付けることができます。

"Auto Scaling"での起動も試しておきたい...
--------
http://www.suz-lab.com

0 コメント: