押してみよう ! 体で感じるリージョンフェイルオーバー
~ Big Red Button を作ってみた話
Author : 河角 修、深森 広英
builders.flash 読者の皆様、こんにちは!
どれだけ経ってもゴルフの前日はやっぱり眠れない、ソリューションアーキテクトの河角です。
普段は金融のお客様を担当させていただいており、先月 9 月に AWS 金融シンポジウムを日本で初めて開催し数多くのセッションと展示を行わせていただきました。この記事では、その金融シンポジウムで展示をしていたマルチリージョン切り替えデモの作成手順を解説したいと思います。
このデモは、来場者様向けの体験型のデモとして、ブースに設置された大きなボタンを押すと銀行アプリケーションが東京リージョンから大阪リージョンに数分で自動で切り替わるという内容になっています。6 月に行われた AWS Summit Japan でも出展しており、こちらの記事 でも「金融業務を支えるプラットフォーム ~最新事例~」として紹介しております。
まずは、デモの様子を動画でご覧ください。
※音声はVOICEBOX:ずんだもんを使用しています。
ソリューションの全容
まず、このデモの全容をご紹介します。
今回デプロイする銀行アプリケーションは、銀行の勘定系システムを想定したサンプルアプリケーションでして、マルチリージョンで構成されており、片方のリージョンで障害が起きた際にリージョン切り替えボタンを押すことで AWS Step Functions を起動し素早く切り替えを実現するというシナリオになっています。
勘定系サンプルアプリケーションの詳細
デプロイするアプリケーションは、預金や為替、融資などの各種業務を取り扱う、いわゆる銀行の勘定系システムを想定して、その一部をマイクロサービスとして実装されており、マルチリージョン構成を採用しています。
- マルチリージョン構成
通常、東京リージョンを Primary として稼働させているウォーム・スタンバイ構成を採用しています。 - アプリケーションのコンピューティング環境
Amazon ECS を用いてコンテナアプリケーションとして稼働させています。 - データベース構成
顧客データを Amazon Aurora の Global Database によってリージョン間の非同期レプリケーションを実現しています。
Amazon DynamoDB にステート管理用テーブルを置いており、今どちらのリージョンでリクエストを受け付けるかの状態をアイテムとして保存しています。 - リージョン切り替え
プライマリリージョンからセカンダリリージョンへの切り替えは、 Amazon Route 53 Application Recovery Contoller (Amazon Application Recovery Controller) による切り替えを行います。
リージョン切り替えが DNS に依存するため、オンプレミス側からの通信は Route 53 の名前解決を利用した実装となっています。
データの整合性を考慮したアプリケーション閉塞、Aurora Global Database の切り替えなど一連の切り替え手順を AWS Step Functions で自動化することにより約 5 分もしくはそれ以下の RTO を実現します。
東京リージョンから大阪リージョンへの切り替えに用いる Step Functions のステートマシンは切り替えを確実に実行できるよう障害による影響を受けていない大阪リージョンで実行します。 - 監視
アプリケーションの正常性を監視するために、大阪リージョンの Amazon CloudWatch Synthetics Canary から東京リージョンに対して疑似トランザクションを発生させ、その応答を確認することで外形監視を行っています。
詳しい説明は こちら をご参照ください。
リージョン切り替えボタンと切り替え機構について
物理デバイスとして、 Raspberry Pi (ラズパイ) 、ボタン、LCD (液晶ディスプレイ)、スピーカーを用意しています。ラズパイに接続した物理ボタンを押すと、切り替え用の Step Functions ステートマシンを起動する python が実行されます。そこで LCD に切り替えが開始された旨表示され、スピーカーから音声が流れる仕組みになっています。
このボタンを作った背景として、迅速に切り替えが実現できるという他に、本当にボタンを押せますか ? という問題提起もあります。
実際の運用現場においてこのような物理ボタンによるリージョン切り替えを実装されているケースは少ないかと思います。しかしながら、物理ボタンではないにせよ緊急時にはどなたかが判断を下し、フェイルオーバーを実行することになるかと思います。差し迫ったような場面で躊躇なく指示を出せるでしょうか ? 運用開始してから一度も押されたことのないボタンを押すことができるでしょうか ?
デモ展示では本当に押していいの ? というお客様の声が多く挙がりました。1 分 1 秒を争う場面では、障害復旧までの時間短縮のため極力人の介在を減らすことが重要で、某キャラクター👺から「判断が遅い !」と言われないよう懸念材料は定常運用時になるべく取り除いておく必要があります。また、要件次第ではアラートが上がれば即座に自動的に切り替えを行う構成にすることでより迅速な対応が可能になります。
障害が起きなければ、このようなボタンを押すことも判断を下す必要もないかもしれません。こうしたボタンを押すことがないのが一番ですが、障害は必ず起こり得ます。そうした状況に万一遭遇しても実行できるよう、普段の運用の中で訓練やカオスエンジニアリングなどを継続して行い準備を整えておくことが重要です。
こうした非日常を体感いただくためにも、このボタンの開発を行いました。
物理工作
ここでは、今回の目玉となる物理工作の解説を行います。流れとしては以下のとおりです。
- Raspberry Pi のセットアップ
- 物理デバイスの配線
- 物理ボタン
- LCD
- USB スピーカー
- リージョン切り替え実行スクリプトの作成
- daemon 登録
用意するもの
- Raspberry Pi 4
- SD カード
- WiFiネットワーク(主に AWS 環境へのアクセスに用います。有線 LAN でも構いません。)
- 物理ボタン
- LCD + I2C インターフェイス
- USBスピーカー
物理デバイスの接続情報
物理デバイスの設定を行います。 Raspberry Pi の GPIO と ボタン、LCD の関係は以下のようになってます。
用途 | NAME | PinNo | PinNo | NAME | 用途 |
3V3 | 1 | 2 | 5V | LCD 電源 | |
LCD SDA | GPIO2 | 3 | 4 | 5V | |
LCD SCL | GPIO3 | 5 | 6 | GND | |
GPIO4 | 7 | 8 | GPIO14 | ||
LCD GND | GND | 9 | 10 | GPIO15 | |
GPIO17 | 11 | 12 | GPIO18 | ||
GPIO27 | 13 | 14 | GND | ||
GPIO22 | 15 | 16 | GPIO23 | ||
3V3 | 17 | 18 | GPIO24 | ||
GPIO10 | 19 | 20 | GND | ||
GPIO9 | 21 | 22 | GPIO25 | ||
GPIO11 | 23 | 24 | GPIO8 | ||
GND | 25 | 26 | GPIO7 | ||
GPIO0 | 27 | 28 | GPIO1 | ||
GPIO5 | 29 | 30 | GND | ||
GPIO6 | 31 | 32 | GPIO12 | ボタン | |
GPIO13 | 33 | 34 | GND | ボタン接地 | |
GPIO19 | 35 | 36 | GPIO16 | ||
GPIO26 | 37 | 38 | GPIO20 | ||
GND | 39 | 40 | GPIO21 |
Raspberry Pi の設定
まずはRaspberry Pi OS をセットアップします。
セットアップ方法については Raspberry Pi 公式ページ「Getting Started」を参照してください。
なお本手順では各種 python ライブラリのインストールは省略しています。ご自身の環境に合わせて pip などを利用してインストールをお願いします。
無事 OS がインストールでき、起動できましたら I2C 通信のセットアップを行います。
I2C とは、ラズパイと各種物理デバイスとの通信をするための規格の一種です。本来 LCD を操作する際、各 bit に対して信号を送る必要があるため 16 本のピン配線が必要となりますが、I2C を用いることで 4 本の配線で済むのです。ざっくりな解説ですが、ここでは詳細な説明は割愛させていただきます。(説明を放棄したわけではありませんよ。。えぇ。。)
スタートメニューから、「設定」→「Raspberry Pi の設定」をクリックします。
クリックすると拡大します
設定ツールが起動するので、上部タブから「インターフェイス」を選択し、I2C のスイッチをクリックして有効化します。
クリックすると拡大します
「OK」をクリックして完了です。
ボタン接続
まずは接続したボタンが正しく動くか見ていきたいと思います。gpiozero ライブラリ の Button クラス を用います。
以下は単純にボタンを押すと Pressed と表示させる python スクリプトです。
from gpiozero import Button
from signal import pause
# GPIOピン番号を指定してButtonオブジェクトを作成
button = Button(12)
# ボタンが押されたときの処理を定義
def button_pressed():
print("Pressed")
# ボタンが押されたときのイベントハンドラを登録
button.when_pressed = button_pressed
# プログラムを実行し続ける
pause()
きちんと出力されたでしょうか。
$ python testbutton.py
Pressed
LCD 接続
続いて、LCD にメッセージを出力させましょう。RPLCD ライブラリの CharLCD クラス を用います。
なお使用している LCD は16 文字 * 2 行のためそれに収まる範囲であれば出力可能です。眩しいので最後は LCD のバックライトをオフにしています。
from RPLCD.i2c import CharLCD
from time import sleep
# LCDの初期化
lcd = CharLCD('PCF8574', 0x27)
# LCDにメッセージを表示
lcd.write_string('I Love Golf')
sleep(3)
# LCD Off
lcd.clear()
lcd.backlight_enabled = False
いいですね。煌々としています。
音声再生
続いてスピーカーのサウンドテストを行います。playsound ライブラリ を用います。
ラズパイにはデフォルトでテスト用音声ファイルがありますので、それを鳴らしてみます。
以下のスクリプトを実行し、「Front Center」と音声が再生できれば問題なく接続できています。
from playsound import playsound
playsound("/usr/share/sounds/alsa/Front_Center.wav")
切り替えスクリプト
さて、これまでセットアップしてきたボタン・LCD・スピーカーを組み合わせて、「環境構築」でデプロイしたリージョン切り替え用 Step Functions を起動するスクリプトを作成します。
まず、OS の環境変数として利用する AWS の認証情報を設定します。
export AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE
export AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
仕様は以下のとおりです。
- ボタンを 2 秒間押し続けると起動する
- ボタンが押されると
- “started” とプロンプト表示される
- 事前に配置しておいた音声ファイルを再生する
- LCD にメッセージを表示する
- Ctrl+C を押すと "Program stopped by user" とプロンプト表示され、停止する
#!/usr/bin/env python3
import os
import boto3
from playsound import playsound
from gpiozero import Button
from signal import pause
from RPLCD.i2c import CharLCD
from time import sleep
# AWS認証情報の設定
aws_access_key_id = os.environ['AWS_ACCESS_KEY_ID']
aws_secret_access_key = os.environ['AWS_SECRET_ACCESS_KEY']
# Step Functionsの設定
state_machine_arn = 'arn:aws:states:ap-northeast-3:xxxxxxxxxxxx:stateMachine:FailoverStateMachineExample'
# ステートマシンのARNは大阪リージョンの Step Functions にて”FailoverStateMachine”で始まるステートマシンを見つけてその ARN を使用してください。
# LCDの設定
lcd = CharLCD('PCF8574', 0x27)
# ボタンの設定
button = Button(12, hold_time=2)
# フラグの初期化
button_pressed_flag = False
# ボタンが押されたときの処理
def button_pressed():
global button_pressed_flag
if not button_pressed_flag:
button_pressed_flag = True
# Step Functionsを起動
sfn_client = boto3.client(
'stepfunctions',
aws_access_key_id=aws_access_key_id,
aws_secret_access_key=aws_secret_access_key,
region_name='ap-northeast-3'
)
response = sfn_client.start_execution(
stateMachineArn=state_machine_arn
)
print("started")
# サウンドを再生
playsound("/home/example/Desktop/sound/Failover_Sound.wav")
# LCDにメッセージを表示
lcd.clear()
lcd.write_string('Failover')
lcd.cursor_pos = (1, 0) # 2行目の先頭に移動
lcd.write_string('Tokyo to Osaka')
# フラグをFalseに戻す
button_pressed_flag = False
# メイン関数
def main():
button.when_held = button_pressed
pause()
# LCDを初期化
lcd.clear()
lcd.write_string('Initializing...')
lcd.backlight_enabled = False
try:
#mainを実行
main()
except KeyboardInterrupt:
# 例外処理(Ctrl+C)
print("Program stopped by user")
# LCDを初期化
lcd.clear()
lcd.write_string('Initializing...')
lcd.backlight_enabled = False
pass
daemon 登録
あとはこのスクリプトを常時実行するため、systemd による daemon 化を行います。
/etc/systemd/system/ にユニットファイルを作成します。
$ ls -l /etc/systemd/system/failover.service
-rw-r--r-- 1 root root 305 8月 28 17:41 /etc/systemd/system/failover.service
[Unit]
Description = FailOver
[Service]
ExecStart = /home/example/pushbutton_regionswtich_failover.py
Restart = no
Type = simple
EnvironmentFile = /home/example/environment
[Install]
WantedBy = multi-user.target
後述しますが、これだけだと正しく音が再生されませんでしたので後ほど対応をします。
また、daemon の取得する環境変数を指定するため、別途 AWS の認証情報を環境変数ファイルとして渡しています。
さて、daemon を登録し systemctl start failover.service を実行すると、ボタンを押したところ関数は実行されるし LCD に文字が表示されるものの、音が再生されません。
ログを確認するとどうやら以下のようなエラーが表示されています。
8月 28 17:21:10 raspberrypi pushbutton_regionswtich_failover.py[7502]: AL lib: (EE) ALCplaybackAlsa_open: Could not open playback device 'default': Unknown error 524
これは Linux のオーディオ管理コンポーネントである ALSA の仕様で、Default だと異なるオーディオデバイスが指定されているため、そんなデバイスはないよと怒られております。
aplay -l コマンドで確認すると、いくつかオーディオ用デバイスが存在していることがわかります。今回使う USB デバイスはカード 3 に登録されています。
$ aplay -l
**** ハードウェアデバイス PLAYBACK のリスト ****
カード 0: vc4hdmi0 [vc4-hdmi-0], デバイス 0: MAI PCM i2s-hifi-0 [MAI PCM i2s-hifi-0]
サブデバイス: 1/1
サブデバイス #0: subdevice #0
カード 1: vc4hdmi1 [vc4-hdmi-1], デバイス 0: MAI PCM i2s-hifi-0 [MAI PCM i2s-hifi-0]
サブデバイス: 1/1
サブデバイス #0: subdevice #0
カード 2: Headphones [bcm2835 Headphones], デバイス 0: bcm2835 Headphones [bcm2835 Headphones]
サブデバイス: 8/8
サブデバイス #0: subdevice #0
サブデバイス #1: subdevice #1
サブデバイス #2: subdevice #2
サブデバイス #3: subdevice #3
サブデバイス #4: subdevice #4
サブデバイス #5: subdevice #5
サブデバイス #6: subdevice #6
サブデバイス #7: subdevice #7
カード 3: UACDemoV10 [UACDemoV1.0], デバイス 0: USB Audio [USB Audio]
サブデバイス: 1/1
サブデバイス #0: subdevice #0
つぎに、ALSA の設定ファイル/usr/share/alsa/alsa.conf を確認すると、デフォルトのカード 0 が指定されています。先ほどの結果だとカード 0 は HDMI となるため、ここをカード 3 に指定してあげるとで、デフォルトで USB スピーカーを使わせることができます。
変更前
defaults.ctl.card 0 #録音用デバイス
defaults.pcm.card 0 #再生用デバイス
変更後
defaults.ctl.card 3 #録音用デバイス
defaults.pcm.card 3 #再生用デバイス
そうすると無事ボタン押下時に音声が再生できました。
ボタンの増設
金融シンポジウムではもう一つボタンを設置し、大阪リージョンから東京リージョンへの切り戻しも実装しました。2個目のボタンは1個目とは異なる GPIO ピンに接続し、もう一つスクリプトを用意することで実装ができます。ほぼ同じ手順を踏むのでここでは説明を割愛しますが、GPIO ピンの数だけボタンを増設することができます。
環境構築
続いて、実際の勘定系ワークロードサンプルアプリケーションを AWS 環境上に作っていきます。全体の流れは以下の通りです。
- 導入の前提条件セットアップ
- 勘定系ワークロードサンプルコードのデプロイ
- マルチリージョンマイクロサービスアプリのデプロイ
前提
前提条件となる AWS CDK のセットアップを行います。私は自身のローカル PC (Mac) でセットアップを行いました。詳しいセットアップ方法は こちら をご参照ください。
私の環境では、セットアップ時の各ランタイムバージョンは以下のとおりでした。
% node --version
v20.16.0
% npm --version
10.8.1
% git --version
git version 2.39.3 (Apple Git-145)
% cdk --version
2.152.0 (build faa7d79)
また、マルチリージョンマイクロサービス・アプリケーションをデプロイする際、docker デーモンが起動している必要があります。もしインストールされていない場合はインストールし、docker デーモンを起動させておくようにしてください。
勘定系ワークロードサンプルコードのデプロイ
まずはマルチリージョン環境のデプロイから実施していきます。基本的な手順は こちらの GitHub に記載の通りなのですが、ガバナンスベースを導入していないためシングルサインオン (SSO) オプション (—profile ct-guest-sso) は不要です。また、シングルアカウントで実施するので手順と少し異なるためこちらに記載していきます。
1. 環境別の設定を指定する
このサンプルでは開発・検証・本番の 3 アカウントにデプロイする設定となっているため、一つのみ使用するよう設定します。
デプロイ時に環境を指定するため、デプロイしないアカウント (ここでは Development 以外の Staging, Production) についてはデフォルトのままで構いません。
// Parameter for Dev - Anonymous account & region
export const DevParameter: StackParameter = {
envName: 'Development',
account: '{アカウントID}',
notifyEmail: '{ご自身のメールアドレス}',
dbUser: 'dbadmin',
hostedZoneName: 'example.com',
primary: {
region: 'ap-northeast-1',
regionCidr: '10.100.0.0/16',
vpcCidr: '10.100.0.0/20',
tgwAsn: 64512,
},
secondary: {
region: 'ap-northeast-3',
regionCidr: '10.101.0.0/16',
vpcCidr: '10.101.0.0/20',
tgwAsn: 64513,
},
};
2. テスト用サンプルアプリケーションをデプロイ設定
勘定系ワークロードのサンプルコードでは、ECS コンテナ上で稼働するサンプルアプリケーションとして下記の 2 種類を提供します。
- amazon-ecs-sample として公開されている PHP ベースのアプリケーション
- マルチリージョン環境で動作するマイクロサービス・アプリケーション
実際に東京リージョン/大阪リージョンでフェイルオーバー可能な TypeScript で実装されたマイクロサービス・アプリケーション
デフォルトではいずれのアプリケーションも勘定系ワークロードのリソースと同時に AWS アカウント環境にはデプロイされません。
今回は 2 つ目のマルチリージョン環境で動作するマイクロサービス・アプリケーションをデプロイしますので、下記の設定ファイルを変更して下さい。
設定ファイル: /usecases/guest-core-banking-sample/bin/parameter.ts
//マルチリージョン マイクロサービス・アプリケーションの設定
export const SampleMultiRegionAppParameter = {
//デプロイする場合は true に指定
deploy: false,
//実行確認用のクライアントを配置するVPCのCIDR
appClientVpcCidr: '10.103.0.0/24',
};
3. 勘定系ワークロードをデプロイする
CDK Bootstrap を実行します。
cd usecases/guest-core-banking-sample
npx cdk bootstrap --profile
サンプルコードをデプロイします。勘定系ワークロードの CDK サンプルコードは 2 つのスタックから構成されていて、順に実行されます。今回は Development 環境なので、*Dev で環境を指定します。
npx cdk deploy "*Dev" --require-approval never
2 つ目のスタックである BLEAFSI-CoreBanking-secondary-Dev の実行が完了しますと、Output として下記の 3 つの CLI コマンドが表示されますので、順に実行していきます。
Outputs:
BLEAFSI-CoreBanking-secondary-Dev.CLIforTGWpeeringacceptance = aws ec2 accept-transit-gateway-peering-attachment --region ap-northeast-1 --transit-gateway-attachment-id tgw-attach-008xxxx
BLEAFSI-CoreBanking-secondary-Dev.CLIforaddingTGWrouteinprimaryregion = aws ec2 create-transit-gateway-route --region ap-northeast-1 --destination-cidr-block 10.101.0.0/16 --transit-gateway-route-table-id tgw-rtb-069xxx --transit-gateway-attachment-id tgw-attach-008xxx
BLEAFSI-CoreBanking-secondary-Dev.CLIforaddingTGWrouteinsecondaryregion = aws ec2 create-transit-gateway-route --region ap-northeast-3 --destination-cidr-block 10.100.0.0/16 --transit-gateway-route-table-id tgw-rtb-094xxx --transit-gateway-attachment-id tgw-attach-008xxx
コンソールから CLI コマンドを実行して、主リージョンと副リージョンの TGW をピアリングするための TGW ピアリングの承認を実施します。
aws ec2 accept-transit-gateway-peering-attachment --region <主リージョン> --transit-gateway-attachment-id xx
アクセプトが有効になるには少し時間がかかりますので、2-3 分待ってから次のコマンドを入力して下さい。
コンソールから CLI コマンドを実行して、主リージョンの AWS Transit Gateway のルートテーブルに副リージョンへのルートを追加します。
aws ec2 create-transit-gateway-route --region <主リージョン> --destination-cidr-block <副リージョンのCIDR> --transit-gateway-route-table-id <主リージョンのTGWのルートテーブルのID> --transit-gateway-attachment-id <TGWのPeering AttachmentのID>
コンソールから CLI コマンドを実行して、副リージョンの Transit Gateway のルートテーブル に 主リージョンへのルートを追加します。
aws ec2 create-transit-gateway-route --region <副リージョン> --destination-cidr-block <副リージョンのCIDR> --transit-gateway-route-table-id <副リージョンのTGWのルートテーブルのID> --transit-gateway-attachment-id <TGWのPeering AttachmentのID>
以上で、勘定系ワークロードのデプロイは完了です。
マルチリージョンマイクロサービスデプロイ
概要
それではサンプルアプリケーションをデプロイしていきます。
アプリケーションは下記の 4 つのマイクロサービス (ECS コンテナ) から構成され、Saga パターンによる補償トランザクションの仕組みを実装することで、分散環境でのトランザクションの整合性を保持するように実装されています。
サービス名 | 機能 |
---|---|
transaction | トランザクション全体を制御するマイクロサービス |
balance | 口座データに対して引落し/預入れ処理を行うマイクロサービス |
count | 口座からの引落し処理の回数を管理するマイクロサービス |
worker | 仕掛かり中でペンディング状態となっているトランザクションを処理する常駐サービス |
基本的には同一のアプリケーションが東京リージョンと大阪リージョンにデプロイされますが、競合状態になることを割けるため、トランザクションワーカーは東京リージョンのみで稼働します。
詳細については こちら をご覧ください。
サンプルアプリケーションのデプロイ手順
基本的な手順は こちらのリンク に記載の通りです。ここでもシングルサインオン (SSO) オプション (—profile ct-guest-sso) は不要です。
また今回、デモ用として単純な Failover を実現するため、ここでは Locust 実行用の bastion host はデプロイしません。
1. ECS タスクの実行
primary stack のデプロイ完了後に表示される 下記情報を確認して下さい。
# | 表示名 | 用途 |
---|---|---|
1 | BLEAFSI-CoreBanking-primary-Dev.SampleAppClientInstanceBastionHostIdXxx | サンプルアプリが提供するクライアント実行用の bastion host のインスタンス ID |
2 | BLEAFSI-CoreBanking-primary-Dev.SampleMultiRegionAppBalanceMigrationCommandxxxx | Balance マイクロサービス初期化用の ECR タスクを実行するコマンド |
3 | BLEAFSI-CoreBanking-primary-Dev.SampleMultiRegionAppCountMigrationCommandxxxx | Count マイクロサービス初期化用の ECR タスクを実行するコマンド |
4 | BLEAFSI-CoreBanking-primary-XX.SampleMultiRegionAppParamTableNameXxx | デモアプリケーションが使用する DynamoDB のテーブル名 |
✅ BLEAFSI-CoreBanking-primary-Dev
Outputs:
BLEAFSI-CoreBanking-primary-Dev.SampleAppClientInstanceBastionHostIdXxx = i-0XXXX
BLEAFSI-CoreBanking-primary-Dev.SampleMultiRegionAppBalanceMigrationCommand6ADC0CF6 = aws ecs run-task ...
BLEAFSI-CoreBanking-primary-Dev.SampleMultiRegionAppCountMigrationCommand03F10102 = aws ecs run-task ...
BLEAFSI-CoreBanking-primary-Dev.SampleMultiRegionAppParamTableNameXxx = BLEAFSI-CoreBanking-xxxx
2. Amazon Aurora Database の作成
Aurora Postgres にアプリケーションが必要とするデータベースとテーブルを作成します。上記のスタック出力に表示されている AWS CLI コマンド 2 つを実行してください:
#2 BLEAFSI-CoreBanking-primary-Dev.SampleMultiRegionAppBalanceMigrationCommandxxx を実行
aws ecs run-task ...
#3 BLEAFSI-CoreBanking-primary-Dev.SampleMultiRegionAppCountMigrationCommand0xxx を実行
aws ecs run-task ...
これらのタスクは通常 1 分程度で完了します。各タスクの進行状況は、 ECS のマネジメントコンソールから確認できます。
3. Amazon DynamoDB のテーブル作成
次に、デモアプリケーションの稼働に必要な DynamoDB テーブルのレコードを作成します。このデータは東京リージョンで worker サービスを起動するために必要です。
#東京リージョン
aws dynamodb put-item --region ap-northeast-1 --table-name <TableName> --item '{ "PK": { "S": "stopFlag" }, "value": { "S": "false" } }'
#大阪リージョン
aws dynamodb put-item --region ap-northeast-3 --table-name <TableName> --item '{ "PK": { "S": "stopFlag" }, "value": { "S": "true" } }'
<TableName> には確認した 東京リージョンと大阪リージョンの DynamoDB のテーブル名に置き換えて下さい
ここまで出来たら環境の構築としては完了です !
AWS Step Functions による大阪リージョンへのフェイルオーバー
東京リージョンから大阪リージョンへアプリケーションをフェイルオーバーするには、大阪リージョンにデプロイされた Step Functions のステートマシンを実行します。
物理工作でラズパイに登録した切り替えスクリプトにこのステートマシンの ARN を記載すると、ボタンを押した際にフェイルオーバーが実行されます。
詳細はこちら をご覧ください。
まとめ
いかがだったでしょうか。マルチリージョンの切り替えが手軽に実現できるようになりました。
では、実際の運用現場で容易に切り替え実行ボタンを押せるでしょうか ? この自信をつけるには、普段から切り替えの訓練を行い、システムの全体像を理解することが重要です。そのためにも常日頃から障害を意識したシステム・組織・プロセス作りをしていきましょう。そのためのご支援も行っていますのでぜひご相談ください。
このアセットは将来的にはリージョン切り替え時の挙動が確認できるようなダッシュボードと連携させて、ボタン押下後からリージョン切り替えまでの一連の流れが可視化できるような拡張を行なっていく予定です。乞うご期待ください !
筆者プロフィール
河角 修
アマゾン ウェブ サービス ジャパン合同会社
ソリューションアーキテクト
SIer にてエンタープライズシステムにおけるコンテナプラットフォームの構築や運用を経験し、2023年に AWS Japan に入社。現在は金融機関のお客様を中心に技術支援を担当しています。
著書:『カオスエンジニアリング入門』
仕事の合間にパター練習をする、そんなゴルフ漬けの毎日を送っています。
深森 広英
アマゾン ウェブ サービス ジャパン合同会社
グローバルフィナンシャルサービス
シニアソリューションアーキテクト
2018年に入社し、ソリューションアーキテクトとして金融機関のお客様のクラウドジャーニーのお手伝いをしています。最近はとくにシステムのレジリエンス向上に関わることが多いです。趣味は2年前に始めたピアノ演奏で、バッハやショパンの易しい曲を弾いて日々の生活を潤しております。
AWS を無料でお試しいただけます