Linuxジャパンのスタッフが技術&学習内容などを書いていきます。

AWS HeartbeatによるプライベートIPの付け替え

logo (1)

AWS上でHeartbeatを用いたプライベートIPアドレスの付け替え方法をご紹介します。

AWSのAPIを利用して2つのENI間で、1つのセカンダリーIPアドレスを移動します。

2つのEC2インスタンスにそれぞれHeartbeatをインストールしクラスタ化を行います。

今回はPacemakerでリソース管理します。

以下の2台構成を想定しています。

インスタンス1
ホスト名:Host1
プライマリーIPアドレス:192.168.1.101
セカンダリーVIPアドレス:192.168.1.100(付け替え用)
インスタンス2
ホスト名:Host2
プライマリーIPアドレス:192.168.1.102
セカンダリーVIPアドレス:192.168.1.100(付け替え用)

公式ドキュメントにそってEC2-API-Toolsをインストールします。

まずはPacemakerにリソース管理してもらうためLSBに準拠した起動スクリプトを/etc/init.d/eniとして配置します。

#!/bin/sh
#
# Manage ENI
#
# chkconfig: 2345 99 10
#
# description: Manage ENI
#
#

prog=eip
lock=/var/lock/subsys/${prog}
result=0

case "${1}" in
    start)
        echo "${0}: Start managing ENI."
        /path/to/script/assign_vip.sh start
        result=${?}
        touch ${lock}
        exit ${result}
        ;;
    stop)
        echo "${0}: End managing ENI."
        /path/to/script/assign_vip.sh stop
        result=${?}
        rm -f ${lock}
        exit ${result}
        ;;
    status)
        if [ -f ${lock}  ]; then
            echo "VIP is assigned."
            exit 0
        else
            echo "VIP is not assigned."
            exit 3
        fi
        ;;
    *)
        echo "Usage: ${0} {start|stop|status}" >&2
        exit 1
        ;;
esac

実際にセカンダリーIPアドレスの付け替えを行うのが以下のスクリプトです。
Host1とHost2それぞれのeth0:0に、VIPのアサイン/アンアサインを通じてセカンダリーIPアドレスを付け替えます。
/etc/init.d/eniから呼び出されAPIを発行します。

#!/bin/sh
#
# Manage VIP
#

ip_addr=`ifconfig eth0 | grep 'inet addr:' | \
         sed -e 's/^.*inet addr://' -e 's/ Bcast:.*//'`
eni_id=`ec2-describe-instances --filter "network-interface.addresses.private-ip-address=${ip_addr}" | \
        grep NIC | awk '{print $2}`'
vip_addr="192.168.100.100"
detache_nic="ip addr del 192.168.100.100/24 dev eth0:0"
atache_nic="ifconfig eth0:0 192.168.100.100 broadcast 192.168.100.255 netmask 255.255.255.0"
result=0

start() {
    ec2-assign-private-ip-addresses --network-interface ${eni_id} \
                                    --secondary-private-ip-address ${vip_addr} \
                                    --allow-reassignment
    result=${?}
    if [ ${result} -ne 0  ]; then
        echo "$0: ERROR: Can't assign VIP. Exiting."
        exit ${result}
    fi

    ${atache_nic}

    return ${result}
}

stop() {
    ec2-unassign-private-ip-addresses --network-interface ${eni_id} \
                                      --secondary-private-ip-address ${vip_addr}
    result=${?}
    if [ ${result} -ne 0 ]; then
        echo "$0: WARN: Couldn't unassign VIP. Go on processing."
    fi

        ${detache_nic}

        return ${result}
}

case "${1}" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    *)
        ;;
esac

exit ${result}

スクリプト配置後、以下のコマンドにてPacemakerの設定をします。

HostAとHostB両方のHeartbeatを立ち上げた状態で行ってください。

# crm configure primitive eni lsb:eni

以上、簡単ですがAWSでHeartbeatによるプライベートIPの付け替えでした。

関連記事

コメントは利用できません。

代表者の著書&連載雑誌

ページ上部へ戻る