カオスエンジニアリングをゲーム形式で体感できるデバイスを開発してみた

2023-10-03
日常で楽しむクラウドテクノロジー

Author : 服部 一成

こんにちは。ソリューションアーキテクトの服部です。普段は製造業のお客様をご支援してます。

本記事では、AWS Summit 2023 内 builders.flash EXPO で「Chaos Kitty」というデモキットを出展したことに関連して (Chaos Engineering と可視化を体験できる Chaos Kitty のご紹介)、カオスエンジニアリングをご自宅でも楽しんでいただけるようにデバイスの作成手順をご紹介します。

Chaos Kitty はカオスエンジニアリングやセキュリティを学べるデモキットです。カオスエンジニアリングの原則は「カオスエンジニアリングの原則」をご覧ください。

Chaos Kitty とは、クラウド上に構築した分散システムの状態を可視化するために、IoT 電球と LTE ルーターと Raspberry Pi 4 を使ったデモキットです。

障害が挿入されるとクラウド上の Web 三層アーキテクチャの障害対象リソースを表現したレゴブロックの障害挿入箇所の IoT 電球の色が緑から赤に変更します。障害箇所を特定後、ゲームの参加者はクラウドのコンソールで障害を修正を行い、どれだけ早く修正できたかスピードを競います。

本家の Chaos Kitty は展示用に規模も大きく、展示会に出展した際でも IoT 電球との接続設定を簡略化できるよう LTE ルーターを使っていますが、今回はこの Chaos Kitty をご家庭でも楽しめるように IoT 電球や LTE ルータが不要なミニ版を作ってみたのでご紹介します。

ご注意

本記事で紹介する AWS サービスを起動する際には、料金がかかります。builders.flash メールメンバー特典の、クラウドレシピ向けクレジットコードプレゼントの入手をお勧めします。

*ハンズオン記事およびソースコードにおける免責事項 »

このクラウドレシピ (ハンズオン記事) を無料でお試しいただけます »

毎月提供されるクラウドレシピのアップデート情報とともに、クレジットコードを受け取ることができます。 


1. 本デモキットの動作の流れ

本デモの動作の流れは、次の通りです。

  1. 緑または赤のボタンを押す。しばらくすると LED のどこかが赤く変わります。
  2. クラウド側に障害が挿入されたので、 LED の配置をヒントに AWS コンソールで障害を修正していきます。
  3. リソースが正しく修正されると LED が緑色に戻ります。

デモの様子を動画でご覧ください。


2. 注意事項

Chaos Kitty はカオスエンジニアリングを学ぶために意図的にセキュリティ的に脆弱な設定を挿入します。Chaos Kitty を実行した際は、ゲームを終えるためにセキュリティ的に脆弱な設定を必ず修正してください。正しい設定は末尾 Appendix : Chaos Kitty の答え に掲載してます。


3. LED とスイッチの配置例

AWS Summit 2023 で展示した Chaos Kitty は Web 三層アーキテクチャをレゴブロックと IoT 電球で表現してました。今回のデバイスも LED とレゴブロックで AWS のリソースを表現してます。


4. 今回作成するデバイスと AWS 環境

クラウド環境とデバイスの関係は以下の図のとおりです。

タクトスイッチを押すと、デバイスから MQTT プロトコルで Publish します。クラウド上の Chaos Kitty リソースが変更されると、Amazon Event BridgeAWS LambdaAWS IoT Core を経由して MQTT プロトコルで Publish し、デバイスの LED を変更します。


5. 用意するもの

今回のデモでは以下を使用します。
 
  • Raspberry Pi 4 Model B
  • SD カード (今回 Raspberry Pi OS を利用してます)
  • WIFI ネットワーク
  • ブレッドボード : 2 個
  • 2 色 LED (緑、赤) : 8 個
  • タクトスイッチ : 3 個 (3 つの機能で使い分けるので、機能別に色が分かれていると使いやすいです)
  • ジャンパー線
  • 抵抗 : 11 個  (330Ω / LED 用 8 個、タクトスイッチ用 3 個)
  • (オプション) レゴ等の LED を支える土台

6. 物理デバイスの設定

物理デバイスの設定を行います。 Raspberry Pi の GPIO と LED ライト、タクトスイッチの関係は以下のようになってます。

