share facebook facebook twitter menu hatena pocket slack

2012.06.28 THU

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

鈴木 宏康

WRITTEN BY 鈴木 宏康

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

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

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

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

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

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

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

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

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

鈴木 宏康

鈴木 宏康

愛知県生まれ。東京工業大学大学院修士課程修了。在学時より、ベンチャー企業でインターネットに関する業務に携わり、現在はクラウド(主にAmazon Web Services)上での開発・運用を軸とした事業の、業務の中心として活躍。

cloudpack

cloudpackは、Amazon EC2やAmazon S3をはじめとするAWSの各種プロダクトを利用する際の、導入・設計から運用保守を含んだフルマネージドのサービスを提供し、バックアップや24時間365日の監視/障害対応、技術的な問い合わせに対するサポートなどを行っております。
AWS上のインフラ構築およびAWSを活用したシステム開発など、案件のご相談はcloudpack.jpよりご連絡ください。