以前、Heartbeat(Pacemaker)でEIPの付け替えの記事でEC2起動時にEIPを自分自身に関連付ける方法を紹介しました。

しかし、この方法は固定されたEIPを(他のEC2から外して)関連付けるというだけでした。

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

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

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

上記の流れを図にすると、下記のようになります。

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

#!/usr/bin/php
 "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)から呼び出すことで、起動時にEIPプールからまだ関連付けされていないEIPを自分自身(EC2)に関連付けることができます。

こちらの記事はなかの人(suz-lab)監修のもと掲載しています。
元記事は、こちら