AWSでもフェンシング

これまでにVirutalbox、VMWareでのフェンシングの設定方法を紹介しました。AWSでもフェンシングを評価を行いましたので手順を紹介します。

1.AWSでのフェンシングの概要

AWSには サービスを管理するためツールがあり、名前も’aws’コマンドです。LinuxのコマンドラインからAWSの設定を変更したり、インスタンスを操作することができます。

Pacemakerのフェンシングもこのawsコマンドの仕組みを利用しており、内部的にはpython3-boto3というAWS SDK を介してAWSを操作します。AWSでフェンシングを利用する場合はIAMの設定とawsコマンドのインストール、python3-boto3のインストールが必要になります。

2.fence_awsの動作確認

今回もAWS内に準備したインスタンス名はnode1、node2としました。OSはRHEL8.4を使っていて、PacemakerのダウンロードのためにLINBIT HAのデモライセンスを利用しています。デモライセンスの申請は「作っておぼえるHAシステム」の中で申請リンクを紹介しています。こちらを参照ください。

PacemakerとCorosyncをインストールしたら、フェンシングエージェントfence-agents-awsを追加インストールします。このパッケージはpython3-boto3を必要としますが、python3-boto3は標準のレポジトリに存在しないため、EPELレポジトリをインストールしておく必要があります。EPELレポジトリの準備ができたら、yumコマンドでfence-agents-awsをインストールします。

root@node1 ~]# yum install fence-agents-aws
依存関係が解決しました。
=======================================
 パッケージ                            
=======================================
インストール:
 fence-agents-aws...
.....
.....
インストール済み:
  fence-agents-aws-4.7.0.linbit-15.0.el8.noarch..
.....
.....

完了しました!

インストールが終わったらfence_awsが単独で動作するか試してみましょう。

ここで必要になるのはIAMの設定で得られるアクセスキーとシークレットキーです。それらを引数にして次のように実行すると、実行中のVPCに登録されているインスタンスのIDが表示されます。

[root@node1 ~]# fence_aws  --access-key={アクセスキー} --secret-key={シークレットキー} --region=ap-northeast-1 -o list 
i-09a650e9783fdd8b3,
i-05a7f17faf013cde3,
i-0d950d5a908570112,
i-008743393dc8ea78c,
i-0d6723c0f95a95ec0,
......

–regionにはVPCのリージョン名を指定します。東京リージョンの場合はap-northease-1になります。

次に実行中のインスタンスの状態を確認してみます。AWSの管理画面のEC2インスタンスから実行中のインスタンスIDを調べます。

[root@node1 ~]# fence_aws  --access-key={アクセスキー} --secret-key={シークレットキー}  --region=ap-northeast-1 \
      -n i-008743393dc8ea78c -o status
Status: ON

Status:ONと表示されているのでインスタンスは稼働中と判ります。

-o statusの代わりに-o rebootにするとインスタンスの再起動ができます。

3.Pacemakerの設定

fence_vboxと同様の設定になります。動作確認のためにDummyリソースエージェントを使ったtestというリソースを定義します。Pacemakerの定義は次のようになります。

node 1: node1
node 2: node2
primitive test Dummy \
	op start interval=0s timeout=30s \
	op monitor interval=10s timeout=60s \
	op stop interval=0s timeout=30s
property cib-bootstrap-options: \
	stonith-enabled=false \
	have-watchdog=false \
	dc-version=2.0.5.linbit-1.0.el8-ba59be712 \
	cluster-infrastructure=corosync \
	cluster-name=cluster2 \
	last-lrm-refresh=1616579453

stonith-enabledをfalseにしてフェンシングを無効にしておきます。

crm_monコマンドで動作を確認します。

[root@node2 ~]# crm_mon -frAD
Cluster Summary:
  * Stack: corosync
  * Current DC: node1 (version 2.0.5.linbit-1.0.el8-ba59be712) - partition with quorum
  * Last updated: Tue Mar 30 14:26:25 2021
  * Last change:  Tue Mar 30 10:21:56 2021 by root via cibadmin on node1
  * 2 nodes configured
  * 1 resource instance configured

Node List:
  * Online: [ node1 node2 ]

Full List of Resources:
  * test	(ocf::heartbeat:Dummy):	 Started node1

Migration Summary:

リソースtestがnode1とnode2でアクティブ・スタンバイなリソースとして動きます。もしnode1が障害で停止すると、node2でリソースtestが動き始めます。

次にfence_awsのリソースを定義します。

primitive awsfence  stonith:fence_aws \
	params pcmk_host_map="node1:i-008743393dc8ea78c;node2:i-0d6723c0f95a95ec0" pcmk_reboot_retries=4 pcmk_reboot_timeout=480 power_timeout=240 region=ap-northeast-1 \
	op monitor interval=60s

フェンシングの設定が終わると次のようになります。

[root@node2 ~]# crm_mon -frAD
Cluster Summary:
  * Stack: corosync
  * Current DC: node2 (version 2.0.5.linbit-1.0.el8-ba59be712) - partition with quorum
  * Last updated: Wed Sep 29 10:37:55 2021
  * Last change:  Wed Sep 29 09:44:43 2021 by root via crm_resource on node1
  * 2 nodes configured
  * 2 resource instances configured

Node List:
  * Online: [ node1 node2 ]

Full List of Resources:
  * test	(ocf::heartbeat:Dummy):	 Started node1
  * awsfence	(stonith:fence_aws):	 Started node2

Migration Summary:

4.動作確認

動作確認の方法はVirtualboxでの実行例の記事と同じです。

node1でtestリソースの停止に失敗するとフェンシングが実行されて、node2のawsfenceがnode1に対してシステムリブートを実行します。