12/1からクリスマスまで、1人ずつリレー形式でブログ記事を書く AWS Advent Calendar 2012 の20日目です。
去年・一昨年は、WordPres Advent Calendar 2011、PHP Advent Calendar 2010 に参加しましたが、今年は AWS Advent Calendar に参加します。
さて EC2 インスタンスに EIP (固定IP)を設定して運用するケースって多いと思うんですよ。
しかし EC2 のインスタンスでは、一度停止した後再起動すると EIP が外れてしまいます。
一時的にスケールアップしたくて、インスタンス停止して再起動とかいうオペレーションは、まま有ると思います。
その時に EIP を associate し忘れて「あら、サイトに繋がらないわ」なんてうっかりミスをすることも多いと思います。
そんな、うっかりさんのために EC2 インスタンス起動時に自動で EIP を設定するための方法を解説したいと思います。
EC2 API Tools のインストール
対象 OS は CentOS 6.3 にしておきます。
まずは EC2 API Tools をインストールしましょう。
「ec2-api-toolsをCentOSで使えるようにする」とかが参考になりますね。
API Tools は、以下からダウンロードできますが Java の実行環境が必要になるので、これは yum からインストールしましょう。
Amazon EC2 API Tools : Developer Tools : Amazon Web Services
yum で、Java の実行環境をインストールして、上記 URL からダウンロードした Amazon EC2 API Tools (ec2-api-tools.zip) をインストールするには以下の手順で行います。
# yum install -y java-1.7.0-openjdk.x86_64 # unzip ec2-api-tools.zip # mv ec2-api-tools-1.6.5.4 /usr/local/bin/ # ln -s /usr/local/bin/ec2-api-tools-1.6.5.4 /usr/local/bin/ec2-api-tools
秘密鍵とX.509証明書を取得
以下の URL から取得できます。
Amazon Webサービス – [アカウント] – [セキュリティ証明書]
「アクセス証明書」の部分で証明書が作成可能なので秘密鍵と一緒にダウンロードしください。
秘密鍵は AWS のサーバには保存されないため、ここでダウンロードした秘密鍵を紛失してしまうと再作成するしかないので注意してください。
- 秘密鍵: pk-*****************************.pem
- 証明書: cert-******************************.pem
これらを EC2 に ~/ec2keys/ とかってディレクトリを作って保存しておきましょう。
環境変数を設定する
EC2 に SSH 接続して .bash_profile に以下を追加しておきましょう。
環境によって内容は変わるので注意してください。
export JAVA_HOME="/usr/lib/jvm/jre" export EC2_HOME="/usr/local/bin/ec2-api-tools" export EC2_PRIVATE_KEY="~/ec2keys/pk-********************************.pem" export EC2_CERT="~/ec2keys/cert-********************************.pem" PATH=${PATH}:${HOME}/bin:${EC2_HOME}/bin export PATH
3,4 行目はダウンロードしてきた秘密鍵・証明書名を設定してください。
ログインし直せば環境変数の設定変更は反映されますが「source ~/.bashrc」コマンドを発行すれば、ログインし直さなくても即座に反映されます。
ここまでの作業で EC2 API Tools が使えるようになっているはずです。
ec2-describe-regions コマンドとかで、ちゃんと使えるようになっているか確認しておきましょう。
# ec2-describe-regions REGION eu-west-1 ec2.eu-west-1.amazonaws.com REGION sa-east-1 ec2.sa-east-1.amazonaws.com REGION us-east-1 ec2.us-east-1.amazonaws.com REGION ap-northeast-1 ec2.ap-northeast-1.amazonaws.com REGION us-west-2 ec2.us-west-2.amazonaws.com REGION us-west-1 ec2.us-west-1.amazonaws.com REGION ap-southeast-1 ec2.ap-southeast-1.amazonaws.com REGION ap-southeast-2 ec2.ap-southeast-2.amazonaws.com
EIP を自動設定するためのシェルスクリプトを作る
~/bin/ ディレクトリを作って、以下の内容で set-eip ってファイルを作ってください。
#!/bin/sh export JAVA_HOME="/usr/lib/jvm/jre" export EC2_HOME="/usr/local/bin/ec2-api-tools" export EC2_PRIVATE_KEY="~/ec2keys/pk-********************************.pem" export EC2_CERT="~/ec2keys/cert-********************************.pem" INSTANCE_ID=`/usr/bin/curl -s http://169.254.169.254/latest/meta-data/instance-id` EIP=***.***.***.*** REGION=ap-northeast-1 ${EC2_HOME}/bin/ec2-associate-address -i ${INSTANCE_ID} ${EIP} --region ${REGION}
4,5 行目はダウンロードしてきた秘密鍵・証明書名を設定してください。
8,9 行目は、設定したい EIP (取得しておく必要があります。別途 AWS のダッシュボードや EC2 API Tools で取得しておいてください)と、そのインスタンスのリージョン名(東京リージョンなら ap-northeast-1)を指定してください。
7行目では http://169.254.169.254/latest/meta-data/instance-id に curl アクセスしていますが、実はこの Web API を使用することで実行しているインスタンスのインスタンス名を取得することができます。
以下の URL で詳しく解説されているので、気になる方は参考にしてみてください。
Amazon EC2の仮想サーバ(インスタンス)から自身のメタ情報を取得する方法
ファイル作成したら chmod で実行権限を与えておきましょう。
スクリプトが作成できたら、実行してみて正常に EIP が設定されるか確認してみましょう。
# set-eip ADDRESS ***.***.***.*** i-********
ADDRESS の後ろに EIP、インスタンス名が表示されれば成功です。
AWS のダッシュボードで確認しても、ちゃんと EIP が設定されていることがわかると思います。
サーバ再起動時に EIP を自動でセットする
サーバ再起動時に EIP を自動でセットするには cron を用います。
crontab -e コマンドを実行して以下のように設定してください。
# crontab -e @reboot /bin/sh ~/bin/set-eip
スケジュール間隔として通常は「0 * * * *」のように時間を設定しますが、ここに「@reboot」を設定すると、起動時に一度だけ cron 実行されるようになります。
ここまで設定したら AWS のコンソールから、インスタンス停止 → 開始 してみてください。
ちょっとタイムラグがあるかもしれませんが、インスタンス開始後に EIP がセットされているのが確認できると思います。
おまけ
私の所属するデジタルキューブでは WordPress を t1.micro インスタンスで高速に動作させるための AMI 「網元」を無償で公開しています。
WordPress AMI – 超高速 WordPress AMI 網元
話題の高速 Web サーバ Nginx + php-fpm で動作する WordPress 環境がセットアップ済みの AMI になります。
こちらも、ぜひご利用ください。
また AWS の Cloud Front を WordPress で簡単に利用できるプラグイン + サービス WP Booster もご用意しています。
WP Booster
会員登録とプラグインの導入だけで簡単に CDN を利用できるサービスになっています。
最近では転送料予約の固定料金プランも、ご用意させていただきました。
こちらもよろしくお願いします。