用途 NAME PinNo PinNo NAME 用途
スイッチ側電源 3V3 1 2 5V  
  GPIO2 3 4 5V  
  GPIO3 5 6 GND スイッチ側接地
LED1Green GPIO4 7 8 GPIO14 LED8Green
  GND 9 10 GPIO15 LED8Red
LED2Green GPIO17 11 12 GPIO18 LED1Red
LED2Red GPIO27 13 14 GND  
LED3Red 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  
LED3Green GPIO5 29 30 GND  
LED5Green GPIO6 31 32 GPIO12 LED4Green
LED5Red GPIO13 33 34 GND  
LED6Green GPIO19 35 36 GPIO16 LED4Red
LED6Red GPIO26 37 38 GPIO20 LED7Green
LED側接地 GND 39 40 GPIO21 LED7Red

ブレッドボードに LED ライトとタクトスイッチを配線します。配線のサンプル図はこちらです。

各ボタンの役割は以下のようになっています。

  • 緑ボタン : Easy mode 実行
  • 赤ボタン : Hard mode 実行
  • 青ボタン : 自動修復実行

クリックすると拡大します


7. AWS CloudFormation の実行

クラウド環境の構築は Chaos Kitty WorkshopBuilding your own physical Chaos Kitty の手順に則って構築します。

環境構築まで 20 分ほどかかりますので、その間にデバイスの設定を行います。


8. Raspberry Pi の設定

デバイスの設定を行うため、まずは Raspberry Pi OS をセットアップします。セットアップ方法については Raspberry Pi 公式ページ「Getting Started」を参照してください。

8-1. Node-Red のインストール

Chaos Kitty では各 LED の色を MQTT Topic を Subscribe して変更します。クラウドから MQTT メッセージを Publsih し色を変更したり、ボタンの押下で MQTT メッセージを Publish するアプリケーションを作成するために、Node-Red をインストールします。インストール手順は こちら を参考に設定します。

AWS IoT Core を設定するパレットを追加するため、node-red-contrib-aws-iot を追加します。

cd ~/.node-red
npm install node-red-contrib-aws-iot
node-red-restart

8-2. AWS IoT Core にモノを登録

クラウドと接続を行うため、 AWS IoT Core を利用します。モノの名前を「rpi4」で登録します。利用するリージョンは Chaos Kitty Workshop でリソースを作成したリージョンをご利用ください。

ダウンロードした証明書とプライベートキーは、Raspberry Pi 上の /home/pi/aws/certs などに保存します。また、ルート CA 証明書もダウンロードして同様に Raspberry Pi に保存します。

クリックすると拡大します

8-3. フローの読み込み

Chaos Kitty ではクラウド側の状態を LED で表現するため、MQTT を利用します。 AWS IoT Core の認証情報と AWS IoT Core のエンドポイントを Node-Red に設定します。

Node-Red を Raspberry Pi から開いた場合は、 http://localhost:1880 へアクセスします。他のマシンからブラウジングする場合は http://<raspberypi-ip-address>:1880 からアクセス可能です。

サンプルフローを使って Node-Red にフローを作成します。フローは こちらのサンプル をご利用ください。


1. サンプルフロー (flows.json) を保存します。

2. Node-Red 左上のハンバーガーメニューを開き、読み込みからサンプルフローファイルをロードします。

クリックすると拡大します

LEDControl 、Button 、Success の 3 つのタブが作成されます。 

8-4. Node-Red に AWS IoT Core のエンドポイントと認証情報を追加

1. Node-Red のパレットの aws-iot-in から Server を開き、 Server 横の🖊️をクリックしてaws-iot-broker ノードを編集します。Connection タブから AWS IoT Core の接続先を設定します。

各アカウントのデバイスデータエンドポイントは AWS IoT Core コンソールの [Settings] (設定) ページで確認できます。

Server <AWS IoT Core のデバイスデータエンドポイント>
Port 8883
Client ID rpi4
Keep Alive Time 60

クリックすると拡大します

2. Node-Red のパレットの aws-iot-broker の Security を開き、flows.json に記載された値から Raspberry Pi 上に保存した AWS IoT Core の証明書とプライベートキーとルートCA 証明書のパスへ変更します。

