以前、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)に関連付けることができます。