読者です 読者をやめる 読者になる 読者になる

プログラマーのメモ書き

伊勢在住のプログラマーが気になることを気ままにメモったブログです

【EC2】 Elastic IP を起動時に割り当てる

EC2 上でSubversion+Redmine の環境を構築しましたが、 インスタンスを停止して、再起動するとElastic IP の割り当てが解除されてしまいます。

そこで、インスタンスの起動時に自動的にElastic IP を割り当てるようにします。

 

OSはUbuntu12.04LTS 64bit版です(BitNami Redmineスタック)。

 

なお、EC2のコマンドラインツールについては、AWS のドキュメントこちらの記事を参考にしてください。また、本記事のもとになっているSubversion+Redmine の環境については、こちらを参考にしてください。

 

Elastic IPを起動時に割り当て

ネットを調べると、似たようなことを既にやられていた方がいました。

インスタンス起動時にElasticIPの自動割当

Elastic IPを自動で割り振りたい

 

基本的にはやってることは同じです。ec2に接続する際に環境変数と鍵を/etc/ec2に置くように変更しています。Elastic IP の自動割当て用に作成したスクリプトを、/etc/init.d/auto_elastic_ip として保存しておきます。

 

#!/bin/sh
### BEGIN INIT INFO
# Provides:          auto_elastic_ip
# Required-Start:
# Required-Stop:     
# Should-Stop:       
# Default-Start:     2
# Default-Stop:      
# Short-Description: Assign Elastic IP automatically.
# Description:       Assign Elastic IP automatically.
### END INIT INFO
#
# based on http://d.hatena.ne.jp/techmedia-think/20090625/1245923190
# modified by Junichi MORI, 2012/12/7

# IP address was assigned from AWS manageent Console on Web Browser
ELASTIC_IP_ADDRESS=xxx.xxx.xxx.xxx

# environment variable seup
EC2_ENV=/etc/ec2/bash_ec2env
if [ ! -f $EC2_ENV ]
then
    echo "error: ec2 environmental variable definition file is missing."
    exit -1
fi
. $EC2_ENV

# get instance id
EC2_INSTANCE_ID=`curl -s http://169.254.169.254/latest/meta-data/instance-id`


# Carry out specific functions when asked to by the system
case "$1" in
    start)
        echo "Assigning Elastic IP Address. IP=$ELASTIC_IP_ADDRESS INSTANCE=$EC2_INSTANCE_ID"
        ec2-associate-address $ELASTIC_IP_ADDRESS -i $EC2_INSTANCE_ID >/dev/null 2>&1
    ;;
    stop)
        echo "Deassigning Elastic IP Address. IP=$ELASTIC_IP_ADDRESS INSTANCE=$EC2_INSTANCE_ID"
        ec2-disassociate-address $ELASTIC_IP_ADDRESS >/dev/null 2>&1
    ;;
esac

環境変数などは、こちらの記事に書いたように、/etc/ec2に置いたファイルで定義しています。

 

インスタンスの起動時にこれを実行するために、/etc/rc2.d にシンボリックリンクを張ります(Ubuntuはランレベル2で起動します)。シンボリックリンクを自分で貼ってもよいのですが、update-rc.d というコマンドを使えば、ランレベルに応じて自動的にリンクを張ってくれるそうです。

bitnami@ip-10-132-25-214:/etc/init.d$ sudo update-rc.d auto_elastic_ip start 98 2 .
 Adding system startup for /etc/init.d/auto_elastic_ip ...
   /etc/rc2.d/S98auto_elastic_ip -> ../init.d/auto_elastic_ip
bitnami@ip-10-132-25-214:/etc/init.d$ 

なお、上記のスクリプトに

### BEGIN INIT INFO
・・・・・
### END INIT INFO

とあるのは、update-rc.d コマンドで扱うために必要だったためです(他のinit.d 配下のスクリプトをまねました)。自分でリンクを張るなら不要です。

 

一度、インスタンスを停止して、Elastic IP の割り当てが解除されていることを確認してから、インスタンスを立ち上げます。AWSコンソールでインスタンスを確認して、Elastic IP が割り当てられていればOKです。

 

また、AWSコンソールで起動したインスタンス上で右クリックをして、Get System Log でログを見ると、

Assigning Elastic IP Address. IP=xxx.xxx.xxx.xxx INSTANCE=i-xxxxxxxx

とメッセージがでています。

 

(参考:メタデータについて)

Amazon EC2の仮想サーバ(インスタンス)から自身のメタ情報を取得する方法

インスタンスメタデータの使用