Key Path < プライベートキーまでの Path>
Cert Path < デバイス証明書までの Path >
CA Path < ルート CA 証明書までの Path>

クリックすると拡大します

3. Bulb と呼ばれる LED ライトと AWS リソースの関係を下記に掲載します。

LEDNo AWS BulbNo
1 Amazon S3 38
2 AWS CloudTrail 32
3 Amazon EC2 Security Group 33
4 Elastic Load Balancing Security Group 31
5 Amazon EC2 IAM Role 2 35
6 Amazon EC2 IAM Role 1 34
7 Amazon RDS IAM database authentication 37
8 Amazon RDS Security Group 36

8-5. AWS IoT Core のルールから AWS Lambda を起動する設定を追加

1. AWS コンソールにログインし、「AWS IoT Core」> 「メッセージのルーティング」> 「ルール」を開き、「ルールを作成」をクリックします。

クリックすると拡大します

2. ルール名に redButtonPressed を入力して、「次へ」をクリックします。

クリックすると拡大します

3. SQL ステートメントに SELECT * FROM 'rpi4/button/red' WHERE button_pressed_state=1 を入力して、「次へ」をクリックします。

クリックすると拡大します

4. ルールアクション 1 で「Lambda」、 Lambda 関数に「ExecuteRandomExperiments」を選択して「次に」をクリックし、確認画面で「作成」をクリックします。

クリックすると拡大します

5. 同様の手順で、以下のように設定します。

  • ルール名「greenButtonPressed」
    • SQL ステートメント : SELECT * FROM 'rpi4/button/green' WHERE button_pressed_state=1
    • Lambda 関数 : ExecuteRandomExperiment
  • ルール名「blueButtonPressed」
    • SQL ステートメント : SELECT * FROM 'rpi4/button/blue' WHERE button_pressed_state=1
    • Lambda 関数 : RemediationFunction

9. まとめ

AWS Summit Tokyo 2023 で展示した Chaos Kitty と比較して大幅にコンパクトで個人で楽しめるデバイスになりました。リソースの状態を物理的に可視化するという考え方は他のシステムにも応用できるので、この記事をきっかけに AWS や IoT の活用を読者の皆様にご検討いただけると幸いです。


Appendix : Chaos Kitty の答え

LEDNo AWS リソース 挿入される障害 修正方法
1 Amazon S3 パブリックアクセスのブロックがオフになる Bucket のパブリックアクセスのブロックをオンにする
2 AWS CloudTrail ログ記録がオフになる ログ記録をオンにする
3 Amazon EC2 Security Group セキュリティグループのインバウンド設定 SSH 0.0.0.0/0 が追加される セキュリティグループのインバウンド設定 SSH 0.0.0.0/0 を削除する
4 Elastic Load Balancing Security Group セキュリティグループのインバウンド設定 SSH 0.0.0.0/0 が追加される セキュリティグループのインバウンド設定 SSH 0.0.0.0/0 を削除する
5 Amazon EC2 IAM Role 2 アタッチされたロールが EC2UnSafeRoleXXX へ変更される アタッチされたロールを EC2SafeRoleXXX へ変更する
6 Amazon EC2 IAM Role 1 アタッチされたロールが EC2UnSafeRoleXXX へ変更される アタッチされたロールを EC2SafeRoleXXX へ変更する
7 Amazon RDS IAM database authentication RDS の認証設定がパスワードのみに変更される RDS の認証設定を IAM とパスワードの設定に変更する
8 Amazon RDS Security Group セキュリティグループのインバウンド設定 SSH 0.0.0.0/0 が追加される セキュリティグループのインバウンド設定 SSH 0.0.0.0/0 を削除する

builders.flash メールメンバーへ登録することで
AWS のベストプラクティスを毎月無料でお試しいただけます

筆者プロフィール

服部 一成
アマゾン ウェブ サービス ジャパン合同会社 ソリューションアーキテクト

化学系のお客様を中心として、 AWS の利用をご支援してます。ビールを飲むこととポケモンのゲームが好き。

AWS を無料でお試しいただけます

AWS 無料利用枠の詳細はこちら ≫
5 ステップでアカウント作成できます
無料サインアップ ≫
ご不明な点がおありですか?
日本担当チームへ相談する