今回は、先日書籍(Amazon Web Servicesクラウドデザインパターン設計ガイド)が発売された
Cloud Design Pattern(CDP)の記事になります。

今回の対象は「High Availability NATパターン」(Incubator & 未完成)です。

上記をCentOS6上でCorosyncとPacemaker、そしてPython版コマンドラインツールで構築してみました。
※上記のVPC/EC2/セキュリティグループ等の設定は適切に行われているものとします。

○AWS(EC2)とiptablesの設定

下記を参照下さい

VPCのNATインスタンスを作ってみる(環境準備編)
VPCのNATインスタンスを作ってみる(iptables編)

次のようになっていれば、問題ありません。

# iptables --list -t nat
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
MASQUERADE all -- anywhere anywhere
Chain OUTPUT (policy ACCEPT)
target prot opt source destination

○corosyncとpacemakerの導入と設定

下記を参照下さい。

Corosync & Pacemaker on EC2

次のようになっていれば、問題ありません。

# crm_mon
============
Last updated: Mon Jan 28 18:21:56 2013
Last change: Mon Jan 28 18:20:39 2013 via crmd on ip-10-10-8-122
Stack: openais
Current DC: ip-10-10-8-122 - partition with quorum
Version: 1.1.7-6.el6-148fccfd5985c5590cc601123c6c16e966b85d14
2 Nodes configured, 2 expected votes
0 Resources configured.
============

Online: [ ip-10-10-9-111 ip-10-10-8-122 ]

○iptablesのモニタリングとフェイルオーバーの設定

下記を参照下さい。

Corosync & Pacemakerでiptablesのフェイルオーバー

次のようになっていれば、問題ありません。

# crm_mon
============
Last updated: Mon Jan 28 18:24:36 2013
Last change: Mon Jan 28 18:24:34 2013 via cibadmin on ip-10-10-8-122
Stack: openais
Current DC: ip-10-10-8-122 - partition with quorum
Version: 1.1.7-6.el6-148fccfd5985c5590cc601123c6c16e966b85d14
2 Nodes configured, 2 expected votes
1 Resources configured.
============

Online: [ ip-10-10-9-111 ip-10-10-8-122 ]

iptables (lsb:iptables): Started ip-10-10-9-111

○フェイルオーバー時のRoute Tableの変更設定

ここからが、本番になります。
下記のような初期起動スクリプトを用意します。

# cat /etc/init.d/associate-nat
#!/bin/sh
#
# chkconfig: 2345 99 10
# description: Associate EIP

# Source Function Library
. /etc/init.d/functions

# System Variable
prog=${0##*/}
lock=/var/lock/subsys/$prog

# User Variavle
ROUTE_TABLE_ID=rtb-xxxxxxxx
DESTINATION_CIDR=0.0.0.0/0

# Source Config
if [ -f /etc/sysconfig/$prog ] ; then
. /etc/sysconfig/$prog
fi

#
case "$1" in
start)
touch $lock
AZ=`curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone`
REGION=`echo $AZ | cut -c 1-$((${#AZ} - 1))`
INSTANCE_ID=`curl -s http://169.254.169.254/latest/meta-data/instance-id`
aws --region $REGION ec2 replace-route
--destination-cidr-block $DESTINATION_CIDR
--route-table-id $ROUTE_TABLE_ID
--instance-id $INSTANCE_ID
| logger -s -i -t $prog
exit ${PIPESTATUS[0]}
;;
stop)
rm -f $lock
exit 0
;;
status)
if [ -f $lock ] ; then
exit 0
else
exit 3
fi
;;
*)
echo "Usage: $0 {start|stop|status}"
exit 1
esac

作成したスクリプトに実行権限を与えます。

# chmod 755 /etc/init.d/associate-nat

さらに、Route Table IDも設定します。

># cat /etc/sysconfig/associate-nat
ROUTE_TABLE_ID=rtb-yyyyyyyy

そして、実行するとRoute Tableで指定しているNATインスタンスが自分自身のインスタンスIDに変更されます。

# service associate-nat start
associate-nat[9971]: {
associate-nat[9971]: "return": "true",
associate-nat[9971]: "requestId": "e9220a00-e8c0-4c20-b42a-f3e5af3d9dc7"
associate-nat[9971]: }

これをPacemakerに設定します。

# crm configure primitive associate-nat lsb:associate-nat
# crm configure group ha-nat iptables associate-nat

次のようになっていれば、問題ありません。

# crm_mon
============
Last updated: Mon Jan 28 20:26:37 2013
Last change: Mon Jan 28 20:26:17 2013 via cibadmin on ip-10-10-9-111
Stack: openais
Current DC: ip-10-10-8-122 - partition with quorum
Version: 1.1.7-6.el6-148fccfd5985c5590cc601123c6c16e966b85d14
2 Nodes configured, 2 expected votes
2 Resources configured.
============

Online: [ ip-10-10-9-111 ip-10-10-8-122 ]

Resource Group: ha-nat
iptables (lsb:iptables): Started ip-10-10-9-111
associate-nat (lsb:associate-nat): Started ip-10-10-9-111

一方のEC2のiptablesを停止してみます。

# service iptables stop

そうすると、下記のようにフェイルオーバーされます。

# crm_mon
============
Last updated: Mon Jan 28 20:54:28 2013
Last change: Mon Jan 28 20:26:17 2013 via cibadmin on ip-10-10-9-111
Stack: openais
Current DC: ip-10-10-8-122 - partition with quorum
Version: 1.1.7-6.el6-148fccfd5985c5590cc601123c6c16e966b85d14
2 Nodes configured, 2 expected votes
2 Resources configured.
============

Online: [ ip-10-10-9-111 ip-10-10-8-122 ]

Resource Group: ha-nat
iptables (lsb:iptables): Started ip-10-10-8-122
associate-nat (lsb:associate-nat): Started ip-10-10-8-122

Failed actions:
iptables_monitor_5000 (node=ip-10-10-9-111, call=5, rc=7, status=complete): not running

そして、Route Tableもassociate-natが実行された(スタンバイ)EC2のインスタンスIDに変更されます。

フェイルバックするためには、一旦、障害を起こしたEC2のFailed Actionをクリアします。

# crm resource cleanup ha-nat ip-10-10-9-111
Cleaning up iptables on ip-10-10-9-111
Cleaning up associate-nat on ip-10-10-9-111
Waiting for 3 replies from the CRMd... OK

次のようにFailed Actionが消えていれば、問題ありません。

# crm_mon
============
Last updated: Mon Jan 28 21:04:02 2013
Last change: Mon Jan 28 21:04:02 2013 via crmd on ip-10-10-9-111
Stack: openais
Current DC: ip-10-10-8-122 - partition with quorum
Version: 1.1.7-6.el6-148fccfd5985c5590cc601123c6c16e966b85d14
2 Nodes configured, 2 expected votes
2 Resources configured.
============

Online: [ ip-10-10-9-111 ip-10-10-8-122 ]

Resource Group: ha-nat
iptables (lsb:iptables): Started ip-10-10-8-122
associate-nat (lsb:associate-nat): Started ip-10-10-8-122

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